Serverless Operations, inc

>_cd /blog/id_pgoday8w1_t

title

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

summary

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

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

Written by
COO

金 仙優

Sonu Kim

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

Share

Facebook->X->
Back
to list
<-