AWS Lambda をコンテナイメージで利用するために必要なこと
最小構成かつ最も手間をかけずデプロイできるツールとして AWS CDK がおすすめです。AWS CDK を利用しない場合でも、以下のようなステップでコンテナイメージとリソースを作成していけばデプロイが可能になります。
- コンテナイメージ作成(Dockerfile 作成)
- 実行可能なソースコード
- 依存ライブラリのインストール
- その他必要な環境セットアップ
- ECR にコンテナイメージをプッシュ
- AWS Lambda 関数定義に ECR リポジトリとタグを指定
AWS CDK を利用すると Dockerfile 関数の定義と関数の定義だけでデプロイが可能で、他に必要な細かい設定を自動で作成してくれるため、比較的楽にデプロイできます。
サンプルプロジェクト構成
以下のようなサンプルプロジェクトを用意します。
./src/index.mjs
export const handler = async (event, context) => {
console.log('## incoming event', event)
}
./Dockerfile
# AWS から提供されている、AWS LambdaでNode.jsが利用できるようにしたベースイメージです。
# 詳細はこちらをご確認ください。
# https://gallery.ecr.aws/lambda/nodejs
FROM public.ecr.aws/lambda/nodejs:20
COPY src/ ./
COPY package.json ./
COPY package-lock.json ./
RUN npm install
CMD ["index.handler"]
上記に加え、 package.json
および package-lock.json
も合わせて適宜用意してください。
CDK スタックを作成
TypeScript を使って以下のように定義していきます。
import * as cdk from 'aws-cdk-lib'
import { Construct } from 'constructs'
export interface Props extends cdk.StackProps { stage: string }
export class SampleLambdaNodeContainerStack 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, `sampleNodeContainerFunction-${props.stage}`, {
functionName: `sampleNodeContainerFunction-${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 { SampleLambdaNodeContainerStack } from './SampleLambdaNodeContainerStack'
const app = new cdk.App()
const STAGE = 'dev'
new SampleLambdaNodeContainerStack(app, `sample-lambda-node-container-${STAGE}`, {
stage: 'dev',
env: { region: 'us-west-2' }
})
デプロイと確認
AWS 認証情報をセットし、デプロイコマンドを実行します。
npx cdk deploy --all --require-approval never
ECR リポジトリを別途指定していない場合、以下のように自動作成されます。
作成された AWS Lambda を確認します。
ランタイムは以下のように表示されます。
以下のように、テスト実行で通せるか確認します。
以上、コンテナイメージで AWS Lambda を利用するイメージができたら幸いです。この記事に関する内容を含め、AWS Lambda を利用した開発全般において気になる点やサポートが必要な場合は、お気軽にお問い合わせください。