如何使用自定义资源通过CloudFormation模板将内容上传到S3存储桶?

时间:2020-05-11 18:43:59

标签: amazon-web-services amazon-s3 amazon-cloudformation aws-cloudformation-custom-resource

这对cloudformation模板来说还是一个新手,但是我想要创建一个模板,在其中创建一个S3存储桶,并将内容从另一个帐户(也是我的)从另一个S3存储桶导入到该存储桶中。我意识到CloudFormation本身不支持将内容导入S3存储桶,因此我必须利用自定义资源。我找不到执行此类任务的任何参考/资源。希望有人可以就如何解决这个问题提供一些示例甚至指导。

非常感谢您!

2 个答案:

答案 0 :(得分:3)

无法提供完整的代码,但可以提供一些指导。这样做的方法很少,但我将列出其中一种:

  1. 为第二个帐户中的存储桶创建一个存储桶策略。该策略应允许第一个帐户(带有cfn的帐户)读取它。有很多资源可以做到这一点。来自AWS的一个是here

  2. 在具有执行角色的第一个帐户中创建独立lambda函数,以使其能够从第二个帐户读取存储桶。这不是自定义资源。此lambda函数的目的是测试跨帐户权限,以及从中读取对象的代码。这就像一个测试功能,用于整理所有权限并优化对象复制代码从一个存储桶到另一个存储桶。

  3. 您的lambda函数按预期工作后,您可以将其修改(或创建新的lambda函数)作为CFN中的自定义资源。作为自定义资源,它将需要将您在cfn中新创建的存储桶作为其参数之一。为了更轻松地创建自定义资源,可以使用this aws helper。

请注意,lambda执行超时为 15分钟。取决于您有多少个对象,可能还不够。

希望这会有所帮助。

答案 1 :(得分:0)

如果Custom Resources吓到了您,那么一种更简单的方法是使用通过用户数据指定的启动脚本来启动Amazon EC2实例。

CloudFormation模板可以通过引用已创建的存储桶资源,将新存储桶的名称“插入”到脚本中。然后,该脚本可以运行AWS CLI命令来复制文件。

另外,它并不昂贵。一个t3.micro实例大约每小时1c,每秒收费 ,因此几乎免费。