はじめに
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関数を作成します。
def handler(event, context):
return {
"statusCode": 200,
"body": "Hello from Lambda container!"
}
- 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
ここまでで、Lambda関数を実行するためのコンテナイメージがローカルに準備できました。
ECRへのイメージアップロード
AWS CLIを使用してECRリポジトリの作成、イメージのプッシュを行います。
- ECRリポジトリの作成
aws ecr create-repository --repository-name lambda-container-demo
コンソールを確認するとちゃんとリポジトリが作成されていることが確認できます。

- 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
コンソールで確認すると、先ほど作成したリポジトリの中にイメージが作成されていることが分かります。
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ポリシーがアタッチされていることが確認できます。

- 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-typeでImageを指定し、codeでImageUri=ECRリポジトリのURIと指定することにより、ECRのイメージを元にLambda関数を作成できます。
コンテナイメージからLambdaを作成した場合は、コンソールでコードの内容を確認できず、以下のように表示されます。

動作確認
最後に作成したLambda関数をテストし、期待したレスポンスが返ってくるか確認します。
aws lambda invoke \
--function-name my-container-function \
--region ${AWS_REGION} \
response.json
これを実行すると、同じ階層にresponse.jsonというファイルが作成され、その中に実行結果が保存されます。
中身を確認してみると、次のようになっているはずです。
cat response.json
{
"statusCode": 200,
"body": "Hello from Lambda container!"
}
まとめ
本記事では、ECRを利用してコンテナイメージからLambda関数をデプロイする方法について紹介しました。
今回は手動でビルド→プッシュ→デプロイという流れを行いましたが、次のステップとしてはAWS CodeBuildとCodePipelineを使って、イメージの自動ビルドとLambda更新を自動化するCI/CDパイプラインの構築に挑戦してみたいです。

