¿Cómo puedo reutilizar los recursos existentes en CloudFormation?

32

Tengo un depósito S3 como recurso en mi plantilla de CloudFormation. Con DeletionPolicyconjunto a Retain. Esto funciona como se esperaba, al eliminar la pila, de hecho, retiene el depósito. Sin embargo, cuando intento crear la pila nuevamente, la creación falla al intentar crear el mismo depósito nuevamente, con un mensaje de error quejándose de que ya existe.

¿Qué necesito agregar a mi plantilla de CloudFormation para que no intente recrear un recurso que ya existe?

El fragmento relevante de mi plantilla es el siguiente:

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }
vartec
fuente
fuera de interés, ¿para qué se usa el cubo? Tal vez hay otra forma de evitarlo dependiendo de lo que intentes hacer.
Drew Khoury el

Respuestas:

15

Un enfoque es agregar un parámetro de entrada a la plantilla de CloudFormation para indicar que se debe usar un depósito existente.

Use cláusulas de condición en la plantilla para crear el depósito solo si el parámetro indica que es necesario.

Eric Hammond
fuente
44
+1 hasta ahora esta es la única forma que he visto. Sin embargo, no lo marco como respuesta, porque realmente estoy buscando una manera de automatizar eso.
vartec
1
Debería haber una forma, si no: ¿Cómo funciona "CloudFormer"?
jgomo3
7

CloudFormation usa etiquetas con el prefijo "aws:" para realizar un seguimiento de qué recursos están asociados con qué entradas en qué pilas, ese es el estado "en vivo" que usa para comparar con una plantilla antes de decidir qué agregar / eliminar / actualizar.

Como usuario, no puede agregar, editar o eliminar tales etiquetas.

Entonces, si sus recursos existentes no tienen estas etiquetas, o no tienen los valores correctos para esas etiquetas, entonces no se consideran parte de la nueva pila, y no veo una manera de cambiar eso.

djmitche
fuente
2

Estoy tratando de automatizar esto también, ya que parece que no se puede hacer solo con la plantilla Cloudformation. El proceso en el que estoy pensando sería:

  1. crear otro cubo temporal temp-$originalbucketname
  2. Copie todo el contenido de cubo a cubo para ahorrar tiempo
  3. eliminar todo el contenido de $originalbucketname
  4. eliminar $ originalbucketname ahora que está vacío
  5. crear la pila de Cloudformation (que recreará el cubo)
  6. copia el contenido de nuevo
  7. retirar temp-$originalbucketname

Ese es un proceso muy complicado, dependiendo del tamaño del cubo, podría llevar horas fácilmente ya que la mayoría de los pasos son O (n) con la cantidad de teclas.

Pensarías que Cloudformation es la capa básica de la automatización de AWS, pero creo que es solo un monstruo (bastante limitado) que reúne API bizantinas para todos sus servicios.

giorgiosironi
fuente