🤖
AWS Lambdaのデプロイパッケージタイプは変更できない
概要
AWS Lambdaのパッケージタイプは変更できないので新規作成することになる。
内容
新規作成する場合の方法は2つ。
- 同名の関数として作成する場合
- 別名の関数として作成する場合
1と2の選択は状況による。Lambdaが処理するトラフィックが少ない、定常的ではなくサービス影響が低いなら1でもいい。2の場合は一定期間2つのLambdaを起動させることを期待するのでサービスの影響を減らせるが、Lambdaのトリガーやアプリケーションの振る舞いによってはコンシューマが重複して処理する可能性を考慮する必要がある。
以降、1の場合を例にとって、簡単な手順を書いてみる。
同名の関数として作成する場合
前提として、LambdaはAWS SAMを用いて構築し、パッケージタイプはZipからImageに変更したい場合とする。
以下、作業項目を書く。
- AWS ECRリポジトリの作成
- IAMロールでECS関連のリソース・アクション追加
- CloudFormationのスタック削除
- デプロイ
AWS ECRリポジトリの作成
関数のイメージのアップロード先を作成する必要がある。
IAMロールでECS関連のリソース・アクション追加
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html#gettingstarted-images-permissions を参考に使用しているロールが権限を持っているかを確認する。
以下、同一AWSアカウント内の関数を扱い、ビルド(プッシュ)とデプロイの権限を分けない場合。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRPolicy",
"Effect": "Allow",
"Action": [
"ecr:SetRepositoryPolicy",
"ecr:GetRepositoryPolicy",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Resource": "arn:aws:ecr:us-east-1:*:repository/hello-world"
}
]
}
CloudFormationのスタック削除
SAMはCloudFormationを通じてリソースを作成する。Lambdaのパッケージタイプを変更できないので、スタック自体の削除が必要になる。AWSコンソールから、samのコマンドラインからなど削除する。
※ 何回か実際に操作した際、スタックの状態が DELETE_IN_PROGRESS のまま数分で終わることもあれば、10分以上かかることもありバラツキがあった
デプロイ
- SAMによるデプロイでは、ECRリポジトリURIを指定する必要がある。
--image-repository
にURIを設定する - テンプレートについては省略
- レジストリの認証(ECRを使用するので)は省略
参考
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html#gettingstarted-images-permissions
- https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html
Discussion