Ответ 1
AWS не предоставляет официальный ресурс CloudFormation для создания объектов в ведре S3. Тем не менее, вы можете создать Lambda-backed Custom Resource для выполнения этой функции с помощью AWS SDK, и фактически gilt/cloudformation-helpers Репозиторий GitHub предоставляет готовый пользовательский ресурс, который делает именно это.
Как и в любой настройке Custom Resource, это немного многословно, так как вам нужно сначала развернуть функции 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/"
}
},
Вы также можете использовать один и тот же пользовательский ресурс для записи строкового объекта S3 путем добавления параметра Body
в дополнение к Bucket
и Key
(см. документы).