如何解决 AWS::Lambda::Function 资源中的只写属性问题 - AWS CloudFormation

如何解决 AWS::Lambda::Function 资源中的只写属性问题

本主题介绍如何解决在使用 IaC 生成器时的 AWS::Lambda::Function 资源只写属性问题。

问题

AWS::Lambda::Function 资源具有三组互斥属性,用于指定 Lambda 代码:

  • Code/S3BucketCode/S3Key 属性,以及可选的 Code/S3ObjectVersion 属性

  • Code/ImageUri 属性

  • Code/ZipFile 属性

任何给定的 AWS::Lambda::Function 资源只能使用其中的一组属性。

IaC 生成器无法确定使用了哪组互斥只写属性来创建或更新资源,因此,生成的模板中仅包含第一组属性。Code/ImageUriCode/ZipFile 属性将被忽略。

此外,IaC 生成器会发出以下警告:

  • MUTUALLY_EXCLUSIVE_PROPERTIES – 警告 Code/S3BucketCode/S3Key 被标识为互斥属性。

  • UNSUPPORTED_PROPERTIES – 警告 Code/S3ObjectVersion 属性不受支持。

要在生成的模板中包含 AWS::Lambda::Function 资源,您必须下载模板并使用正确的代码属性更新该模板。

解决方案

如果您将 Lambda 代码存储在 Amazon S3 存储桶中并且不使用 S3ObjectVersion 属性,则无需任何修改即可导入生成的模板。在导入操作期间,IaC 生成器将要求您提供 Amazon S3 存储桶和密钥作为模板参数。

如果将 Lambda 代码存储为 Amazon ECR 存储库,则您可以按照以下说明更新您的模板:
  1. 下载生成的模板。

  2. 从生成的模板中删除 Code/S3BucketCode/S3Key 属性的属性和相应参数。

  3. 将生成的模板中已删除的属性替换为 Code/ImageUri 属性,指定 Amazon ECR 存储库的 URL。

  4. 在 IaC 生成器控制台中打开生成的模板,然后选择导入编辑的模板按钮。

如果您将 Lambda 代码存储为 zip 文件,则可以按照以下说明更新您的模板:
  1. 下载生成的模板。

  2. 从生成的模板中删除 Code/S3BucketCode/S3Key 属性的属性和相应参数。

  3. 将生成的模板中已删除的属性替换为 Code/ZipFile 属性。

  4. 在 IaC 生成器控制台中打开生成的模板,然后选择导入编辑的模板按钮。

如果没有 Lambda 代码的副本,则您可以按照以下说明更新您的模板:
  1. 使用 AWS Lambda GetFunction API 操作(例如,通过使用 aws lambda get-function AWS CLI 命令)。

  2. 在响应中,如果代码位于 Amazon S3 存储桶中,则 RepositoryType 参数为 S3;如果代码位于 Amazon ECR 存储库中,则该参数为 ECR

  3. 在响应中,Location 参数包含一个预签名 URL,您可以用其下载部署包 10 分钟。下载代码。

  4. 将代码上传到 Amazon S3 存储桶。

  5. 使用生成的模板运行导入操作,并提供桶名称和密钥作为参数值。