2016-04-28 56 views
13

S3斗内创建文件夹,我能创建使用cloudformation的S3桶,但想bucket..like使用Cloudformation

<mybucket>--><myfolder> 

创建S3中的文件夹,请让我知道模板是用于创建一个文件夹......两者都应该在的Sametime创建一个桶内...

我使用AWS拉姆达如下

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

回答

11

AWS不提供官方的CloudFormation资源来在S3存储桶中创建对象。但是,您可以使用AWS软件开发工具包创建Lambda-backed Custom Resource以执行此功能,实际上,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" 
    ] 
}, 

然后你可以使用lambda函数的自定义资源来创建S3对象:

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

你除了BucketKey(请参阅docs)之外,还可以使用相同的自定义资源通过添加Body参数来编写基于字符串的S3对象。

5

这是不可能的使用AWS CloudFormation templa TE。

应该提及的是,文件夹实际上并不存在于亚马逊S3中。相反,对象的路径前缀为对象的名称(key)。

因此,储存在名为foo文件夹中的文件bar.txt实际上是用存储的密钥:foo/bar.txt

您也可以将文件复制到文件夹中不存在的文件夹会自动创建(这是因为文件夹本身不存在)。但是,管理控制台将提供此类文件夹的外观,并且路径会建议将其存储在此文件夹中。

底线:无需预先创建文件夹。只要使用它就好像它已经在那里一样。

+0

实际上,我需要从lambda函数调用S3 bucket中的文件夹下的cloudformation jsons ...所以如果不需要创建文件夹,我应该在哪里放置我的jsons? – shiv455

+0

您能否提供有关您的实际需求的更多信息(例如,您称为“调用cloudformation jsons”是什么意思)?最好的方法是用你尝试过的东西以及遇到的问题来更新原始问题。 –

+0

更新我的问题,请检查!!! ..我试图创建多个资源(SNS,EC2等..)使用AWS lambda调用create_stack API其中nestedstack.json是其中一个参数.... – shiv455