what the name maximum examples cloudformation aws amazon-web-services amazon-s3 aws-cli

amazon-web-services - the - cloudformation s3 examples



¿Puedo obligar a CloudFormation a eliminar el Bucket S3 no vacío? (4)

Bien

Qué tal esto:

import boto3 s3 = boto3.client(''s3'') res = boto3.resource(''s3'') buckets = s3.list_buckets() try: for bk in buckets[''Buckets'']: bucket = res.Bucket(bk[''Name'']) bucket.objects.all().delete() bucket.delete() except Exception as e: print e

¿Hay alguna forma de obligar a CloudFormation a eliminar un Bucket S3 no vacío?


Creo que su DependsOn está en el recurso incorrecto, al menos no me funcionó correctamente porque en la eliminación de la pila (a través de la consola), intentaría forzar la eliminación del depósito primero, que fallará, y luego intentará eliminar el recurso personalizado, lo que activa el lambda para vaciar el cubo. Esto vaciará el depósito pero la eliminación de la pila fallará porque intentó eliminar el depósito antes de que estuviera vacío. Queremos iniciar primero la eliminación de recursos personalizados y luego intentar eliminar el grupo después de que se elimine el recurso personalizado, así que lo hice de esta manera y me funciona:

myBucketResource: Type: AWS::S3::Bucket Properties: BucketName: my-test-bucket-cleaning-on-delete cleanupBucketOnDelete: Type: Custom::cleanupbucket Properties: ServiceToken: arn:aws:lambda:eu-west-1:123456789012:function:clean-bucket-lambda BucketName: my-test-bucket-cleaning-on-delete DependsOn: myBucketResource

De esta manera, se asegura de que la eliminación del depósito no sea lo primero, ya que existe otro recurso que depende de él, por lo que el recurso dependiente se elimina primero (lo que hace que la lambda vacíe el depósito) y luego se elimina el depósito. Espero que alguien lo encuentre útil.


Debes vaciar el cubo:

$ aws s3 rm s3://bucket-name --recursive

A continuación, elimine el cubo

$ aws cloudformation delete-stack --stack-name mys3stack


Puede crear una función lambda para limpiar su grupo e invocar su lambda desde su pila de CloudFormation usando un CustomResource .

Abajo un ejemplo de lambda limpiando tu cubo:

#!/usr/bin/env python # -*- coding: utf-8 -*- import json import boto3 from botocore.vendored import requests def lambda_handler(event, context): try: bucket = event[''ResourceProperties''][''BucketName''] if event[''RequestType''] == ''Delete'': s3 = boto3.resource(''s3'') bucket = s3.Bucket(bucket) for obj in bucket.objects.filter(): s3.Object(bucket.name, obj.key).delete() sendResponseCfn(event, context, "SUCCESS") except Exception as e: print(e) sendResponseCfn(event, context, "FAILED") def sendResponseCfn(event, context, responseStatus): response_body = {''Status'': responseStatus, ''Reason'': ''Log stream name: '' + context.log_stream_name, ''PhysicalResourceId'': context.log_stream_name, ''StackId'': event[''StackId''], ''RequestId'': event[''RequestId''], ''LogicalResourceId'': event[''LogicalResourceId''], ''Data'': json.loads("{}")} requests.put(event[''ResponseURL''], data=json.dumps(response_body))

Después de crear la lambda anterior, simplemente coloque el CustomResource en su pila de CloudFormation:

--- AWSTemplateFormatVersion: ''2010-09-09'' Resources: myBucketResource: Type: AWS::S3::Bucket Properties: BucketName: my-test-bucket-cleaning-on-delete DependsOn: cleanupBucketOnDelete cleanupBucketOnDelete: Type: Custom::cleanupbucket Properties: ServiceToken: arn:aws:lambda:eu-west-1:123456789012:function:clean-bucket-lambda BucketName: my-test-bucket-cleaning-on-delete

Recuerde adjuntar un rol a su lambda que tenga permiso para eliminar objetos de su grupo.

Además, tenga en cuenta que puede crear una función lambda que acepte la línea de comandos de la CLI utilizando la función lambda cli2cloudformation . Puede descargar e instalar desde here . Usando eso, solo necesitas crear un CustomResource como abajo:

"removeBucket": { "Type": "Custom::cli2cloudformation", "Properties": { "ServiceToken": "arn:aws:lambda:eu-west-1:123456789000:function:custom-lambda-name", "CliCommandDelete": "aws s3 rb s3://bucket-name --force", } }