Ir para o conteúdo

Como resolvo o erro “Já existe” que recebo ao reimplantar meu código do AWS CDK depois de excluir a pilha da implantação?

4 minuto de leitura
0

Quando eu reimplanto meu código do AWS Cloud Development Kit (AWS CDK), recebo um erro "Já existe".

Resolução

A maioria dos recursos na AWS CDK Construct Library define a propriedade removalPolicy no estado RETAIN por padrão. Se você não definir a propriedade removalPolicy como RETAIN em seus recursos, os recursos se tornam órfãos. Os recursos órfãos permanecem na sua conta da AWS depois que você exclui a pilha e faz a transição para o estado DELETE\ _COMPLETE.

Quando você atualiza a pilha, o AWS CDK remove o recurso. Se você especificou um nome personalizado para os recursos, talvez receba um erro "Já existe" ao reimplantar o mesmo código.

Observação: as etapas a seguir usam um exemplo de recurso de bucket do Amazon Simple Storage Service (Amazon S3) associado à classe s3.bucket no AWS CDK.

Exemplo de recurso com nome personalizado:

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 bucketName: 'amzn-s3-demo-bucket',
 versioned: false,
 encryption: s3.BucketEncryption.S3_MANAGED
 });

Importar o recurso retido para a nova pilha

Conclua as seguintes etapas:

  1. Confirme se seu ambiente atende aos requisitos para usar o comando cdk import da interface de linha de comandos (CLI) do AWS CDK.
    Observação: você não pode importar um recurso para sua pilha ao atualizar ou criar outros recursos na pilha. Só é possível importar um ou mais recursos em uma única operação de importação.

  2. Remova temporariamente todos os outros recursos do seu código, exceto o recurso que você deseja reter. As propriedades definidas do recurso que você importa devem corresponder às propriedades do recurso que você implantou. Por exemplo, importe o recurso retido do bucket do S3 s3-bucket.
    Observação: para importar um recurso, você deve definir uma política de remoção para o recurso.
    Exemplo de política:

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     removalPolicy: RemovalPolicy.RETAIN
     });
    
    //const cfnFunction = new lambda.CfnFunction(this, 'MyCfnFunction', {
    //  code: {
    //  ...
    //    s3Bucket: s3Bucket.bucketArn
    //  },
    //  role: 'role',

    Observação: substitua s3-bucket pelo nome do seu bucket do S3.

  3. Execute o seguinte comando cdk import para iniciar a importação do recurso:

    cdk import
  4. Insira o ID do recurso quando o CDK solicitar. Neste exemplo, insira o nome do bucket do S3.

  5. Insira novamente os recursos do seu código e, em seguida, execute o seguinte comando deploy:

    cdk deploy

Exclua manualmente o recurso retido

Conclua as seguintes etapas:

  1. Faça login no Console de Gerenciamento da AWS.
  2. Selecione o serviço dos recursos que você não deseja reter.
  3. Exclua manualmente os recursos. Por exemplo, para remover o recurso s3.bucket, exclua o bucket do Amazon S3.
  4. Para reimplantar o AWS CDK, execute o seguinte comando deploy:
    cdk deploy

Altere o nome do recurso retido

Conclua as seguintes etapas:

  1. Abra o código do AWS CDK para o recurso.
  2. Atualize o nome do recurso para um valor exclusivo que não entre em conflito com o nome do recurso retido:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    **Observação:**O exemplo anterior usa o parâmetro bucketName para alterar o nome do recurso s3.bucket. Substitua amzn-s3-demo-bucket pelo nome do seu bucket do S3.

Excluir o nome do recurso

Para excluir o nome do recurso para que o AWS CDK possa gerar um nome exclusivo, conclua as seguintes etapas:

  1. Para remover o nome do recurso do AWS CDK, execute o seguinte código:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    Observação: o código de exemplo anterior remove a propriedade bucketName para permitir que o CDK da AWS gere um novo nome.
  2. Para reimplantar o AWS CDK, execute o seguinte comando deploy:
    cdk deploy

Definir a propriedade removalPolicy como DESTROY

Conclua as seguintes etapas:

  1. Abra o código do AWS CDK para os recursos.

  2. Defina a propriedade removalPolicy como DESTROY:

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     removalPolicy: RemovalPolicy.DESTROY
     });
  3. Para acessar o modelo do AWS CloudFormation, execute o seguinte comando cdk synth:

    cdk synth
  4. Verifique se a DeletionPolicy e a UpdateReplacePolicy estão definidas como Delete.