AWS

AWS sam cli Lambda関数 Pythonのローカル実行

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
スポンサーリンク