SSブログ

独自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・・がそれ
Untitled.png


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は参照されない。

2Untitled.png

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. 実行
 無事にブレーク止まった!
Untitled.png

出力結果も問題なし
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開発環境の構築手順紹介

 








nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。