はじめに
Docker イメージを ECR リポジトリ にプッシュし、
Lambdaを ECR リポジトリから ビルドする手順を試してみたので、
その手順を記載しています。
事前準備
- Docker Desktop
- AWS CLI
- ECR リポジトリの作成(pushするため)
手順
ディレクトリ
docker-lambda-app/
├── Dockerfile
├── app.py
└── template.yaml
Dockerfile
Dockerfile
FROM public.ecr.aws/lambda/python:3.10
COPY app.py ./
CMD ["app.handler"]
Python
app.py
import json
def handler(event, context):
return {
"statusCode": 200,
"body": json.dumps(
{
"message": "hello world func1",
}
),
}
YAML
template.yaml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
EcrImageUri:
Description: ECR image URI
Type: String
Resources:
LambdaFunc:
Type: AWS::Lambda::Function
Properties:
Role: !GetAtt LambdaRole.Arn
PackageType: Image
Code:
ImageUri: !Ref EcrImageUri
LambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
イメージの起動
$ docker run --rm -p 9000:8080 func1:latest
ローカル動作確認
$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
Docker に リポジトリの URI を含めたタグを付与
$ docker tag func1:latest {accountid}.dkr.ecr.ap-northeast-1.amazonaws.com/func1:latest
ECRログイン
pushする前にログインする
$ aws ecr get-login-password --region ap-northeast-1 --profile {account} | docker login --username AWS --password-stdin {accountid}.dkr.ecr.ap-northeast-1.amazonaws.com
ECRへpush
$ docker push {accountid}.dkr.ecr.ap-northeast-1.amazonaws.com/func1:latest
※必要に応じて、AWSコンソールで確認
スタックの作成
$ aws cloudformation create-stack \
--stack-name func1 \
--template-body file://template.yaml \
--parameters ParameterKey=EcrImageUri,ParameterValue={accountid}.dkr.ecr.ap-northeast-1.amazonaws.com/func1:latest \
--profile {account} \
--capabilities CAPABILITY_NAMED_IAM
まとめ
メリット
- 好みのプログラミング言語や実行環境を選択することができる
- プロジェクトとかで使うことはないと思うが、できるという事実が分かった
- ローカル開発がしやすい
- 拡張性(逆にデメリットとも言える)
デメリット
- SAMを使用する方がかなり楽(便利)
- わざわざこの方法でやる必要があるかと言われるとおそらく微妙
- AWSコンソールでソースを確認できないので注意が必要
- 例えば、バグを至急調査しないといけないときなどは致命的になりそう