Save 37% off PRO during our Black Friday Sale! »

WLS2:Ubuntu上での AWS Step Functions(Python)開発環境の構築

WLS2:Ubuntu上での AWS Step Functions(Python)開発環境の構築

社内技術講習用の資料作成を兼ねてスキルの棚卸をしました。

4651f57d479e562a45dd624cc24dbee3?s=128

nsaito9628

May 16, 2021
Tweet

Transcript

  1. WLS2:Ubuntu上での AWS Step Functions Python開発環境の構築 @Saito5656 2021. 05. 16

  2. 本Hands Onのゴール Sample templateをトレースして AWS SAMを使ったLambdaとStep Functionsの 実装手順を習得する

  3. 実施内容 1.概要説明 2.WLS2 Python開発環境構築 3.AWS SAM によるLambdaの実装 ①HelloWorldFunction templateの実装 ②AWS

    explorerによるLambda Functionの実行 4.AWS SAM によるStep Functionsの実装 ①Step Functions templateの実装 ②template.yamlとstate machine ③State Machineのasl.json ④AWS explorerによるStep Functionsの実行
  4. 1.概要説明

  5. SAMのprefix/key構造とstate machine state machine flow chart 各関数の格納先 関数の集合 ③state machine:step定義するjson

    State machineの格納先 ② template.yaml:Resource/Outpu定義 ①Lambda関数:実行プログラム state machineによる実行定義 Lambda関数による実行定義 directory構造
  6. 2.WLS2 Python開発環境構築

  7. WSLのインストール WSLのインストール #「コントロールパネル」⇒「プログラムと機能」を開く #「Windowsの機能の有効化または無効化」をクリック #「Linux用Windowsサブシステム」にチェックを入れて「OK」をクリック # Windowsを再起動する 【参考】WSL2とは: https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html

  8. Ubuntuのインストール Ubuntuのインストール # Microsft Storeで「wsl」と検索 #「Ubuntu」を選択して「インストール」 # インストールが完了するとUbuntuが立上るので「UNIX username」「New password」を

    各自で任意に入力してユーザー初期設定する
  9. 仮想マシン有効化 有効化 #「コントロールパネル」⇒「プログラムと機能」を開く #「Windowsの機能の有効化または無効化」をクリック #「仮想マシン プラットフォーム」にチェックを入れて「OK」をクリック # Windowsを再起動する

  10. WSLのVERSIONを確認 #コマンドプロンプトより C:¥Users¥saito_2414>wsl -l -v NAME STATE VERSION Ubuntu Running

    1 VERSIONは1のはずなのでVERSION 2に変更 C:¥Users¥saito_2414>wsl --set-version Ubuntu 2 #「WSL 2を実行するには、カーネルコンポーネントの更新が必要です」が表示されたら、 https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel⇒「wsl_update_x64.msi」を ダウンロードして実行 VERSIONの確認 #コマンドプロンプトより C:¥Users¥saito_2414>wsl -l -v NAME STATE VERSION Ubuntu Running 2 UbuntuをWSL2用に変換 ←変らなかったら再起動してVERSION再確認
  11. 再度「wsl.exe --set-version Ubuntu 2」と入力して下記メッセージが出た場合 # または「 Windowsの機能の有効化または無効化」で「仮想マシンプラットフォーム」 が表示されない場合、BIOSの仮想化支援機能を有効化する BIOSで有効化する項目 intel

    CPU: VT-x VT-d AMD CPU: AMD-V(UEFI上ではSVM Mode、CPU Configurationにある) IOMMU(Advanced>AMD CBS>NBIO Common Options等、深い場所) 【参考】https://jp.finalfantasyxiv.com/lodestone/character/6584870/blog/4364798?order=2 仮想化支援機能の有効化が必要な場合
  12. WSL:Ubuntuのssh設定① sshのBASIC認証許可 # Ubuntuターミナルを起動 $ sudo nano /etc/ssh/sshd_config PasswordAuthentication yes

    #以下のスクリプトをWindowsで起動時実行するバッチファイルとして作成(下例はssh_bat.bat) wsl -d Ubuntu -u root exec service ssh restart for /F %%i in (‘wsl -d Ubuntu exec hostname -I’) do set ip=%%i netsh interface portproxy delete v4tov4 listenport=22 netsh interface portproxy add v4tov4 listenport=22 connectaddress=%ip% #バッチファイルを任意の場所に保存 ssh_bat.bat
  13. WSL:Ubuntuのssh設定② Windowsタスクの作成 # windows「スタートメニュー」⇒「タスクスケジューラー」⇒「タスクの作成」を開く 全般タグは、任意の名前を付けて「最上位の特権」をチェック、構成はWindows10 トリガータグは、新規作成から「タスクの開始」を「スタートアップ時」に設定 操作タグは、新規作成から「プログラム/スクリプト」に先ほどのバッチファイルを設定 設定タグは、念のため再起動間隔を1分間/3回で設定

  14. 【補足】WSL2のssh設定 • P.10、11の手順でWSL2のssh接続ができない場合はタスクスケジューラーの設定を削除し て、Ubuntuで起動時実行するスクリプトを作成してcronで実行させる • 以下はファイル名「ssh_start」で起動時実行する場合の例 /home/ {ユーザーdirectory}でファイル作成 $ sudo

    nano ssh_start /binにコピーして実行権限付与 $ sudo cp ssh_start /bin $ cd /bin $ sudo chmod u+x ssh_start crontab起動 $ crontab –e ⇒editorを選択しろと言ってきたら好きなの選ぶ 推奨はnano 最終行に以下の一文を登録 @reboot sudo ssh_start ・ ・ ・ ssh_start sudo ssh-keygen –A sudo service ssh start コピペで実行ファイル作成
  15. Docker Desktopのインストール インストールとセットアップ # https://www.docker.com/get-startedより「Windows用にダウンロード」をクリック # 「Enable WSL 2 Windows

    Features 」をチェックしたままインストールを続ける #インストール完了後に「setting」⇒「General」でExpose deamon とWSL2 engineの有効を確認 # 「setting」⇒「Resources」⇒「WSL INTEGRATION」でUbuntuをonにしてRestart docker
  16. WSL:UbuntuのPython開発環境構築 User groupsの確認 $ groups $ adm dialout cdrom floppy

    sudo audio dip video plugdev netdev docker Sudo実行時のpass word入力省略 $ sudo visudo #一番最後の行として追加 {username} ALL=(ALL) NOPASSWD: ALL Update/upgrade/python仮想環境(venv)インストール $ sudo apt update && sudo apt upgrade -y && sudo apt install python3-venv -y 仮想環境(venv)の作成 $ python3 -m venv myenv Python開発環境の構築 $ sudo apt install python3-pip python3-dev git awscli pipenv -y $ sudo pip3 install launchpadlib==1.10.13 six==1.15 jmespath~=0.10.0 $ sudo pip3 install pip autopep8 numpy pandas boto3 cfn-lint setuptools awscli aws-sam-cli --upgrade ←Dockerが追加されてるのを確認 ←仮想環境名をmyenvとする場合
  17. WSL:Ubuntu userのパラメーター設定 Git user設定 $ git config --global user.name “任意のユーザー名"

    $ git config --global user.email “任意のemailアドレス” AWS access key / secret access key / default region / default output設定 $ aws configure AWS Access Key ID []: 各自のアクセスキー AWS Secret Access Key []: 各自のシークレットアクセスキー Default region name []: ap-northeast-1 Default output format []: json ←Dockerが追加されてるのを確認
  18. WindowsへのVS Codeインストール ダウンロードしてインストール 追加タスクはすべて選択

  19. WSL:UbuntuよりVS CodeのPATHを追加 .bashrcへPATHを追加 $ sudo nano .bashrc #一番最後の行として追加 export PATH=$PATH:'/mnt/c/Users/{$username}/AppData/Local/Programs/Microsoft

    VS Code/bin’ WSL2をreboot #Windowsのコマンドプロンプトより以下を実行 C:¥Users¥saito_2414> wsl --shutdown #実行するとUbuntuターミナルが閉じる、処理が完了するとコマンドプロンプトにカーソルが戻ってくる C:¥Users¥saito_2414> #再度Ubuntuターミナルを立ち上げるとPATHが反映されている $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program ・・・・ft/WindowsApps:/mnt/c/Users/saito_2414/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin:/mnt/c/Users/saito_2414/AppData/Local/Programs/Microsoft VS Code/bin
  20. WSL:Ubuntu仮想環境でVS Code起動 Venvのアクティベート $ cd myenv myenv~$ source bin/activate VS

    Code起動 $ code . #初回起動時、update時は以下のようなダウンロードと展開が始まる ←自分が作った仮想環境名でdirectoryが作られているのでそこに移動 ←仮想環境のアクティベート
  21. VS Code拡張機能インストール Remoto Developmentのインストール # 「 Ctrl-Sihft-x」(拡張機能)から「remote」と入力してRemote Developmentをインストール PythonとPylanceのインストール #

    「 Ctrl-Sihft-x」(拡張機能)から「py」と入力して候補からPython/Pylance拡張機能をインストール AWS Toolkitのインストール # 「 Ctrl-Sihft-x」(拡張機能)から「aws」と入力して候補からAWS Toolkit拡張機能をインストール
  22. VS Codeターミナルから仮想環境をactivate 自分の作った仮想環境をactivate Ubuntu:~/myenv$ source bin/activate (myenv) Ubuntu:~/myenv$ Home directoryを作成して移動

    (myenv) Ubuntu:~/myenv$ mkdir home (myenv) Ubuntu:~/myenv$ cd home (myenv) Ubuntu:~/myenv/home$ ↑仮想環境がアクティベート
  23. 3.AWS SAM によるLambdaの実装

  24. 3-①SAMによるHelloWorldFunctionの実装

  25. AWS SAM SAMとは # サーバーレス アプリケーションのデプロイに特化したAWS CloudFormation の拡張機能 # AWS

    Serverless Application Modelの略称 参考資料: https://d1.awsstatic.com/webinars/jp/pdf/services/20190814_AWS-Blackbelt_SAM_rev.pdf : https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html 今回のHands Onで使うSAM template # AWS Quick Start Templates - Hello World Example - Step Functions Sample App (Stock Trader)
  26. SAM HelloWorldFunction templateの概要 CloudFormation Stack : sam-app AWS Cloud AWS

    Lambda Permissions AWS IAM Role Amazon API Gateway
  27. sam init でHello World templateを選択 sam init コマンドを実行 (myenv) Ubuntu:~/myenv/home$

    sam init templateを選択してHello World Projectを作成 sam-app-saito ↓関数名に「-名前」を追加
  28. ReadMe.mdに沿ってHands Onを開始 Hello World Projectのrootに移動 (myenv) Ubuntu:~/myenv/home$ cd sam-app (myenv)

    Ubuntu:~/myenv/home/sam-app$
  29. buildとAWSへCloudFormation stack deploy Dockerを使ってProjectをLocalでbuild (myenv) Ubuntu:~/myenv/home/sam-app$ sam build --use-container Local環境からAWSにHello

    World Functionを実行するCloudformation stackデプロイ (myenv) Ubuntu:~/myenv/home/sam-app$ sam deploy --guided ←任意のstack名 ←reagion名
  30. event.jsonを使ったLocal実行 --eventスイッチでevent.jsonのPATHを指定してLambda関数(HelloWorldFunction)をLocal実行 (myenv) Ubuntu:~/myenv/home/sam-app$ sam local invoke HelloWorldFunction --event events/event.json

    # event.jsonにはLambdaとAPI Gateway実行時にやり取りされるrequests/response等が格納されている ↑Localにmountして権限を渡している ←本番環境と同様のlog/responseが返ってくる
  31. API emulatorでの動作確認 Local port:3000からのrequestへのresponseを確認する (myenv) Ubuntu:~/myenv/home/sam-app$ sam local start-api #

    Local:3000でAPI GatewayのemulatorがGETで待ちになっている Ubuntuターミナルからrequestを実行 (myenv) Ubuntu:~/myenv/$ curl http://localhost:3000/hello # Lambdaが実行されてresponseが返ってくる↓→
  32. pytestで単体テスト/結合テスト requirements.txtのインストール (myenv) Ubuntu:~/myenv/home/sam-app$ sudo pip3 install -r tests/requirements.txt --user

    Lambda関数単体テストの実行 (myenv) Ubuntu:~/myenv/home/sam-app $ python3 -m pytest tests/unit –v Stack結合テストの実行 (myenv) Ubuntu:~/myenv/home/sam-app $ export AWS_SAM_STACK_NAME=sam-app (myenv) Ubuntu:~/myenv/home/sam-app $ python3 -m pytest tests/integration -v
  33. Stackの生成を確認してLambda関数に移動 マネジメントコンソールから確認

  34. Stackの出力タブからAPIをたたく responseを確認

  35. 参考:SAMとCloudFormationのtemplate比較 SAM CloudFormation 自動変換 SAMを使うメリット # Stack構築時にtemplateを大幅に簡略化できる # PC LocalでLambda関数をdebug~deploy出来る

    # Resource をyaml/jsonをテンプレート定義できる # テンプレート定義を使い展開できる # 修正してもLocalから上書きdeploy出来る # CloudFormation Stackなので一括削除可能 SAM利用時の注意点 # 既存のAPI Gateway や S3をtriggerに使えない
  36. 3-② SAMのtemplate.yaml

  37. Templateヘッダー/Globalsセクション ←CloudFormationテンプレートの変換方式 (マクロ)を用意する定義 ←各Resource typeのプロパティのデフォルト値を定義できる ←テンプレートの説明 ←CloudFormation テンプレートのバージョン指定 SAMテンプレートのバージョン、デプロイ内容、Resource のデフォルト値を記述

  38. Resourcesセクション ←Resource 名(任意) ←Resource type(Function,Api,SimpleTable,LayerVersion,Application) ←Resource type別に必要な項目を設定する ここでは、HellowWorldFunction(lambda)についての 保存先url、ハンドラーのlibrary/method、Runtime、Event デプロイするResource

    の詳細定義を記述
  39. Outputsセクション CloudFormationのOutputsの内容を記述 Fn::GetAtt(! GetAtt)テンプレートのResource から属性の値を返す組み込み関数 Fn::Sub(!Sub) 特定した値の入力文字列に変わりの変数を返す組み込み関数 スタックを作成または更新するまで使用できない値を含むコマンドまたは出力を作成 ↓OutputとしてApiを表紙 ←Outputsとして属性(ARN)表示

  40. 3-③ VS Code(AWSToolkit)から実行

  41. AWSToolkitのEXPLORERからLambdaを実行

  42. Test Event(sample request)を選択し実行 ↑プルダウンからsample requestを表示 ←Hello Worldを選択

  43. ターミナルで実行結果を確認

  44. LambdaのコンソールでLogを確認

  45. 4.AWS SAM によるStep Functionsの実装

  46. AWS Step Functions Step Functionsとは # AWS Lambda関数と他の AWS サービスを使用したserverlessオーケストレーションサービス

    #ステートマシンとタスクで構成される #ステートマシンはワークフロー #タスクは別の AWS サービスが実行する 1 つの作業単位を表すワークフロー内の状態 参考資料: https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/welcome.html https://qiita.com/kojiro_ueda/items/901e730a83d73bc0baa3 https://qiita.com/kinzal/items/843c4659a887a9af7499 https://dev.classmethod.jp/articles/aws-step-functions-choice-state-end-field/
  47. 4-① Step Functions templateの実装

  48. SAM Step Functions templateの概要 AWS Step Functions workflow AWS Cloud

    Amazon DynamoDB Transaction Table Amazon EventBridge AWS Lambda Stock checker AWS Lambda Stock seller AWS Lambda Stock buyer AWS IAM AWS IAM AWS IAM 乱数でダミー株価を設定して50以下なら買い、50より高ければ売り処理して記録する
  49. sam init でStep Functions Sample Appを選択 sam init コマンドを実行 (myenv)

    Ubuntu:~/myenv/home$ sam init templateを選択してStep Functions Projectを作成 sam-app-saito-SF ↓関数名に「-名前-SF」を追加
  50. ReadMe.mdに沿ってHands Onを開始 Step Functionsのrootに移動 (myenv) Ubuntu:~/myenv/home$ cd sam-app-saito-SF (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$

  51. buildとAWSへCloudFormation stack deploy Dockerを使ってProjectをLocalでbuild (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$ sam build --use-container Local環境からAWSにHello

    World Functionを実行するCloudformation stackデプロイ (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$ sam deploy --guided ←stack名
  52. pytestで単体テスト/結合テスト requirements.txtのインストール (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$ sudo pip3 install -r tests/requirements.txt --user

    Lambda関数単体テストの実行 (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$ python3 -m pytest tests/unit –v Stack結合テストの実行 (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$ export AWS_SAM_STACK_NAME=sam-app-saito-SF (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$ python3 -m pytest tests/integration -v
  53. 4-② Step Functionsのtemplate.yaml

  54. Resourcesセクション(State machine) ←state machine url デプロイするState machineのResource詳細定義を記述 ←state machine 内の

    Resource/Parameter 定義 ←state machine Resource名 ←Event名 ←定時実行 ←定時実行内容
  55. Resourcesセクション(State machine) デプロイするState machineのPolicy詳細定義を記述 !Ref 指定したパラメータまたはリソースの値を返す組み込み関数 ↓Lambda実行Policy ←Lambda Resource名 ↑DynamoDB書込みPolicy

    ←DynamoDB Table名
  56. Resourcesセクション(Lambda) デプロイするLambdaの詳細定義を記述 ←Resource type(Function) ←Resource 名(check) 保存先url ←ハンドラーのlibrary/method Runtime ←Resource

    type(Function) ←Resource 名(seller) 保存先url ←ハンドラーのlibrary/method Runtime ←Resource type(Function) ←Resource 名(buyer) 保存先url ←ハンドラーのlibrary/method Runtime
  57. Resourcesセクション(DynamoDB) デプロイするState machineのDynamoDB詳細定義を記述 ←Resource type(Function) ←Resource 名(check) ←Primary key/属性 ←プロビジョニングキャパシティUnit数

  58. 4-③ State Machineのasl.json

  59. Check Stock Value (Lambda) StockCheckerFunctionでLambdaを呼び出して現在の株価を確認する(乱数でダミー株価をつくる) 実行はTask→ ←template.yaml内で Substitution定義した LambdaのARN ←例外処理

    ←次のStepを指示
  60. Buy or Sell? State MachineのChoice Taskで株の売買を判断する 分岐はChoice→ ←株価が50以下なら 売り注文を出す ←それ以外は買い注文

  61. Sell Stock (Lambda) Sell StockでLambdaを呼び出して売り注文を実行する template.yaml内で Substitution定義した ← LambdaのARN ←例外処理

    ←次のStepを指示 実行はTask→
  62. Buy Stock (Lambda) Buy StockでLambdaを呼び出して売り注文を実行する template.yaml内で Substitution定義した ← LambdaのARN ←例外処理

    ←次のStepを指示 実行はTask→
  63. Record Transaction (DynamoDB) Record Transactionで株売買後にトランザクション処理を実行する 実行はTask→ template.yaml内で Substitution定義した ← LambdaのARN

    ←書込み内容
  64. Record Transaction (DynamoDB) トランザクション処理内の例外処理 ←トランザクション 処理内の例外処理 ←State Machineが正常終了したらtrueを返す

  65. 4-④ VS Code(AWSToolkit)から実行

  66. WSL:UbuntuにVS Codeからsshログイン Windowsのファイルシステムへの書込み要求が発生するのでsshでログインしなおす

  67. sshコマンドで接続してhostをopen 新しいターゲット追加↓ ↑ ssh {user名}@localhost -A ↓Ubuntuのfile systemを選択 ↑ hostをopen

    ←Linuxを選択、初回はkeyを生成する
  68. ssh接続を確立してAWSToolkitをconnect ↑Ubuntuのuser passを入力 ↑これが表示されれば接続成功 ↓default を選択 ←クリックする ←これが表示されれば接続成功

  69. AWS EXPLORERから作成した関数を選択

  70. VS CodeからStep Functionsを実行 ↓Step Functionsの実行が始まる

  71. マネジメントコンソールでLogを選択 ↓今実行したログを選択 ↓自分で作成したStep Functionsを選択

  72. グラフインスペクターで実行成功を確認

  73. END