create folder inside S3 bucket using Cloudformation

前端 未结 4 1483
死守一世寂寞
死守一世寂寞 2021-02-01 16:47

I\'m able to create an S3 bucket using cloudformation but would like to create a folder inside an S3 bucket..like

-->
<         


        
4条回答
  •  迷失自我
    2021-02-01 17:07

    AWS doesn't provide an official CloudFormation resource to create objects within an S3 bucket. However, you can create a Lambda-backed Custom Resource to perform this function using the AWS SDK, and in fact the gilt/cloudformation-helpers GitHub repository provides an off-the-shelf custom resource that does just this.

    As with any Custom Resource setup is a bit verbose, since you need to first deploy the Lambda function and IAM permissions, then reference it as a custom resource in your stack template.

    First, add the Lambda::Function and associated IAM::Role resources to your stack template:

    "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"
      ]
    },
    

    Then you can use the Lambda function as a Custom Resource to create your S3 object:

    "MyFolder": {
      "Type": "Custom::S3PutObject",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt" : ["S3PutObjectFunction", "Arn"] },
        "Bucket": "mybucket",
        "Key": "myfolder/"
      }
    },
    

    You can also use the same Custom Resource to write a string-based S3 object by adding a Body parameter in addition to Bucket and Key (see the docs).

提交回复
热议问题