AWS::Lambda::Function リソースの書き込み専用プロパティの問題を解決する方法
このトピックでは、IaC ジェネレーターを使用するときの AWS::Lambda::Function リソースの書き込み専用プロパティの問題を解決する方法について説明します。
問題
AWS::Lambda::Function リソースには、Lambda コードを指定するための相互に排他的なプロパティのセットが 3 つあります。
-
Code/S3BucketとCode/S3Keyのプロパティ、およびオプションでCode/S3ObjectVersionのプロパティです。 -
Code/ImageUriプロパティ -
Code/ZipFileプロパティ
特定の AWS::Lambda::Function リソースに使用できるのは、これらのセットの 1 つだけです。
IaC ジェネレーターは、リソースの作成または更新に排他的な書き込み専用プロパティのどのセットが使用されたのかを特定することはできません。そのため、これには、生成されたテンプレートの最初のプロパティのセットのみが含まれます。Code/ImageUri プロパティと Code/ZipFile プロパティは省略されます。
さらに、IaC ジェネレーターは次の警告を発行します。
-
MUTUALLY_EXCLUSIVE_PROPERTIES–Code/S3BucketおよびCode/S3Keyが相互に排他的なプロパティとして識別されることを警告します。 -
UNSUPPORTED_PROPERTIES–Code/S3ObjectVersionプロパティがサポートされていないことを警告します。
生成されたテンプレートに AWS::Lambda::Function リソースを含めるには、正しいコードプロパティでテンプレートをダウンロードして更新する必要があります。
解決方法
Lambda コードを Amazon S3 バケットに保存し、S3ObjectVersion プロパティを使用しない場合、生成されたテンプレートを修正せずにそのままインポートすることができます。IaC ジェネレーターは、インポートオペレーション中に、テンプレートのパラメータとして Amazon S3 バケットとキーを要求します。
Lambda コードを Amazon ECR リポジトリとして保存する場合は、以下の手順に従ってテンプレートを更新します。
-
生成されたテンプレートをダウンロードします。
-
生成されたテンプレートから、
Code/S3BucketおよびCode/S3Keyプロパティのプロパティと対応するパラメータを削除します。 -
生成されたテンプレートで削除したプロパティを
Code/ImageUriプロパティに置き換え、Amazon ECR リポジトリの URL を指定します。 -
生成されたテンプレートを IaC ジェネレーターのコンソールで開き、[編集したテンプレートをインポート] をクリックします。
Lambda コードを zip ファイルとして保存する場合は、以下の手順に従ってテンプレートを更新します。
-
生成されたテンプレートをダウンロードします。
-
生成されたテンプレートから、
Code/S3BucketおよびCode/S3Keyプロパティのプロパティと対応するパラメータを削除します。 -
生成されたテンプレートの削除されたプロパティを
Code/ZipFileプロパティに置き換えます。 -
生成されたテンプレートを IaC ジェネレーターのコンソールで開き、[編集したテンプレートをインポート] をクリックします。
Lambda コードのコピーがない場合は、以下の手順に従ってテンプレートを更新します。
-
AWS Lambda
GetFunctionAPI アクションを使用します (aws lambda get-functionAWS CLI コマンドを使用するなど)。 -
レスポンスの
RepositoryTypeパラメータは、コードが Amazon S3 バケットにある場合はS3、コードが Amazon ECR リポジトリにある場合はECRです。 -
レスポンスの
Locationパラメータには、デプロイパッケージを 10 分間ダウンロードするときに使用できる、署名付き URL が含まれています。コードをダウンロードします。 -
このコードを Amazon S3 バケットにファイルをアップロードします。
-
生成されたテンプレートを使ってインポートオペレーションを実行し、パラメータ値としてバケット名とキーを指定します。