AWS Lambda をコンテナイメージで利用するために必要なこと
最小構成かつ最も手間をかけずデプロイできるツールとして AWS CDK がおすすめです。AWS CDK を利用しない場合でも、以下のようなステップでコンテナイメージとリソースを作成していけばデプロイが可能になります。
- コンテナイメージ作成(Dockerfile 作成)
- 実行可能なソースコード
- 依存ライブラリのインストール
- その他必要な環境セットアップ
- ECR にコンテナイメージをプッシュ
- AWS Lambda 関数定義に ECR リポジトリとタグを指定
AWS CDK を利用すると Dockerfile 関数の定義と関数の定義だけでデプロイが可能で、他に必要な細かい設定を自動で作成してくれるため、比較的楽にデプロイできます。
サンプルプロジェクト構成
以下のようなサンプルプロジェクトを用意します。
./src/index.py
def lambda_handler(event, context):
print('## incoming event', event)
./requirements.txt
any_library==1.30.0
# ...
./Dockerfile
# AWS から提供されている、AWS LambdaでPythonが利用できるようにしたベースイメージです。
# 詳細はこちらをご確認ください。
# https://gallery.ecr.aws/lambda/python
FROM public.ecr.aws/lambda/python:3.11
COPY src/ requirements.txt ./
COPY requirements.txt ./
RUN python -m pip install --upgrade pip && python -m pip install -r requirements.txt
CMD ["index.lambda_handler"]
requirements.txt
については、例えば以下のような形で前もって準備しておく必要があります。
# venv などを利用している場合
pip freeze > requirements.txt
# poetry を利用している場合
poetry export --without=dev --format=requirements.txt > ./requirements.txt
CDK スタックを作成
以下のように定義していきます。この記事の例では TypeScript を利用していますが、Python で利用する場合でも同じインタフェースで記述可能です。
import * as cdk from 'aws-cdk-lib'
import { Construct } from 'constructs'
export interface Props extends cdk.StackProps { stage: string }
export class SampleLambdaPythonContainerStack extends cdk.Stack {
public readonly sampleFunction: cdk.aws_lambda.Function
constructor(scope: Construct, id: string, props: Props) {
super(scope, id, props)
this.sampleFunction = new cdk.aws_lambda.DockerImageFunction(this, `samplePythonContainerFunction-${props.stage}`, {
functionName: `samplePythonContainerFunction-${props.stage}`,
reservedConcurrentExecutions: 1,
memorySize: 512,
timeout: cdk.Duration.seconds(60),
code: cdk.aws_lambda.DockerImageCode.fromImageAsset('./')
// 既存 ECR リポジトリを利用する場合は以下のように指定できます。
// この場合、予めpushされているイメージがないと初回デプロイに失敗する点に要注意です。
// code: cdk.aws_lambda.DockerImageCode.fromEcr(new cdk.aws_ecr.Repository(...)),
})
}
}
Stack が作成できたら、実行用のスクリプトを書いていきます。
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib'
import { SampleLambdaPythonContainerStack } from './SampleLambdaPythonContainerStack'
const app = new cdk.App()
const STAGE = 'dev'
new SampleLambdaPythonContainerStack(app, `sample-lambda-python-container-${STAGE}`, {
stage: 'dev',
env: { region: 'us-west-2' }
})
デプロイと確認
AWS 認証情報をセットし、デプロイコマンドを実行します。
npx cdk deploy --all --require-approval never
ECR リポジトリを別途指定していない場合、以下のように自動作成されます。
作成された AWS Lambda を確認します。
ランタイムは以下のように表示されます。
以下のように、テスト実行で通せるか確認します。
以上、コンテナイメージで AWS Lambda を利用するイメージができたら幸いです。この記事に関する内容を含め、AWS Lambda を利用した開発全般において気になる点やサポートが必要な場合は、お気軽にお問い合わせください。