独自Layerを参照している Lambda(Python)をローカルでステップ実行する方法 [AWS]
はじまり
Serverless Frameworkで独自PythonライブラリをLayer化しているのですが
Lmabda(Python)をローカルでステップ実行出来る環境を作りたいという思いが始まりでした。
環境情報:
ローカルマシン:Windows10 (64bit)
python:3.8.5
node:16.5.0
serverless framework:2.51.2
sam:1.26.0
aws-cli:2.0.48
VSCode:1.58.2
Docker:3.4.0
調査結果
きっと出来ると思いますが、PythonでServerless Frameworkでは、
frameworkVersion1.Xでないと、
ローカルでステップ実行出来ないというのが自分の調査結果でした。
それだと、他箇所がエラーになり出来ないので諦めました・・(無念)
他の方法で見つけたやり方は、ServerlessFrameworkでDeployしたモジュールを
AWSToolkit forVisual Studio Codeでローカルに落として、SAMを利用して
ステップ実行する方法です。
1.はじめに
SAMを使ってLayerを参照しているLambdaをローカルで実行出来る
プロジェクトを下記サイトに沿って作ります。
https://qiita.com/herohit-tool/items/4b4edcaa26c9b5eeaf2c
2.AWSToolkit forVisual Studio Codeをインストします
https://docs.aws.amazon.com/ja_jp/toolkit-for-vscode/latest/userguide/welcome.html
3. VSCodeで空のプロジェクトを開く
4. AWSToolkit forVisual Studio Codeから1で作成したLambdaをダウンロードします。
ここでは、sample-004-HelloWorld・・がそれ
5. ダウンロード終わるとlaunch.jsonにも実行用のコードが勝手に追加されます。
6. 試しにこれを実行してみます。エラーになる。
No Module named user_numpy とでていてこのままではLayerは参照されない。
7. プロジェクト直下にtemplate.yamlファイルを作成する
Layers: の値は、AWSにログインして、現在DeployされているLayerのARNを張る。
8. launch.jsonを下記内容に変更
8~10行目が変更箇所
9. 実行
無事にブレーク止まった!
出力結果も問題なし
Layerを参照しているプロジェクトは下記(Layer側のプロジェクトは無いです)
https://github.com/MakotoPlus/004_sam_sample_layers
10. 最後に
出来て良かったけど、自分は結構ログ出力して調査するタイプだから
あまり使わないんだけどねw今まで使ってなかったしw
ネットには、TypeScriptでステップ実行する参考サイトが多かった。最近流行ってるのかな?
参考サイト:
・チュートリアル: Hello World アプリケーションのデプロイ
・[AWS] SAM + Lambda(Python)で、PythonライブラリをLayerに追加して利用してみる
・サーバーレスアプリケーションのデバッグ用の設定オプション
・VS Codeで AWS Toolkit を使って Lambda 関数をローカルでテストする方法 (AWS SAM)
・AWS SAMによるLambda Layers & Layers利用Functionの作成手順と運用観点での注意点(2021年3月, SAM 1.19版)
・ローカルでLambda開発環境の構築手順紹介
Serverless Frameworkで独自PythonライブラリをLayer化しているのですが
Lmabda(Python)をローカルでステップ実行出来る環境を作りたいという思いが始まりでした。
環境情報:
ローカルマシン:Windows10 (64bit)
python:3.8.5
node:16.5.0
serverless framework:2.51.2
sam:1.26.0
aws-cli:2.0.48
VSCode:1.58.2
Docker:3.4.0
調査結果
きっと出来ると思いますが、PythonでServerless Frameworkでは、
frameworkVersion1.Xでないと、
ローカルでステップ実行出来ないというのが自分の調査結果でした。
それだと、他箇所がエラーになり出来ないので諦めました・・(無念)
他の方法で見つけたやり方は、ServerlessFrameworkでDeployしたモジュールを
AWSToolkit forVisual Studio Codeでローカルに落として、SAMを利用して
ステップ実行する方法です。
1.はじめに
SAMを使ってLayerを参照しているLambdaをローカルで実行出来る
プロジェクトを下記サイトに沿って作ります。
https://qiita.com/herohit-tool/items/4b4edcaa26c9b5eeaf2c
2.AWSToolkit forVisual Studio Codeをインストします
https://docs.aws.amazon.com/ja_jp/toolkit-for-vscode/latest/userguide/welcome.html
3. VSCodeで空のプロジェクトを開く
4. AWSToolkit forVisual Studio Codeから1で作成したLambdaをダウンロードします。
ここでは、sample-004-HelloWorld・・がそれ
5. ダウンロード終わるとlaunch.jsonにも実行用のコードが勝手に追加されます。
{ "configurations": [ { "type": "aws-sam", "request": "direct-invoke", "name": "sample-004-HelloWorldFunction-zbFE0M6ZEbAX:app.lambda_handler (python3.8)", "invokeTarget": { "target": "code", "projectRoot": "${workspaceFolder}/sample-004-HelloWorldFunction-zbFE0M6ZEbAX", "lambdaHandler": "app.lambda_handler" }, "lambda": { "runtime": "python3.8", "payload": {}, "environmentVariables": {} } } ] }
6. 試しにこれを実行してみます。エラーになる。
No Module named user_numpy とでていてこのままではLayerは参照されない。
7. プロジェクト直下にtemplate.yamlファイルを作成する
Layers: の値は、AWSにログインして、現在DeployされているLayerのARNを張る。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: sample-004-HelloWorldFunction-zbFE0M6ZEbAX/ Handler: app.lambda_handler Runtime: python3.8 Events: HelloWorld: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Layers: - << AWSにログインして、現在DeployされているLayerのARNを張る。 >> # 例: - arn:aws:lambda:ap-northeast-1:99999999:layer:HelloWorldLayer:1 Metadata: BuildMethod: python3.8
8. launch.jsonを下記内容に変更
8~10行目が変更箇所
{ "configurations": [ { "type": "aws-sam", "request": "direct-invoke", "name": "sample-004-HelloWorld-Yaml", "invokeTarget": { "target": "template", "templatePath": "template.yaml", "logicalId": "HelloWorldFunction", }, "lambda": { "runtime": "python3.8", "payload": {}, "environmentVariables": {} } } ] }
9. 実行
無事にブレーク止まった!
出力結果も問題なし
START RequestId: e69bde63-a0b5-4a72-9902-4484d1073c3e Version: $LATEST Prepending Lambda task root to path: /var/task Starting debugger... Debugger waiting for client... 2021-07-18 17:47:25 [INFO]: Attaching debugger to SAM application... 2021-07-18 17:47:29 [INFO]: Debugger attached END RequestId: e69bde63-a0b5-4a72-9902-4484d1073c3e REPORT RequestId: e69bde63-a0b5-4a72-9902-4484d1073c3e Init Duration: 0.61 ms Duration: 17170.39 ms Billed Duration: 17200 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"0,1,2\"}"} Command stopped: "sam local invoke"
Layerを参照しているプロジェクトは下記(Layer側のプロジェクトは無いです)
https://github.com/MakotoPlus/004_sam_sample_layers
10. 最後に
出来て良かったけど、自分は結構ログ出力して調査するタイプだから
あまり使わないんだけどねw今まで使ってなかったしw
ネットには、TypeScriptでステップ実行する参考サイトが多かった。最近流行ってるのかな?
参考サイト:
・チュートリアル: Hello World アプリケーションのデプロイ
・[AWS] SAM + Lambda(Python)で、PythonライブラリをLayerに追加して利用してみる
・サーバーレスアプリケーションのデバッグ用の設定オプション
・VS Codeで AWS Toolkit を使って Lambda 関数をローカルでテストする方法 (AWS SAM)
・AWS SAMによるLambda Layers & Layers利用Functionの作成手順と運用観点での注意点(2021年3月, SAM 1.19版)
・ローカルでLambda開発環境の構築手順紹介
コメント 0