如何解决 AWS::Lambda::Function 资源中的只写属性问题
本主题介绍如何解决在使用 IaC 生成器时的 AWS::Lambda::Function 资源只写属性问题。
问题
AWS::Lambda::Function
资源具有三组互斥属性,用于指定 Lambda 代码:
-
Code/S3Bucket
和Code/S3Key
属性,以及可选的Code/S3ObjectVersion
属性 -
Code/ImageUri
属性 -
Code/ZipFile
属性
任何给定的 AWS::Lambda::Function
资源只能使用其中的一组属性。
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
GetFunction
API 操作(例如,通过使用aws lambda get-function
AWS CLI 命令)。 -
在响应中,如果代码位于 Amazon S3 存储桶中,则
RepositoryType
参数为S3
;如果代码位于 Amazon ECR 存储库中,则该参数为ECR
。 -
在响应中,
Location
参数包含一个预签名 URL,您可以用其下载部署包 10 分钟。下载代码。 -
将代码上传到 Amazon S3 存储桶。
-
使用生成的模板运行导入操作,并提供桶名称和密钥作为参数值。