kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CDK で外部パッケージを含む Python の AWS Lambda 関数をデプロイする

AWS CDK で外部パッケージを含む Python の AWS Lambda 関数をデプロイする場合,requirements.txt から依存関係を解決して,デプロイするアセットとして ZIP にまとめる(バンドルする)必要がある💡

今回は aws-cdk-lib.aws_lambda module@aws-cdk/aws-lambda-python-alpha module を使う方法を試す❗️

前提

今回はサンプルとして requests に依存したコードを以下のディレクトリ構成で置いてある前提とする \( 'ω')/

functions/requests
├── app.py
└── requirements.txt

aws_lambda module を使う

まず,AWS CDK で AWS Lambda 関数をデプロイするときによく使う aws_lambda module では Code.fromAsset のオプションとして BundlingOptions を設定できる.

docs.aws.amazon.com

実装としてはザッとこんな感じになる 👾

Python のコンテナ内で pip install コマンドを実行して /asset-output ディレクトリに依存関係をインストールしたら,後はそのまま ZIP にまとめて(バンドルして)デプロイされる👌

new aws_lambda.Function(this, 'PythonFunction', {
  functionName: 'sandbox-python-function',
  runtime: aws_lambda.Runtime.PYTHON_3_12,
  handler: 'app.lambda_handler',
  code: aws_lambda.Code.fromAsset(path.join(__dirname, '../functions/requests'), {
    bundling: {
      image: aws_lambda.Runtime.PYTHON_3_12.bundlingImage,
      command: [
        'bash', '-c',
        'pip install -r requirements.txt -t /asset-output && cp -au . /asset-output'
      ]
    }
  })
})

aws-lambda-python-alpha module を使う

まだ alpha ではあるけど aws-lambda-python-alpha module を使うと entry に指定したディレクトリにある requirements.txtPipfile から自動的に依存関係を解決してくれる👌

実装としてはザッとこんな感じになる 👾

new aws_lambda_python_alpha.PythonFunction(this, 'PythonFunctionAlpha', {
  functionName: 'sandbox-python-function-alpha',
  runtime: aws_lambda.Runtime.PYTHON_3_12,
  index: 'app.py',
  handler: 'lambda_handler',
  entry: path.join(__dirname, '../functions/requests'),
})

aws_lambda.Function のプロパティもサポートされてるし,Lambda Layer も簡単にデプロイできるし便利〜 \( 'ω')/

docs.aws.amazon.com

デプロイ確認

期待通りに requirements.txt に定義した requests をデプロイできている❗️