【问题标题】:How to upload contents into S3 bucket via CloudFormation template using custom resource?如何使用自定义资源通过 CloudFormation 模板将内容上传到 S3 存储桶?
【发布时间】:2020-08-27 10:09:40
【问题描述】:
cloudformation 模板相当新,但我只是希望创建一个模板,在该模板中创建一个 S3 存储桶并将内容从来自不同帐户(也是我的)的另一个 S3 存储桶导入该存储桶。我意识到 CloudFormation 本身不支持将内容导入 S3 存储桶,我必须使用自定义资源。我找不到执行此类任务的任何参考/资源。希望有人能指出一些例子,甚至是一些关于如何解决这个问题的指导。
非常感谢!
【问题讨论】:
-
哪部分不明白?创建自定义资源(您是否阅读过docs?)或从属于不同帐户的存储桶中复制文件?
标签:
amazon-web-services
amazon-s3
amazon-cloudformation
aws-cloudformation-custom-resource
【解决方案1】:
无法提供完整代码,但可以提供一些指导。有几种方法可以做到这一点,但我会列出一种:
为第二个账户中的存储桶创建一个存储桶策略。该策略应允许第一个帐户(具有 cfn 的帐户)读取它。有很多资源可以做到这一点。来自 AWS 的一位是 here。
在第一个账户中创建一个独立的 lambda 函数,执行角色允许它从第二个账户读取存储桶。这还不是自定义资源。此 lambda 函数的目的是测试跨帐户权限,以及从中读取对象的代码。这就像一个测试函数,用于整理所有权限并完善对象从一个存储桶复制代码到另一个存储桶。
一旦您的 lambda 函数按预期工作,您可以将其修改(或创建新的)作为 CFN 中的 自定义资源。作为自定义资源,它需要将您在 cfn 中新创建的存储桶作为其参数之一。为了更轻松地创建自定义资源 this 可以使用 aws 助手。
请注意,lambda 执行超时为 15 分钟。根据您拥有的对象数量,可能还不够。
希望这会有所帮助。
【解决方案2】:
如果自定义资源让您感到害怕,那么更简单的方法是使用通过用户数据指定的启动脚本启动 Amazon EC2 实例。
CloudFormation 模板可以通过引用已创建的存储桶资源将新存储桶的名称“插入”到脚本中。然后该脚本可以运行 AWS CLI 命令来复制文件。
另外,它并不昂贵。 t3.micro 实例的费用约为 1c/小时,并且按每秒收费,因此非常接近免费。