2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon ECRのコンテナイメージを使用してLambda関数をデプロイする

Last updated at Posted at 2025-06-30

はじめに

Lambda関数をコンテナイメージから作成する方法をよく理解していなかったのでハンズオンしてみました。
AWS CLIにも慣れたかったので、リソースの作成は全てCLIで行いました。

  • この記事を読むと分かること
    • DockerでLambda向けのコンテナイメージを作成する方法
    • Amazon ECR(Elastic Container Registry)にイメージをアップロードする方法
    • LambdaをECRイメージから作成する方法
    • LambdaをCLIから実行して動作確認する方法

コンテナイメージからLambda関数を作成すると何が嬉しい?

  • 任意のランタイム・環境を構築できる
    Lambdaのランタイムでサポートされていない言語、またはバージョンを使用して関数を作成できます。
  • デプロイパッケージのサイズ制限を回避できる
    通常のLambdaはZIPで50MB(展開後250MB)の制限がありますが、コンテナイメージでは最大10GBまで可能になります。
  • CI/CDとの親和性が高い
    GitHub Actionsや CodeBuildなどと組み合わせることで、
    コンテナイメージのビルド→ECRへのプッシュ→Lambdaの自動更新
    の流れを自動化できます。

事前準備

環境

  • OS:Windows 11上のWSL2
  • ディストリビューション:Ubuntu 24.04.2 LTS

AWS環境

  • IAMユーザー(管理者権限or以下のポリシーが必要)
    • AmazonEC2ContainerRegistryFullAccess
    • AWSLambda_FullAccess
    • IAMFullAccess
  • IAMユーザーのアクセスキーの作成

使用ツール

以下のツールが事前にインストールされていることを前提としています。

  • Docker
  • AWS CLI
docker --version
# Docker version 27.5.1, build 27.5.1-0ubuntu3~24.04.2

aws --version
# aws-cli/2.27.45 Python/3.13.4 Linux/6.6.87.2-microsoft-standard-WSL2 exe/x86_64.ubuntu.24

ハンズオンでは AWS CLI を使って操作するため、事前に aws configure を実行して認証情報を設定しておいてください。

aws configure
AWS Access Key ID [None]: <作成したアクセスキー>
AWS Secret Access Key [None]: <作成したシークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json

ハンズオン

Lambda用コンテナイメージの作成

コンテナイメージを使用したLambda関数を作成するには、以下の2つのファイルを用意する必要があります。

ファイル名 役割
app.py 実際に Lambda 関数として実行されるコード
Dockerfile コンテナの定義(=Lambdaで実行する環境の定義)
  • 作業ディレクトリの作成
mkdir lambda-container-demo
cd lambda-container-demo
  • app.pyの作成
    "Hello from Lambda container!" というメッセージを返すだけのLambda関数を作成します。
app.py
def handler(event, context):
    return {
        "statusCode": 200,
        "body": "Hello from Lambda container!"
    }
  • Dockerfileの作成
Dockerfile
# ランタイムを指定
FROM public.ecr.aws/lambda/python:3.9

# Lambda関数のコードをコンテナ内にコピー
COPY app.py ./

# Lambda関数として呼び出すエントリポイントを指定
CMD ["app.handler"]
  • Dockerイメージのビルド
    ファイルを作成したら、以下のコマンドで Docker イメージをビルドします。
docker build -t lambda-container-demo .
  • 作成されたイメージの確認
docker images

image.png

ここまでで、Lambda関数を実行するためのコンテナイメージがローカルに準備できました。

ECRへのイメージアップロード

AWS CLIを使用してECRリポジトリの作成、イメージのプッシュを行います。

  • ECRリポジトリの作成
aws ecr create-repository --repository-name lambda-container-demo

コンソールを確認するとちゃんとリポジトリが作成されていることが確認できます。
ecr.png

  • ECRにログイン
export AWS_ACCOUNT_ID=12桁のAWSアカウントID
export AWS_REGION=ap-northeast-1

aws ecr get-login-password \
  | docker login \
    --username AWS \
    --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

認証に成功すると、「Login Succeeded」と表示されます。

  • Dockerイメージにタグを付ける
docker tag lambda-container-demo:latest \
${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/lambda-container-demo:latest
  • ECRにイメージをプッシュする
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/lambda-container-demo:latest

コンソールで確認すると、先ほど作成したリポジトリの中にイメージが作成されていることが分かります。

image.png

Lambda関数の作成とデプロイ

  • Lambdaの実行ロールの作成
aws iam create-role \
  --role-name lambda-execution-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }]
  }'
  • Lambda実行ロールにポリシーをアタッチ
aws iam attach-role-policy \
  --role-name lambda-execution-role \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

コンソールでlambda-execution-roleにAWSLambdaBasicExecutionRoleポリシーがアタッチされていることが確認できます。
image.png

  • Lambda関数の作成
    以下のコマンドで、ECRのイメージを元にLambda関数を作成します。
aws lambda create-function \
  --function-name my-container-function \
  --package-type Image \
  --code ImageUri=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/lambda-container-demo:latest \
  --role arn:aws:iam::${AWS_ACCOUNT_ID}:role/lambda-execution-role \
  --region ${AWS_REGION}

package-typeImageを指定し、codeImageUri=ECRリポジトリのURIと指定することにより、ECRのイメージを元にLambda関数を作成できます。

コンテナイメージからLambdaを作成した場合は、コンソールでコードの内容を確認できず、以下のように表示されます。
lambda.png

動作確認

最後に作成したLambda関数をテストし、期待したレスポンスが返ってくるか確認します。

aws lambda invoke \
  --function-name my-container-function \
  --region ${AWS_REGION} \
  response.json

これを実行すると、同じ階層にresponse.jsonというファイルが作成され、その中に実行結果が保存されます。
中身を確認してみると、次のようになっているはずです。

cat response.json
response.json
{
  "statusCode": 200,
  "body": "Hello from Lambda container!"
}

まとめ

本記事では、ECRを利用してコンテナイメージからLambda関数をデプロイする方法について紹介しました。
今回は手動でビルド→プッシュ→デプロイという流れを行いましたが、次のステップとしてはAWS CodeBuildとCodePipelineを使って、イメージの自動ビルドとLambda更新を自動化するCI/CDパイプラインの構築に挑戦してみたいです。

2
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?