LoginSignup
0
1

DockerコンテナでLambdaをデプロイする

Posted at

はじめに

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コンソールでソースを確認できないので注意が必要
    • 例えば、バグを至急調査しないといけないときなどは致命的になりそう
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1