Wie stelle ich mithilfe von CodePipeline einen AWS CloudFormation-Stack in einem anderen Konto bereit?

Lesedauer: 9 Minute
0

Ich möchte AWS CodePipeline verwenden, um einen AWS CloudFormation-Stack in einem anderen AWS-Konto bereitzustellen.

Kurzbeschreibung

Gehen Sie wie folgt vor, um einen CloudFormation-Stack in einem anderen AWS-Konto mithilfe von CodePipeline bereitzustellen:

Hinweis: Zwei Konten werden verwendet, um die Pipeline zu erstellen und CloudFormation-Stacks bereitzustellen. Konto 1 wird verwendet, um die Pipeline zu erstellen, und Konto 2 wird verwendet, um CloudFormation-Stacks bereitzustellen.

1.    (Konto 1) Erstellen Sie einen vom Kunden verwalteten AWS Key Management Service (AWS KMS) -Schlüssel, der Schlüsselnutzungsberechtigungen für Folgendes gewährt:

  • Konto 1 CodePipeline-Servicerolle
  • Konto 2

2.    (Konto 1) Erstellen Sie einen Amazon Simple Storage Service (Amazon S3) -Bucket mit einer Bucket-Richtlinie, die Konto 2 Zugriff auf den Bucket gewährt.

3.    (Konto 2) Erstellen Sie eine kontoübergreifende AWS Identity and Access Management (IAM) -Rolle, die Folgendes ermöglicht:

  • CloudFormation-API-Aktionen
  • Zugriff auf den Amazon S3-Bucket in Konto 1
  • Entschlüsselung mit dem vom Kunden verwalteten AWS KMS-Schlüssel in Konto 1

4.    (Konto 1) Fügen Sie die AssumeRole-Berechtigung für die CodePipeline-Dienstrolle Konto 1 hinzu, damit sie die kontenübergreifende Rolle in Konto 2 übernehmen kann.

5.    (Konto 2) Erstellen Sie eine Servicerolle für den CloudFormation-Stack, die die erforderlichen Berechtigungen für die vom Stack bereitgestellten Dienste enthält.

6.    (Konto 1) Aktualisieren Sie die CodePipeline-Konfiguration in Konto 1, um die mit Konto 2 verknüpften Ressourcen einzubeziehen.

Behebung

(Konto 1) Erstellen Sie einen vom Kunden verwalteten AWS KMS-Schlüssel, der Nutzungsberechtigungen für die CodePipeline-Servicerolle von Konto 1 und Konto 2 gewährt

1.    Öffnen Sie in Konto 1 die AWS KMS-Konsole.

2.    Wählen Sie im Navigationsbereich Vom Kunden verwaltete Schlüssel.

3.    Wählen Sie Schlüssel erstellen. Wählen Sie dann Symmetrisch.

Hinweis: Belassen Sie im Abschnitt Erweiterte Optionen als Ursprung KMS.

4.    Geben Sie für Alias einen Namen für Ihren Schlüssel ein.

5.    (Optional) Fügen Sie Tags hinzu, die auf Ihrem Anwendungsfall basieren. Wählen Sie dann Weiter.

6.    Wählen Sie auf der Seite Wichtige Administratorberechtigungen definieren für Hauptadministratoren Ihren AWS Identity and Access Management (IAM) -Benutzer. Fügen Sie außerdem alle anderen Benutzer oder Gruppen hinzu, die Sie als Administratoren für den Schlüssel verwenden möchten. Wählen Sie dann Weiter.

7.    Fügen Sie auf der Seite Schlüsselverwendungsberechtigungen definieren für Dieses Konto die IAM-Identitäten hinzu, für die Sie Zugriff auf den Schlüssel haben möchten. Zum Beispiel: Die CodePipeline-Servicerolle.

8.    Wählen Sie im Abschnitt Andere AWS-Konten die Option Weiteres AWS-Konto hinzufügen. Geben Sie dann den Amazon-Ressourcennamen (ARN) der IAM-Rolle in Konto 2 ein.

9.    Wählen Sie Weiter. Wählen Sie dann Fertigstellen.

10.    Wählen Sie im Abschnitt Kundenverwaltete Schlüssel den Schlüssel aus, den Sie gerade erstellt haben. Kopieren Sie dann den ARN des Schlüssels.

Wichtig: Sie müssen über den ARN des AWS KMS-Schlüssels verfügen, wenn Sie Ihre Pipeline aktualisieren und Ihre IAM-Richtlinien konfigurieren.

(Konto 1) Erstellen Sie einen Amazon S3-Bucket mit einer Bucket-Richtlinie, die Konto 2 Zugriff auf den Bucket gewährt

1.    Öffnen Sie in Konto 1 die Amazon S3-Konsole.

2.    Wählen Sie einen vorhandenen Amazon S3-Bucket oder erstellen Sie einen neuen S3-Bucket, der als ArtifactStore für CodePipeline verwendet werden soll.

Hinweis: Artefakte können eine Stack-Vorlagendatei, eine Vorlagenkonfigurationsdatei oder beides enthalten. CodePipeline verwendet diese Artefakte, um mit CloudFormation-Stacks und Change-Sets zu arbeiten. In Ihrer Vorlagenkonfigurationsdatei müssen Sie Vorlagenparameterwerte, eine Stack-Richtlinie und Tags angeben.

3.    Wählen Sie auf der Amazon S3-Detailseite für Ihren Bucket die Option Berechtigungen.

4.    Wählen Sie Bucket-Richtlinie.

5.    Geben Sie im Bucket-Richtlinien-Editor die folgende Richtlinie ein:

Wichtig: Ersetzen Sie codepipeline-source-artifact durch denSourceArtifact-Bucket-Namen für CodePipeline. Ersetzen Sie ACCOUNT_B_NO durch die Kontonummer von 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.    Wählen Sie Speichern.

(Konto 2) Erstellen Sie eine kontoübergreifende IAM-Rolle

Erstellen Sie eine IAM-Richtlinie, die Folgendes ermöglicht:

  • Die Pipeline in Konto 1 zur Übernahme der kontenübergreifenden IAM-Rolle in Konto 2
  • CloudFormation-API-Aktionen
  • Amazon S3-API-Aktionen im Zusammenhang mit dem SourceArtifact

1.    Öffnen Sie in Konto 2 die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Richtlinien. Wählen Sie dann Richtlinie erstellen.

3.    Wählen Sie die Registerkarte JSON. Geben Sie dann die folgende Richtlinie in den JSON-Editor ein:

Wichtig: Ersetzen Sie codepipeline-source-artifact durch den Bucket-Namen des Artifact Stores Ihrer 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.    Wählen Sie Richtlinie überprüfen.

5.    Geben Sie unter Name einen Namen für die Richtlinie ein.

6.    Wählen Sie Richtlinie erstellen.

Erstellen Sie eine zweite IAM-Richtlinie, die AWS KMS-API-Aktionen zulässt

1.    Öffnen Sie in Konto 2 die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Richtlinien. Wählen Sie dann Richtlinie erstellen.

3.    Wählen Sie die Registerkarte JSON. Geben Sie dann die folgende Richtlinie in den JSON-Editor ein:

Wichtig: Ersetzen Sie arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id durch den ARN Ihres AWS KMS-Schlüssels, den Sie zuvor kopiert haben.

{
  "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.    Wählen Sie Richtlinie überprüfen.

5.    Geben Sie unter Name einen Namen für die Richtlinie ein.

6.    Wählen Sie Richtlinie erstellen.

Erstellen Sie die kontoübergreifende IAM-Rolle mithilfe der Richtlinien, die Sie erstellt haben

1.    Öffnen Sie in Konto 2 die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen.

3.    Wählen Sie Rolle erstellen.

4.    Wählen Sie Ein anderes AWS-Konto.

5.    Geben Sie als Konto-ID die Konto-ID des Kontos 1 ein.

6.    Wählen Sie Weiter: Genehmigungen. Führen Sie dann die Schritte aus, um die IAM-Rolle zu erstellen.

7.    Ordnen Sie der Rolle, die Sie erstellt haben, die kontenübergreifende Rollenrichtlinie und die KMS-Schlüsselrichtlinie an. Anweisungen finden Sie unter Hinzufügen und Entfernen von IAM-Identitätsberechtigungen.

(Konto 1) Fügen Sie der CodePipeline-Dienstrolle Konto 1 die AssumeRole-Berechtigung hinzu, damit das Konto 2 die kontoübergreifende Rolle übernehmen kann

1.    Öffnen Sie in Konto 1 die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen.

3.    Wählen Sie die IAM-Servicerolle, die Sie für CodePipeline verwenden.

4.    Wählen Sie Inline-Richtlinie hinzufügen.

5.    Wählen Sie die Registerkarte JSON. Geben Sie dann die folgende Richtlinie in den JSON-Editor ein:

Wichtig: Ersetzen Sie ACCOUNT_B_NO durch die Kontonummer von Konto 2.

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

6.    Wählen Sie Richtlinie überprüfen und erstellen Sie dann die Richtlinie.

(Konto 2) Erstellen Sie eine Servicerolle für den CloudFormation-Stack, die die erforderlichen Berechtigungen für die vom Stack bereitgestellten Dienste enthält

Hinweis: Diese Servicerolle wird direkt auf dem CloudFormation-Stack in Konto 2 konfiguriert. Die Rolle muss die Berechtigungen für die vom Stack bereitgestellten Dienste enthalten.

1.    Öffnen Sie in Konto 2 die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen.

3.    Erstellen Sie eine Rolle, die AWS CloudFormation verwenden kann, wenn Dienste in Ihrem Namen gestartet werden.

4.    Weisen Sie Ihrer Rolle je nach Anwendungsfall Berechtigungenzu.

Wichtig: Stellen Sie sicher, dass Ihre Vertrauensrichtlinie für AWS CloudFormation gilt und dass Ihre Rolle über Berechtigungen für den Zugriff auf Services verfügt, die vom Stack bereitgestellt werden.

(Konto 1) Aktualisieren Sie die CodePipeline-Konfiguration, um die mit Konto 2 verknüpften Ressourcen aufzunehmen

Hinweis: Wenn beim Ausführen von Befehlen der AWS Command Line Interface (AWS CLI) Fehler auftreten, vergewissern Sie sich, dass Sie eine aktuelle Version der AWS-CLI ausführen.

Sie können die CodePipeline-Konsole nicht verwenden, um eine Pipeline zu erstellen oder zu bearbeiten, die Ressourcen verwendet, die einem anderen Konto zugeordnet sind. Sie können die Konsole jedoch verwenden, um die allgemeine Struktur der Pipeline zu erstellen. Anschließend können Sie die AWS-CLI verwenden, um die Pipeline zu bearbeiten und die mit dem anderen Konto verknüpften Ressourcen hinzuzufügen. Oder Sie können eine aktuelle Pipeline mit den Ressourcen für die neue Pipeline aktualisieren. Weitere Informationen finden Sie unter Erstellen einer Pipeline in CodePipeline.

1.    Rufen Sie die JSON-Struktur der Pipeline ab, indem Sie den folgenden AWS-CLI-Befehl ausführen:

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

2.    Vergewissern Sie sich in Ihrer lokalen Datei pipeline.json, dass die EncryptionKey-ID unter ArtifactStore die ID mit dem ARN des AWS KMS-Schlüssels enthält.

Hinweis: Weitere Informationen zur Pipeline-Struktur finden Sie unter create-pipeline in der AWS CLI Command Reference.

3.    Aktualisieren Sie in der Datei pipeline.json die AWS CloudFormation-Aktionskonfiguration.

Hinweis: Das RoleArn in der JSON-Struktur der Aktionskonfiguration für Ihre Pipeline ist die Rolle für den CloudFormation-Stack (CFN_STACK_ROLE). Das RoleArn außerhalb der JSON-Struktur der Aktionskonfiguration ist die kontoübergreifende Rolle, die die Pipeline für den Betrieb eines CloudFormation-Stacks (CROSS_ACCOUNT_ROLE) annimmt.

4.    Stellen Sie sicher, dass die Rolle für die folgenden beiden Funktionen aktualisiert wurde:

  • Das RoleArn in der JSON-Struktur der Aktionskonfiguration für Ihre Pipeline.
  • Das RoleArn außerhalb der JSON-Struktur der Aktionskonfiguration für Ihre Pipeline.

Hinweis: Im folgenden Codebeispiel ist RoleArn die Rolle, die an AWS CloudFormation übergeben wurde, um den Stack zu starten. CodePipeline verwendet RoleArn, um einen AWS CloudFormation-Stack zu betreiben.

{
  "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.    Entfernen Sie die Metadatenkonfiguration aus der Datei pipeline.json. Zum Beispiel:

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

Wichtig: Um die korrekte JSON-Formatierung einzuhalten, entfernen Sie das Komma vor dem Metadatenabschnitt.

6.    (Optional) Um eine Pipeline zu erstellen und die JSON-Struktur zu aktualisieren, führen Sie den folgenden Befehl aus, um die Pipeline mit der neuen Konfigurationsdatei zu aktualisieren:

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

7.    (Optional) Um eine aktuelle Pipeline zu verwenden und die JSON-Struktur zu aktualisieren, führen Sie den folgenden Befehl aus, um eine neue Pipeline zu erstellen:

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

Wichtig: Stellen Sie in Ihrer Datei pipeline.json sicher, dass Sie den Namen Ihrer neuen Pipeline ändern.


Weitere Informationen

Erstellen Sie in CodePipeline eine Pipeline, die Ressourcen eines anderen AWS-Kontos verwendet

Referenz zur CodePipeline-Pipeline-Struktur

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr