使用Cloudformation在S3存储桶中创建文件夹

shi*_*455 22 amazon-s3 aws-cloudformation

我可以使用cloudformation创建一个S3存储桶,但是想在S3存储桶中创建一个文件夹

<mybucket>--><myfolder>
Run Code Online (Sandbox Code Playgroud)

请让我知道用于在存储桶中创建文件夹的模板......两者都应该在同一时间创建...

我正在使用AWS lambda,如下所示

stackname = 'myStack'
client = boto3.client('cloudformation')
response = client.create_stack(
    StackName= (stackname),
    TemplateURL= 'https://s3.amazonaws.com/<myS3bucket>/<myfolder>/nestedstack.json',
    Parameters=<params>
)
Run Code Online (Sandbox Code Playgroud)

wjo*_*dan 21

AWS未提供正式的CloudFormation资源来在S3存储桶中创建对象.但是,您可以使用AWS SDK 创建Lambda支持的自定义资源来执行此功能,实际上gilt/cloudformation-helpers GitHub存储库提供了现成的自定义资源.

与任何自定义资源设置一样有点冗长,因为您需要首先部署Lambda函数和IAM权限,然后将其作为堆栈模板中的自定义资源引用.

首先,将Lambda::Function相关IAM::Role资源添加到堆栈模板:

"S3PutObjectFunctionRole": {
  "Type": "AWS::IAM::Role",
  "Properties": {
    "AssumeRolePolicyDocument": {
      "Version" : "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [ "lambda.amazonaws.com" ]
          },
          "Action": [ "sts:AssumeRole" ]
        }
      ]
    },
    "ManagedPolicyArns": [
      { "Ref": "RoleBasePolicy" }
    ],
    "Policies": [
      {
        "PolicyName": "S3Writer",
        "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "s3:DeleteObject",
                "s3:ListBucket",
                "s3:PutObject"
              ],
              "Resource": "*"
            }
          ]
        }
      }
    ]
  }
},
"S3PutObjectFunction": {
  "Type": "AWS::Lambda::Function",
  "Properties": {
    "Code": {
      "S3Bucket": "com.gilt.public.backoffice",
      "S3Key": "lambda_functions/cloudformation-helpers.zip"
    },
    "Description": "Used to put objects into S3.",
    "Handler": "aws/s3.putObject",
    "Role": {"Fn::GetAtt" : [ "S3PutObjectFunctionRole", "Arn" ] },
    "Runtime": "nodejs",
    "Timeout": 30
  },
  "DependsOn": [
    "S3PutObjectFunctionRole"
  ]
},
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Lambda函数作为自定义资源来创建S3对象:

"MyFolder": {
  "Type": "Custom::S3PutObject",
  "Properties": {
    "ServiceToken": { "Fn::GetAtt" : ["S3PutObjectFunction", "Arn"] },
    "Bucket": "mybucket",
    "Key": "myfolder/"
  }
},
Run Code Online (Sandbox Code Playgroud)

您还可以使用相同的自定义资源来编写基于字符串的S3对象,方法是添加一个Body参数BucketKey(参见文档).


Joh*_*ein 16

使用AWS CloudFormation模板无法做到这一点.

应该提到的是,Amazon S3中实际上并不存在文件夹.而是将对象的路径添加到对象的name(key)之前.

因此,bar.txt存储在名为的文件夹中的文件foo实际上存储有以下Key:foo/bar.txt

您还可以将文件复制到不存在的文件夹,并自动创建该文件夹(实际上并非如此,因为文件夹本身不存在).但是,管理控制台将提供此类文件夹的外观,并且路径将建议将其存储在此类文件夹中.

底线:无需预先创建文件夹.只是使用它就像它已经存在一样.

  • 您尚未解释如何打算将文件放置在此处,但是答案是...放置在这里!如果您使用“ templates / nestedstack.json”之类的路径将文件复制到存储桶中,则该文件将成为对象的名称(键)。它看起来像在文件夹中,但不是。无需预先创建文件夹-只需存储文件即可使用。 (3认同)