Serverless Operations, inc

>_cd /blog/id_yon4kvpdlcj2

title

AWS Lambda をコンテナイメージでデプロイする方法(Node.js)

summary

AWS Lambda のパッケージを作成する際、どうしても各言語の標準ランタイムではなくコンテナイメージを作成したくなる場合があります。パッケージ容量の制限(250MB)に引っかかってしまったり、使用するライブラリによっては込み入った環境設定が必要になることもあるかと思います。この記事では、Node.js を利用したいけども、Lambda のランタイムはより自由度の高いコンテナイメージを利用したい時のデプロイ方法についてお伝えします。

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 を利用した開発全般において気になる点やサポートが必要な場合は、お気軽にお問い合わせください。

Written by
COO

金 仙優

Sonu Kim

  • Facebook->
  • X->
  • GitHub->

Share

Facebook->X->
Back
to list
<-