Salta al contenuto

Come posso risolvere l'errore "Last applied policy cannot be deleted" in CloudFormation?

4 minuti di lettura
0

Desidero risolvere l'errore "Last applied policy cannot be deleted" in AWS CloudFormation.

Breve descrizione

Quando provi a eliminare policy di CloudFormation come AWS::SQS::QueuePolicy, AWS::S3::BucketPolicy, AWS::SNS::TopicPolicy e AWS::IAM::Policy, potresti ricevere il seguente messaggio di errore:

"Last applied policy cannot be deleted. Please delete other policies applied to this resource before deleting the last applied policy."

Se applichi una policy dopo un'altra sulla stessa risorsa, la seconda policy diventa l'ultima policy applicata. Quando provi a eliminare la seconda policy, CloudFormation non ti consente di farlo.

Risolvi il problema a seconda della situazione che riscontri:

  • Lo stack e la policy sono nello stato DELETE_FAILED.
  • Hai tentato di eliminare le risorse della policy da diversi stack che hai applicato alla stessa risorsa.
  • Lo stack e la policy sono nello stato UPDATE_FAILED.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Lo stack e la policy sono nello stato DELETE_FAILED

Se hai provato a eliminare uno stack e la policy non è stata eliminata, utilizza la console CloudFormation o AWS CLI per eliminare nuovamente lo stack e ignorare la risorsa.

Console CloudFormation

Segui le istruzioni per forzare l'eliminazione dello stack in Elimina uno stack dalla console CloudFormation.

AWS CLI

Esegui questo comando delete-stack:

aws cloudformation delete-stack --stack-name example-stack-name --retain-resources example-policy-resource-id

Nota: sostituisci example-stack-name con lo stack che non è stato eliminato e example-policy-resource-id con l'ID della risorsa della policy che non è stata eliminata.

Dopo aver eliminato nuovamente lo stack, le risorse selezionate da mantenere non vengono eliminate. Lo stato dello stack cambia in DELETE_COMPLETE.

Nota: per evitare addebiti non necessari, elimina manualmente le risorse mantenute quando elimini lo stack. Se elimini la risorsa di destinazione, viene eliminata anche la risorsa della policy, per cui non serve eliminarla manualmente.

Per ulteriori informazioni, consulta Come posso eliminare uno stack di CloudFormation bloccato nello stato DELETE_FAILED?

Hai tentato di eliminare risorse di policy da diversi stack che hai applicato alla stessa risorsa

Se hai applicato più policy da stack diversi alla stessa risorsa, devi eliminare la prima policy applicata.

Ad esempio, crei EsempioPolicyA in esempio-stack-A e applichi la policy a esempioCoda1. Quindi crei EsempioPolicyB in esempio-stack-B e applichi la policy a esempioCoda1 con autorizzazioni diverse. Quando tenti di eliminare EsempioPolicyB, ricevi il seguente errore:

"Last applied policy cannot be deleted. Please delete other policies applied to this resource before deleting the last applied policy."

Per eliminare EsempioPolicyB, devi prima eliminare EsempioPolicyA.

Nota: è consigliabile eliminare le policy precedenti prima di crearne una nuova.

Lo stack e la risorsa della policy sono nello stato UPDATE_FAILED

Se hai rimosso un'entità da una policy, lo stack o la risorsa della policy potrebbe trovarsi nello stato UPDATE_FAILED. L'errore si verifica perché la policy è collegata a un'altra risorsa AWS::IAM::Policy definita in uno stack diverso o è sostituita da tale risorsa.

Per risolvere il problema, elimina le risorse AWS::IAM::Policy da altri stack che hai applicato alla stessa entità prima di tentare di rimuovere l'ultima policy applicata.

Completa i seguenti passaggi per eliminare la risorsa:

  1. Nella risorsa dello stack che ha dato esito negativo, aggiorna il modello di stack per includere DeletionPolicy: Retain nella sezione relativa al tipo di risorsa della policy. 
    Esempio di policy:

    yaml
    MySharedPolicy:
        Type: AWS::IAM::Policy
        DeletionPolicy: Retain # Add this line
        Properties:
        # existing properties remain the same
  2. Distribuisci il modello aggiornato con la policy di conservazione.

  3. Elimina la risorsa della policy dal modello CloudFormation.
    Nota: poiché hai aggiunto la policy di conservazione, la policy IAM non viene eliminata.

  4. Aggiorna lo stack per completare il processo di rimozione.
    Nota: se hai ancora bisogno della risorsa della policy nello stack, aggiungila nuovamente al modello in base alla policy del passaggio 1. Quindi aggiorna lo stack con il modello per creare la risorsa.

È consigliabile eseguire la migrazione da AWS::IAM::Policy a AWS::IAM::RolePolicy, AWS::IAM::UserPolicy o AWS::IAM::GroupPolicy.

Se il problema persiste o non riesci a identificare gli altri stack che contengono la risorsa della policy, effettua la pulizia e ricrea la risorsa. Quando ricrei la risorsa della policy, potresti ricevere l'errore "resource already exists". Per risolverlo, rinomina la policy (PolicyName). È consigliabile gestire una risorsa della policy in un solo stack.

AWS UFFICIALEAggiornata 7 mesi fa