Lambda関数をPythonでデプロイする際、ローカル環境でのデバッグ方法を以下に記載します。事前にDocker Desktopがインストールされている事を前提とします。
AWS SAM CLIのインストール
今回はWindows環境ですので以下からインストーラをダウンロードし、ウィザードに従うだけで簡単にインストールが完了します。インストーラ名: AWS_SAM_CLI_64_PY3.msi
AWS SAM CLI 64ビット
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html#install-sam-cli-instructions
-- インストールできた事を確認する
pyfunc2 >> sam --version
SAM CLI, version 1.98.0
pyfunc2 >>
ディレクトリ(プロジェクト)作成
my_lambda_function/
├── lambda_function.py
└── template.yaml
lambda_function.py
今回の検証用ソース
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Hello from local Lambda by sooni')
}
template.yaml
samテンプレートを使って、サーバレスアプリケーションを定義します。(JSONで記載する事も可能)
リソース、APIエンドポイント、関数、イベントトリガー
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An example AWS Lambda function
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
Handler: lambda_function.lambda_handler
Runtime: python3.11
Events:
MyEvent:
Type: Api
Properties:
Path: /hello
Method: get
Dockerデーモン(Dockerデスクトップ)の起動
sam local start-api
-- Dockerデーモンが上がっていない場合以下のようなエラーになります
--
pyfunc2 >> sam local start-api
Error: Running AWS SAM projects locally requires Docker. Have you got it installed and running?
pyfunc2 >> sam local start-api
Mounting MyFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while
working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local
commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you
update your AWS SAM template
2023-10-12 10:10:02 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:3000
2023-10-12 10:10:02 Press CTRL+C to quit
localhostを使って動作確認
http://127.0.0.1:3000/hello にアクセスすると Lambda関数が動作し、samコマンド実行のコンソールでは以下のようなログを確認できる
pyfunc2 >> sam local start-api
Mounting MyFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while
working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local
commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you
update your AWS SAM template
2023-10-12 10:10:02 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:3000
2023-10-12 10:10:02 Press CTRL+C to quit
Invoking lambda_function.lambda_handler (python3.8)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.8-rapid-x86_64.
Mounting D:\aws\lambda\localtest\pyfunc2 as /var/task:ro,delegated, inside runtime container
START RequestId: 0ef7ada0-2bf8-49b5-8531-2306bac91d35 Version: $LATEST
END RequestId: 0ef7ada0-2bf8-49b5-8531-2306bac91d35
REPORT RequestId: 0ef7ada0-2bf8-49b5-8531-2306bac91d35 Init Duration: 0.11 ms Duration: 107.86 ms Billed Duration: 108 ms Memory Size: 128 MB Max Memory Used: 128 MB
No Content-Type given. Defaulting to 'application/json'.
2023-10-12 10:21:17 127.0.0.1 - - [12/Oct/2023 10:21:17] "GET /hello HTTP/1.1" 200 -
2023-10-12 10:21:17 127.0.0.1 - - [12/Oct/2023 10:21:17] "GET /favicon.ico HTTP/1.1" 403 -
-- AWS CLI で Layers の情報を取得:
aws lambda list-layers
-- ここで、REGION、ACCOUNT_ID、LAYER_NAME、LAYER_VERSION を実際の値に置き換えます。
-- コマンドを実行すると、Layers の内容が表示されます。
aws lambda get-layer-version-by-arn --arn arn:aws:lambda:REGION:ACCOUNT_ID:layer:LAYER_NAME:LAYER_VERSION
ーー
# Lambda Layer の ARN とバージョンを指定
$layerName = "LAYER_NAME"
$layerVersion = "LAYER_VERSION"
# レイヤーのダウンロード
# レイヤーのダウンロード
$jsonOutput = aws lambda get-layer-version --layer-name $layerName --version-number $layerVersion --output json
$jsonObject = $jsonOutput | ConvertFrom-Json
$contentLocation = $jsonObject.Content.Location
# レイヤーの展開
Invoke-WebRequest $contentLocation -OutFile "my_layer.zip"
Expand-Archive -Path "my_layer.zip" -DestinationPath "layers"
# 仮想環境を作成(必要に応じて)
python -m venv myenv
.\myenv\Scripts\Activate # Windows の場合
# 必要なパッケージをインストール
pip install -r .\layers\python\requirements.txt