Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

実施内容 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の実行

Slide 4

Slide 4 text

1.概要説明

Slide 5

Slide 5 text

SAMのprefix/key構造とstate machine state machine flow chart 各関数の格納先 関数の集合 ③state machine:step定義するjson State machineの格納先 ② template.yaml:Resource/Outpu定義 ①Lambda関数:実行プログラム state machineによる実行定義 Lambda関数による実行定義 directory構造

Slide 6

Slide 6 text

2.WLS2 Python開発環境構築

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Ubuntuのインストール Ubuntuのインストール # Microsft Storeで「wsl」と検索 #「Ubuntu」を選択して「インストール」 # インストールが完了するとUbuntuが立上るので「UNIX username」「New password」を 各自で任意に入力してユーザー初期設定する

Slide 9

Slide 9 text

仮想マシン有効化 有効化 #「コントロールパネル」⇒「プログラムと機能」を開く #「Windowsの機能の有効化または無効化」をクリック #「仮想マシン プラットフォーム」にチェックを入れて「OK」をクリック # Windowsを再起動する

Slide 10

Slide 10 text

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」を ダウンロードして実行して、再度「wsl --set-version Ubuntu 2」を実行 VERSIONの確認 #コマンドプロンプトより C:¥Users¥saito_2414>wsl -l -v NAME STATE VERSION Ubuntu Running 2 UbuntuをWSL2用に変換 ←変らなかったら再起動してVERSION再確認

Slide 11

Slide 11 text

再度「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 仮想化支援機能の有効化が必要な場合

Slide 12

Slide 12 text

WSL:Ubuntuのssh設定① sshのBASIC認証許可 # Ubuntuターミナルを起動 $ sudo nano /etc/ssh/sshd_config PasswordAuthentication yes $ sudo ssh-keygen –A $ sudo service ssh restart #以下のスクリプトを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

Slide 13

Slide 13 text

WSL:Ubuntuのssh設定② Windowsタスクの作成 # windows「スタートメニュー」⇒「タスクスケジューラー」⇒「タスクの作成」を開く 全般タグは、任意の名前を付けて「最上位の特権」をチェック、構成はWindows10 トリガータグは、新規作成から「タスクの開始」を「スタートアップ時」に設定 操作タグは、新規作成から「プログラム/スクリプト」に先ほどのバッチファイルを設定 設定タグは、念のため再起動間隔を1分間/3回で設定

Slide 14

Slide 14 text

【補足】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 コピペで実行ファイル作成

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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とする場合

Slide 17

Slide 17 text

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が追加されてるのを確認

Slide 18

Slide 18 text

WindowsへのVS Codeインストール ダウンロードしてインストール 追加タスクはすべて選択

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

WSL:Ubuntu仮想環境でVS Code起動 Venvのアクティベート $ cd myenv myenv~$ source bin/activate VS Code起動 $ code . #初回起動時、update時は以下のようなダウンロードと展開が始まる ←自分が作った仮想環境名でdirectoryが作られているのでそこに移動 ←仮想環境のアクティベート

Slide 21

Slide 21 text

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拡張機能をインストール

Slide 22

Slide 22 text

VS Code Http:Proxyの設定解除 Http: ProxyとHttp: Proxy Strict SSLの設定解除 VSCodeによるAWS TOOLKITへのプロキシ制御を回避するために ・Http: Proxy ⇒ 削除 ・Http: Proxy Strict SSL ⇒ チェックを外す ・Http: Proxy Support ⇒ offにする

Slide 23

Slide 23 text

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$ ↑仮想環境がアクティベート

Slide 24

Slide 24 text

3.AWS SAM によるLambdaの実装

Slide 25

Slide 25 text

3-①SAMによるHelloWorldFunctionの実装

Slide 26

Slide 26 text

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)

Slide 27

Slide 27 text

SAM HelloWorldFunction templateの概要 CloudFormation Stack : sam-app AWS Cloud AWS Lambda Permissions AWS IAM Role Amazon API Gateway

Slide 28

Slide 28 text

sam init でHello World templateを選択 sam init コマンドを実行 (myenv) Ubuntu:~/myenv/home$ sam init templateを選択してHello World Projectを作成 sam-app-saito ↓関数名に「-名前」を追加

Slide 29

Slide 29 text

ReadMe.mdに沿ってHands Onを開始 Hello World Projectのrootに移動 (myenv) Ubuntu:~/myenv/home$ cd sam-app (myenv) Ubuntu:~/myenv/home/sam-app$

Slide 30

Slide 30 text

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名

Slide 31

Slide 31 text

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が返ってくる

Slide 32

Slide 32 text

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が返ってくる↓→

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Stackの生成を確認してLambda関数に移動 マネジメントコンソールから確認

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

参考: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に使えない

Slide 37

Slide 37 text

3-② SAMのtemplate.yaml

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

AWSToolkitのEXPLORERからLambdaを実行

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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/

Slide 48

Slide 48 text

4-① Step Functions templateの実装

Slide 49

Slide 49 text

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より高ければ売り処理して記録する

Slide 50

Slide 50 text

sam init でStep Functions Sample Appを選択 sam init コマンドを実行 (myenv) Ubuntu:~/myenv/home$ sam init templateを選択してStep Functions Projectを作成 sam-app-saito-SF ↓関数名に「-名前-SF」を追加

Slide 51

Slide 51 text

ReadMe.mdに沿ってHands Onを開始 Step Functionsのrootに移動 (myenv) Ubuntu:~/myenv/home$ cd sam-app-saito-SF (myenv) Ubuntu:~/myenv/home/sam-app-saito-SF$

Slide 52

Slide 52 text

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名

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

4-② Step Functionsのtemplate.yaml

Slide 55

Slide 55 text

Resourcesセクション(State machine) ←state machine url デプロイするState machineのResource詳細定義を記述 ←state machine 内の Resource/Parameter 定義 ←state machine Resource名 ←Event名 ←定時実行 ←定時実行内容

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Resourcesセクション(DynamoDB) デプロイするState machineのDynamoDB詳細定義を記述 ←Resource type(Function) ←Resource 名(check) ←Primary key/属性 ←プロビジョニングキャパシティUnit数

Slide 59

Slide 59 text

4-③ State Machineのasl.json

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

sshコマンドで接続してhostをopen 新しいターゲット追加↓ ↑ ssh {user名}@localhost -A ↓Ubuntuのfile systemを選択 ↑ hostをopen ←Linuxを選択、初回はkeyを生成する

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

END