Come faccio a distribuire uno stack AWS CloudFormation in un altro account con CodePipeline?

9 minuti di lettura
0

Desidero utilizzare AWS CodePipeline per distribuire uno stack AWS CloudFormation in un altro account AWS.

Breve descrizione

Per distribuire uno stack CloudFormation in un altro account AWS con CodePipeline, procedi come segue:

Nota: per creare la pipeline e distribuire gli stack di CloudFormation, vengono utilizzati due account. L'account 1 viene utilizzato per creare la pipeline e l'account 2 per distribuire gli stack CloudFormation.

1.    (Account 1) Crea una chiave AWS Key Management Service (AWS KMS) gestita dal cliente per concedere le autorizzazioni all’uso delle chiavi per quanto segue:

  • Account 1: ruolo di servizio CodePipeline
  • Account 2

2.    (Account 1) Crea un bucket Amazon Simple Storage Service (Amazon S3) con una policy del bucket che conceda all'account 2 l'accesso al bucket.

3.    (Account 2) Crea un ruolo AWS Identity and Access Management (IAM) multiaccount che consenta quanto segue:

  • Operazioni API di CloudFormation
  • Accesso al bucket Amazon S3 nell'account 1
  • Decrittografia con la chiave AWS KMS gestita dal cliente nell'account 1

4.    (Account 1) Aggiungi l'autorizzazione AssumeRole al ruolo di servizio CodePipeline dell’account 1, in modo che possa assumere il ruolo multiaccount nell’account 2.

5.    (Account 2) Crea un ruolo di servizio per lo stack CloudFormation che includa le autorizzazioni richieste per i servizi distribuiti dallo stack.

6.    (Account 1) Aggiorna la configurazione di CodePipeline nell'account 1 per includere le risorse associate all'account 2.

Risoluzione

(Account 1) Creazione di una chiave AWS KMS gestita dal cliente che conceda le autorizzazioni di utilizzo al ruolo di servizio CodePipeline dell'account 1 e dell'account 2

1.    Nell'account 1, apri la console AWS KMS.

2.    Nel riquadro di navigazione, scegli Chiavi gestite dal cliente.

3.    Scegli Crea chiave. Quindi, scegli Simmetrica.

Nota: nella sezione Opzioni avanzate, lascia l'origine come KMS.

4.    Per Alias, inserisci un nome per la chiave.

5.    (Facoltativo) Aggiungi i tag in base al caso d'uso. Quindi, scegli Avanti.

6.    Nella pagina Definisci le autorizzazioni per gestire la chiave, in Amministratori delle chiavi, scegli l’utente AWS Identity and Access Management (IAM). Inoltre, aggiungi altri utenti o gruppi che desideri operino da amministratori della chiave. Quindi, scegli Avanti.

7.    Nella pagina Definisci le autorizzazioni per utilizzare la chiave, aggiungi in Questo account le identità IAM a cui desideri assegnare l’accesso alla chiave. Ad esempio: il ruolo di servizio CodePipeline.

8.    Nella sezione Altri account AWS, scegli Aggiungi un altro account AWS. Quindi, inserisci il nome della risorsa Amazon (ARN) del ruolo IAM nell'account 2.

9.    Scegli Avanti. Quindi, scegli Fine.

10.    Nella sezione Chiavi gestite dal cliente, scegli la chiave che hai appena creato. Quindi, copia l'ARN della chiave.

Importante: quando aggiorni la pipeline e configuri le policy IAM, è necessario disporre dell'ARN della chiave AWS KMS.

(Account 1) Creazione di un bucket Amazon S3 con una policy del bucket che conceda all'account 2 l'accesso al bucket

1.    Nell'account 1, apri la console Amazon S3.

2.    Scegli un bucket Amazon S3 esistente o crea un nuovo bucket S3 da utilizzare come ArtifactStore per CodePipeline.

Nota: gli artefatti possono includere un file modello dello stack, un file di configurazione del modello o entrambi. CodePipeline utilizza questi artefatti per utilizzare gli stack e i set delle modifiche di CloudFormation. Nel file di configurazione del modello, devi specificare i valori dei parametri del modello, una policy dello stack e i tag.

3.    Nella pagina Dettagli di Amazon S3 relativa al bucket, scegli Autorizzazioni.

4.    Scegli Policy del bucket.

5.    Nell'editor della policy del bucket, inserisci la seguente policy:

Importante: sostituisci codepipeline-source-artifact con il nome del bucket SourceArtifact per CodePipeline. Sostituisci ACCOUNT\ _B\ _NO con il numero dell’account 2.

{
  "Id": "Policy1553183091390",
  "Version": "2012-10-17",
  "Statement": [{
      "Sid": "",
      "Action": [
        "s3:Get*",
        "s3:Put*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::codepipeline-source-artifact/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::ACCOUNT_B_NO:root"
        ]
      }
    },
    {
      "Sid": "",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::codepipeline-source-artifact",
      "Principal": {
        "AWS": [
          "arn:aws:iam::ACCOUNT_B_NO:root"
        ]
      }
    }
  ]
}

6.    Scegli Salva.

(Account 2) Creazione di un ruolo IAM multiaccount

Crea una policy IAM che consenta quanto segue:

  • Assunzione da parte della pipeline nell'account 1 del ruolo IAM multiaccount nell'account 2
  • Operazioni API di CloudFormation
  • Operazioni API Amazon S3 relative a SourceArtifact

1.    Nell'account 2, apri la console IAM.

2.    Nel riquadro di navigazione, scegli Policy. Quindi, scegli Crea policy.

3.    Scegli la scheda JSON. Quindi, inserisci la seguente policy nell'editor JSON:

**Importante:**sostituisci codepipeline-source-artifact con il nome del bucket dell’archivio Artifact della pipeline.

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Action": [
        "cloudformation:*",
        "iam:PassRole"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:Put*",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-source-artifact/*"
      ]
    }
  ]
}

4.    Scegli Verifica policy.

5.    In Nome, inserisci un nome per la policy.

6.    Scegli Crea policy.

Crea una seconda policy IAM che consenta le operazioni dell'API AWS KMS

1.    Nell'account 2, apri la console IAM.

2.    Nel riquadro di navigazione, scegli Policy. Quindi, scegli Crea policy.

3.    Scegli la scheda JSON. Quindi, inserisci la seguente policy nell'editor JSON:

Importante: sostituisci arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id con l'ARN della chiave AWS KMS che hai copiato in precedenza.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey*",
      "kms:Encrypt",
      "kms:ReEncrypt*",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id"
    ]
  }]
}

4.    Scegli Verifica policy.

5.    In Nome, inserisci un nome per la policy.

6.    Scegli Crea policy.

Crea il ruolo IAM multiaccount utilizzando le policy che hai creato

1.    Nell'account 2, apri la console IAM.

2.    Nel riquadro di navigazione, scegli Ruoli.

3.    Scegli Crea ruolo.

4.    Scegli Un altro account AWS.

5.    Per ID account, inserisci l'ID dell’account 1.

6.    Scegli Avanti: Autorizzazioni. Quindi, completa i passaggi per creare il ruolo IAM.

7.    Associa la policy del ruolo multiaccount e la policy della chiava KMS al ruolo che hai creato. Per istruzioni, consulta Aggiunta e rimozione di autorizzazioni per identità IAM.

(Account 1) Aggiunta dell'autorizzazione AssumeRole al ruolo di servizio CodePipeline dell’account 1 per consentirgli di assumere il ruolo multiaccount nell'account 2

1.    Nell'account 1, apri la console IAM.

2.    Nel riquadro di navigazione, scegli Ruoli.

3.    Scegli il ruolo del servizio IAM che stai utilizzando per CodePipeline.

4.    Scegli Aggiungi policy inline.

5.    Scegli la scheda JSON. Quindi, inserisci la seguente policy nell'editor JSON:

Importante: sostituisci ACCOUNT_B_NO con il numero dell’account 2.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
      "arn:aws:iam::ACCOUNT_B_NO:role/*"
    ]
  }
}

6.    Scegli Verifica policy, quindi crea la policy.

(Account 2) Creazione di un ruolo di servizio per lo stack CloudFormation che includa le autorizzazioni richieste per i servizi distribuiti dallo stack

Nota: questo ruolo di servizio è configurato direttamente nello stack CloudFormation dell'account 2. Il ruolo deve includere le autorizzazioni per i servizi distribuiti dallo stack.

1.    Nell'account 2, apri la console IAM.

2.    Nel riquadro di navigazione, scegli Ruoli.

3.    Crea un ruolo per AWS CloudFormation da utilizzare quando avvii i servizi per tuo conto.

4.    Applica le autorizzazioni al tuo ruolo in base al caso d'uso.

Importante: assicurati che la policy di attendibilità sia per AWS CloudFormation e che il ruolo disponga delle autorizzazioni per accedere ai servizi distribuiti dallo stack.

(Account 1) Aggiornamento della configurazione di CodePipeline per includere le risorse associate all'account 2

Nota: se si verificano errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), accertati di utilizzare una versione recente di AWS CLI.

Non è possibile utilizzare la console CodePipeline per creare o modificare una pipeline che utilizza risorse associate a un altro account. Tuttavia, puoi utilizzare la console per creare la struttura generale della pipeline. Quindi, puoi utilizzare l'interfaccia della linea di comando AWS (AWS CLI) per modificare la pipeline e aggiungere le risorse associate all'altro account. In alternativa, puoi aggiornare una pipeline corrente con le risorse per la nuova pipeline. Per ulteriori informazioni, consulta Create a pipeline in CodePipeline.

1.    Ottieni la struttura JSON della pipeline eseguendo il seguente comando dell’interfaccia della linea di comando AWS (AWS CLI):

aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

2.    Nel file pipeline.json locale, verifica che l'ID di encryptionKey in artifactStore contenga l'ID con l'ARN della chiave AWS KMS.

Nota: per ulteriori informazioni sulla struttura della pipeline, consulta create-pipeline nel riferimento dei comandi dell'interfaccia della linea di comando AWS (AWS CLI).

3.    Nel file pipeline.json, aggiorna la configurazione delle operazioni di AWS CloudFormation.

Nota: il RoleArn all'interno della struttura JSON di configurazione delle operazioni della pipeline è il ruolo dello stack CloudFormation (CFN_STACK_ROLE). Il roleArn al di fuori della struttura JSON di configurazione delle operazioni è il ruolo multiaccount che la pipeline assume per gestire uno stack CloudFormation (CROSS_ACCOUNT_ROLE).

4.    Verifica che il ruolo sia aggiornato per entrambi i seguenti elementi:

  • Il RoleArn all'interno della struttura JSON di configurazione delle operazioni della pipeline.
  • Il roleArn al di fuori della struttura JSON di configurazione delle operazioni della pipeline.

Nota: nel seguente esempio di codice, RoleArn è il ruolo trasmesso ad AWS CloudFormation per avviare lo stack. CodePipeline utilizza roleArn per gestire uno stack AWS CloudFormation.

{
  "name": "Prod_Deploy",
  "actions": [{
    "inputArtifacts": [{
      "name": "MyApp"
    }],
    "name": "test-cfn-x",
    "actionTypeId": {
      "category": "Deploy",
      "owner": "AWS",
      "version": "1",
      "provider": "CloudFormation"
    },
    "outputArtifacts": [],
    "configuration": {
      "ActionMode": "CHANGE_SET_REPLACE",
      "ChangeSetName": "test",
      "RoleArn": "ARN_FOR_CFN_STACK_ROLE",
      "Capabilities": "CAPABILITY_IAM",
      "StackName": "test-cfn-sam",
      "TemplatePath": "MyApp::template.yaml"
    },
    "roleArn": "ARN_FOR_CROSS_ACCOUNT_ROLE",
    "runOrder": 1
  }]
}

5.    Rimuovi la configurazione dei metadati dal file pipeline.json. Ad esempio:

"metadata": {
  "pipelineArn": "arn:aws:codepipeline:REGION:ACC:my_test",
  "updated": 1551216777.183,
  "created": 1551207202.964
}

Importante: per conformità con la corretta formattazione JSON, rimuovi la virgola prima della sezione dei metadati.

6.    (Facoltativo) Per creare una pipeline e aggiornare la struttura JSON, esegui il seguente comando per aggiornare la pipeline con il nuovo file di configurazione:

aws codepipeline update-pipeline --cli-input-json file://pipeline.json

7.    (Facoltativo) Per utilizzare una pipeline corrente e aggiornare la struttura JSON, esegui il seguente comando per creare una nuova pipeline:

aws codepipeline create-pipeline --cli-input-json file://pipeline.json

Importante: nel file pipeline.json, assicurati di modificare il nome della nuova pipeline.


Informazioni correlate

Create a pipeline in CodePipeline that uses resources from another AWS account

CodePipeline pipeline structure reference

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa