我编写了一个 cloudformation 脚本,用于创建带有版本控制和生命周期规则的 s3 bucket。现在我想将一个文件(文本文档)从本地计算机上传到新创建的 s3 bucket,但我不想手动执行此操作。有什么方法可以在 cloudformation 脚本中为我的文件提供路径或任何其他建议吗?这是我的 CF 脚本
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Resources" : {
"S3Bucket" : {
"Type" : "AWS::S3::Bucket",
"Properties" : {
"AccessControl" : "PublicRead",
"BucketName" : "s3testdemo",
"LifecycleConfiguration": {
"Rules": [
{
"Id": "GlacierRule",
"Status": "Enabled",
"ExpirationInDays": "365",
"Transition": {
"TransitionInDays": "30",
"StorageClass": "Glacier"
}
}
]
},
"VersioningConfiguration" : {
"Status" : "Enabled"
}
}
}
}
}
答案1
如果我理解正确的话,您问的是是否有办法通过创建存储桶的 CloudFormation 堆栈将文件上传到 S3 存储桶。答案是肯定的,但这并不简单或直接。
有两种方法可以实现这一点。
1) 创建一个在启动时上传文件的 EC2 实例。您可能不想启动 EC2 实例并让它运行只是为了提交单个文件,但这样做是可行的。
2) 使用 Lambda 支持的自定义资源。请参阅http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html有关自定义资源的信息。在 CloudFormation 中,您可以创建 Lambda 函数本身,然后基于该 Lambda 函数创建自定义资源。创建自定义资源后,将调用 Lambda 函数,您可以使用该函数调用来上传文件。
请注意,这两种方法还需要创建 IAM 角色来授予执行 S3 上传所需的权限。
答案2
请参阅AWS 文档:
- https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-package.html
- https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html
对于某些需要 Amazon S3 位置(存储桶名称和文件名)的资源属性,您可以改为指定本地引用。例如,您可以指定 AWS Lambda 函数的源代码或 Amazon API Gateway REST API 的 OpenAPI(以前称为 Swagger)文件的 S3 位置。您无需手动将文件上传到 S3 存储桶,然后将位置添加到模板,而是可以在模板中指定本地引用(称为本地构件),然后使用 package 命令快速上传它们。本地构件是 package 命令上传到 Amazon S3 的文件或文件夹的路径。例如,构件可以是 AWS Lambda 函数的源代码或 Amazon API Gateway REST API 的 OpenAPI 文件的本地路径。
我刚刚使用 AWS SAM 对 Glue 作业 ScriptLocation 进行了测试,效果非常好