Como posso reutilizar os recursos existentes no CloudFormation?

32

Eu tenho o bucket S3 como recurso no meu modelo do CloudFormation. Com DeletionPolicydefinido como Retain. Isso funciona como esperado, ao excluir a pilha, ele realmente retém o balde. No entanto, quando tento criar a pilha novamente, a criação falha ao tentar criar o mesmo bucket novamente, com a mensagem de erro reclamando que ela já existe.

O que preciso adicionar ao meu modelo CloudFormation para que ele não tente recriar um recurso que já existe?

O fragmento relevante do meu modelo é o seguinte:

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }
vartec
fonte
sem interesse, para que serve o balde? Talvez haja outra maneira de contornar isso, dependendo do que você está tentando fazer.
Tirou Khoury

Respostas:

15

Uma abordagem é adicionar um parâmetro de entrada ao modelo CloudFormation para indicar que um bucket existente deve ser usado.

Use cláusulas Condição no modelo para criar o depósito somente se o parâmetro indicar que é necessário.

Eric Hammond
fonte
4
+1 até agora, esta é a única maneira que eu já vi. Não estou marcando isso como resposta, porque estou realmente procurando uma maneira de automatizar isso.
Vartec
1
Deveria haver uma maneira, se não: Como funciona o "CloudFormer"?
Jgomo3
7

O CloudFormation usa tags com o prefixo "aws:" para rastrear quais recursos estão associados a quais entradas nas pilhas - esse é o estado "ativo" usado para comparar com um modelo antes de decidir o que adicionar / excluir / atualizar.

Como usuário, você não pode adicionar, editar ou excluir essas tags.

Portanto, se seus recursos existentes não tiverem essas tags ou não tiverem os valores corretos para essas tags, eles não serão considerados parte da nova pilha e não vejo uma maneira de mudar isso.

djmitche
fonte
2

Também estou tentando automatizar isso, pois parece que isso não pode ser feito apenas com o modelo Cloudformation. O processo em que estou pensando seria:

  1. crie outro balde temporário temp-$originalbucketname
  2. copie todo o conteúdo de um lado para o outro para economizar tempo
  3. remova todo o conteúdo de $originalbucketname
  4. remova $ originalbucketname agora que está vazio
  5. crie a pilha do Cloudformation (que recriará o bucket)
  6. copie o conteúdo de volta
  7. remover temp-$originalbucketname

Esse é um processo muito envolvido, dependendo do tamanho do balde que pode levar horas, pois a maioria das etapas é O (n) com o número de chaves.

Você pensaria que o Cloudformation é a camada básica da automação da AWS, mas acho que é apenas um monstro (bastante limitado) que reúne APIs bizantinas para todos os seus serviços.

giorgiosironi
fonte