Solución:
AWS no proporciona un recurso oficial de CloudFormation para crear objetos dentro de un bucket de S3. Sin embargo, puede crear un recurso personalizado respaldado por Lambda para realizar esta función utilizando el AWS SDK y, de hecho, el repositorio de GitHub de gilt / cloudformation-helpers proporciona un recurso personalizado listo para usar que hace precisamente esto.
Al igual que con cualquier configuración de recurso personalizado, es un poco detallada, ya que primero debe implementar la función Lambda y los permisos de IAM, y luego hacer referencia a él como un recurso personalizado en su plantilla de pila.
Primero, agregue el Lambda::Function
y asociado IAM::Role
recursos a su plantilla de pila:
"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"
]
},
Luego, puede usar la función Lambda como un recurso personalizado para crear su objeto S3:
"MyFolder": {
"Type": "Custom::S3PutObject",
"Properties": {
"ServiceToken": { "Fn::GetAtt" : ["S3PutObjectFunction", "Arn"] },
"Bucket": "mybucket",
"Key": "myfolder/"
}
},
También puede usar el mismo recurso personalizado para escribir un objeto S3 basado en cadenas agregando un Body
parámetro además de Bucket
y Key
(ver los documentos).
Esto no es posible con una plantilla de AWS CloudFormation.
Cabe mencionar que las carpetas no existen realmente en Amazon S3. En cambio, la ruta de un objeto se antepone al nombre (key
) de un objeto.
Entonces, archivo bar.txt
almacenado en una carpeta llamada foo
en realidad se almacena con una clave de: foo/bar.txt
También puede copiar archivos a una carpeta que no existe y la carpeta se creará automáticamente (lo que en realidad no es cierto, ya que la carpeta en sí no existe). Sin embargo, la Consola de administración proporcionará la apariencia de dicha carpeta y la ruta sugerirá que está almacenada en dicha carpeta.
Línea de fondo: No es necesario crear previamente una carpeta. Úselo como si ya estuviera allí.