Saltar al contenido

crear una carpeta dentro del depósito de S3 usando Cloudformation

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í.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *