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/"
}
},
你除了Bucket
和Key
(请参阅docs)之外,还可以使用相同的自定义资源通过添加Body
参数来编写基于字符串的S3对象。
实际上,我需要从lambda函数调用S3 bucket中的文件夹下的cloudformation jsons ...所以如果不需要创建文件夹,我应该在哪里放置我的jsons? – shiv455
您能否提供有关您的实际需求的更多信息(例如,您称为“调用cloudformation jsons”是什么意思)?最好的方法是用你尝试过的东西以及遇到的问题来更新原始问题。 –
更新我的问题,请检查!!! ..我试图创建多个资源(SNS,EC2等..)使用AWS lambda调用create_stack API其中nestedstack.json是其中一个参数.... – shiv455