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参数Bucket和Key(参见文档).
Joh*_*ein 16
使用AWS CloudFormation模板无法做到这一点.
应该提到的是,Amazon S3中实际上并不存在文件夹.而是将对象的路径添加到对象的name(key)之前.
因此,bar.txt存储在名为的文件夹中的文件foo实际上存储有以下Key:foo/bar.txt
您还可以将文件复制到不存在的文件夹,并自动创建该文件夹(实际上并非如此,因为文件夹本身不存在).但是,管理控制台将提供此类文件夹的外观,并且路径将建议将其存储在此类文件夹中.
底线:无需预先创建文件夹.只是使用它就像它已经存在一样.