コンテナイメージをAWS Lambda関数にデプロイしてみました

謝 永佳

プライム・ストラテジー「KUSANAGI」開発チームの謝です。
最近、AWS LambdaではDockerコンテナイメージを使用して関数をデプロイすることも可能となりました。この機能を利用すれば、より柔軟な環境をLambdaで実現することが出来ます。今回はその構築方法を紹介します。

概要

今回のプロセスは以下のステップが含まれます:

  1. Dockerfileの作成: Pythonランタイムと必要な拡張を含むDockerイメージを作成。
  2. コンテナイメージのビルド: Dockerfileを利用してイメージをビルド。
  3. ECRへのプッシュ: Amazon ECRにプッシュ。
  4. Lambda関数の作成: ECRにアップロードされたイメージを使ってLambda関数を作成。
  5. Lambda関数のテスト: 関数を実行して動作を確認。

今回の操作はLinux(Alamlinux8)上で行っているので、全操作はコマンドで行います。

前提条件

AWS CLIDockerがインストールされていること、それぞれのインストール方法は公式サイトにて確認してください。

コンテナイメージをAWS Lambda関数にデプロイ

Dockerfileの作成

プロジェクト用フォルダを作成し、そのフォルダに切り替え

mkdir lambda-container
cd lambda-container/

Dockerfileを作成します。これはLambdaがサポートするPythonのランタイム環境を含むコンテナイメージを構築するためのものです。
このDockerfileでは、まず公式のLambda Pythonランタイムベースイメージを使用しています。

FROM public.ecr.aws/lambda/python:3.12

# app.py を {LAMBDA_TASK_ROOT} にコピーしています。
COPY app.py ${LAMBDA_TASK_ROOT}


# Lambda 関数ハンドラーに設定します。
CMD ["app.handler"]

{LAMBDA_TASK_ROOT}はLambdaで定義されたランタイム環境変数です。

上記に利用しているapp.pyを作成します。

import sys
def handler(event, context):
    return 'AWS Lambda using Python ' + sys.version + '!'

コンテナイメージのビルド

ビルドコマンドを使用して、ローカルでDockerイメージを作成します。

docker build --platform linux/amd64 -t docker-image:lambda .

このイメージをテストするには、AWS SAM CLIを使用するか、直接Dockerで実行することができます。

docker run --platform linux/amd64 -p 9000:8080 docker-image:lambda

そして、以下のコマンドを新しいターミナルで実行して、ローカルのLambda関数にリクエストを送信します。

curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

こちらのような結果「”AWS Lambda using Python 3.12.2 (main, Mar 15 2024, 11:05:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)]!”」が表示されたら、成功です。

ECRへのプッシュ

AWSにデプロイする前に、イメージをAmazon ECRにプッシュする必要があります。以下はそのステップです。

ECRリポジトリの作成 。

aws ecr create-repository --repository-name my-lambda-repo --region ap-northeast-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE

成功すると、次のようなレスポンスが表示されます。

{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/my-lambda-repo",
        "registryId": "123456789012",
        "repositoryName": "my-lambda-repo",
        "repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo",
        "createdAt": "2024-05-09T18:50:55.505000+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }

「123456789012」の部分は自分のアカウントIDになります。

Dockerにログイン 。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

DockerイメージをECRにプッシュ。

docker tag docker-image:lambda 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo:latest

Lambda関数の作成

新しいLambda関数を作成し、コンテナイメージを指定、Lambda関数作成権限がなかったら、「実行ロールの作成」を実行してください。

aws lambda create-function \
   --function-name my-lambda-func \
   --package-type Image \
   --code ImageUri=123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-lambda-repo:latest \
   --role arn:aws:iam::123456789012:role/lambda-ex

Lambda関数のテスト

設定が完了したら、下記のコマンドで実際にLambda関数を実行して、期待通りに動作するかテストします。

aws lambda invoke --function-name my-lambda-func response.json && cat response.json

下記のようなメッセージが表示されたら、AWS Lambda関数にデプロイ成功です。

{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
"AWS Lambda using Python 3.12.2 (main, Mar 15 2024, 11:05:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)]!"

以上のステップにより、Lambda関数のコンテナが完成します。この方法で、PythonアプリケーションをAWS クラウド環境に簡単に統合し、管理することができます。

<< Microsoft Entra(旧Azure AD)でOAuthのSSOの実現方法Azure Container Apps (コンテナー アプリ)を動かしてみる >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解