通过 cloudformation 脚本将文件从本地机器上传到 s3 存储桶

通过 cloudformation 脚本将文件从本地机器上传到 s3 存储桶

我编写了一个 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 文档:

对于某些需要 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 进行了测试,效果非常好

相关内容