従来のZIPファイルによるデプロイに代わり、Dockerイメージを使ってLambdaをデプロイする方法をメモ
ファイル
構成
.
├── Dockerfile
├── app.py
└── requirements.txt
Dockerfile
# ベースイメージとして公式のAWS Lambda Python 3.8ランタイムを使用
FROM --platform=linux/amd64 public.ecr.aws/lambda/python:3.8
# Lambda関数コードをコンテナにコピー
COPY app.py ${LAMBDA_TASK_ROOT}
# 必要なパッケージをインストール
COPY requirements.txt ./
RUN pip install -r requirements.txt
# Lambdaハンドラーを指定
CMD ["app.lambda_handler"]
※M1 Mac上でビルドする場合、FROMに「--platform=linux/amd64」を指定してあげないと、AWSコンソール上でLambdaが動かない。
app.py
import json
def lambda_handler(event, context):
# クエリパラメータ "name" を取得
name = event.get("queryStringParameters", {}).get("name", "World")
# レスポンスを返す
return {
"statusCode": 200,
"body": json.dumps({
"message": f"Hello, {name}!"
})
}
requirements.txt は空
デプロイ手順
Amazon ECR リポジトリ作成
Amazon ECR(Elastic Container Registry)は、Dockerイメージをホスティングするためのサービス。
まずはECRリポジトリ作成
aws ecr create-repository --repository-name your-lambda-repo
Dockerログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin your-account-id.dkr.ecr.your-region.amazonaws.com
イメージのビルド
docker build -t my-lambda-image .
ECRリポジトリのURIにイメージをタグ付け
docker tag your-lambda-image:latest your-account-id.dkr.ecr.your-region.amazonaws.com/your-lambda-repo:latest
ECRにプッシュ
docker push your-account-id.dkr.ecr.your-region.amazonaws.com/your-lambda-repo:latest
これで、ECRにコンテナイメージがプッシュされる。
Lambdaデプロイ
ECRのイメージを指定して、デプロイする。
aws lambda create-function \
--function-name your-lambda-function \
--package-type Image \
--code ImageUri=your-account-id.dkr.ecr.your-region.amazonaws.com/your-lambda-repo:latest \
--role arn:aws:iam::your-account-id:role/your-lambda-role
- function-name: Lambda関数名
- ImageUri: ECRにプッシュしたイメージのURI
- role: Lambdaに必要なIAMロールのARN
- Lambda用のロールを作成していないのであれば、IAMから作成