🤖

AWS Lambdaのデプロイパッケージタイプは変更できない

2024/03/08に公開

概要

AWS Lambdaのパッケージタイプは変更できないので新規作成することになる。

内容

新規作成する場合の方法は2つ。

  1. 同名の関数として作成する場合
  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を使用するので)は省略

参考

Discussion