Wie stelle ich mithilfe von CodePipeline Artefakte für Amazon S3 in einem anderen AWS-Konto bereit?

Lesedauer: 10 Minute
0

Ich möchte Artefakte in einem Amazon Simple Storage Service (Amazon S3) -Bucket in einem anderen Konto bereitstellen. Ich möchte auch das Zielkonto als Objekteigentümer festlegen. Gibt es eine Möglichkeit, dies mithilfe von AWS CodePipeline mit einem Amazon S3-Bereitstellungsaktionsanbieter zu tun?

Behebung

Hinweis: Das folgende Beispielverfahren setzt Folgendes voraus:

  • Sie haben zwei Konten: ein Entwicklungskonto und ein Produktionskonto.
  • Der Eingabe-Bucket im Entwicklungskonto heißt codepipeline-input-bucket (mit aktivierter Versionsverwaltung).
  • Der Standardartefact-Bucket im Entwicklungskonto heißt codepipeline-us-east-1-0123456789.
  • Der Ausgabe-Bucket im Produktionskonto heißt codepipeline-output-bucket.
  • Sie stellen Artefakte aus dem Entwicklungskonto in einen S3-Bucket im Produktionskonto bereit.
  • Sie übernehmen eine kontoübergreifende Rolle, die im Produktionskonto erstellt wurde, um die Artefakte bereitzustellen. Die Rolle macht das Produktionskonto zum Objekteigentümer und nicht zum Entwicklungskonto. Um dem Bucket-Besitzer im Produktionskonto Zugriff auf die Objekte zu gewähren, die dem Entwicklungskonto gehören, lesen Sie den folgenden Artikel:Wie stelle ich mithilfe von CodePipeline und einer vorgefertigten ACL Artefakte in Amazon S3 in einem anderen AWS-Konto bereit?

Erstellen Sie einen AWS KMS-Schlüssel zur Verwendung mit CodePipeline im Entwicklungskonto

Wichtig: Sie müssen den vom Kunden verwalteten Schlüssel von AWS Key Management Service (AWS KMS) für kontoübergreifende Bereitstellungen verwenden. Wenn der Schlüssel nicht konfiguriert ist, verschlüsselt CodePipeline die Objekte mit der Standardverschlüsselung, die von der Rolle im Zielkonto nicht entschlüsselt werden kann.

1.    Öffnen Sie die AWS KMS-Konsole im Entwicklungskonto.

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

3.    Wählen Sie Schlüssel erstellen.

4.    Wählen Sie als Schlüsseltyp die Option Symmetrischer Schlüssel.

5.    Erweitern Sie Erweiterte Optionen.

6.    Wählen Sie für Key Material Origin die Option KMS. Wählen Sie dann Weiter.

7.    Geben Sie für Alias den Alias Ihres Schlüssels ein. Zum Beispiel: s3deploykey.

8.    Wählen Sie Weiter. Die Seite „Wichtige Administratorberechtigungen definieren wird geöffnet.

9.    Wählen Sie im Abschnitt Wichtige Administratoren einen AWS Identity and Access Management (IAM) -Benutzer oder eine Rolle als Ihren Hauptadministrator.

  1. Wählen Sie Weiter. Die Seite Schlüsselverwendungsberechtigungen definieren wird geöffnet.

11.    Wählen Sie im Abschnitt Andere AWS-Konten die Option Weiteres AWS-Konto hinzufügen.

12.    Fügen Sie in dem daraufhin angezeigten Textfeld die Konto-ID des Produktionskontos hinzu. Wählen Sie dann Weiter.

Hinweis: Sie können im Abschnitt Dieses Konto auch eine bestehende Servicerolle auswählen. Wenn Sie eine bestehende Servicerolle auswählen, überspringen Sie die Schritte im Abschnitt Aktualisierung der KMS-Nutzungsrichtlinie im Entwicklungskonto.

13.    Überprüfen Sie die wichtigsten Richtlinien. Wählen Sie dann Fertigstellen.

Erstellen Sie eine CodePipeline im Entwicklungskonto

1.    Öffnen Sie die CodePipeline-Konsole. Wählen Sie dann Create pipeline.

2.    Geben Sie unter **Pipeline-Name **einen Namen für Ihre Pipeline ein. Zum Beispiel: crossaccountdeploy.

Hinweis: Das Textfeld Rollenname wird automatisch mit dem Dienstrollennamen AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy gefüllt. Sie können auch eine andere, bestehende Servicerolle mit Zugriff auf den KMS-Schlüssel wählen.

3.    Erweitern Sie den **Abschnitt **Erweiterte Einstellungen.

4.    Wählen Sie für den Artefaktspeicher die Option Standardspeicherort.
Hinweis: Sie können Benutzerdefinierter Standort auswählen, wenn dies für Ihren Anwendungsfall erforderlich ist.

5.    Wählen Sie als Verschlüsselungsschlüssel die Option Kundenverwalteter Schlüssel.

6.    Wählen Sie für den vom Kunden verwalteten KMS-Schlüssel den Alias Ihres Schlüssels aus der Liste aus (in diesem Beispiel s3deploykey). Wählen Sie dann Weiter. Die Seite Quellstufe hinzufügen wird geöffnet.

  1. Als Quellenanbieter wählen Sie Amazon S3.

8.    Geben Sie für Bucket den Namen Ihres S3-Buckets für die Entwicklungseingabe ein. Zum Beispiel: codepipeline-input-bucket.

Wichtig: Für den Eingabe-Bucket muss die Versionierung aktiviert sein, um mit CodePipeline zu arbeiten.

9.    Geben Sie für den S3-Objektschlüssel sample-website.zip ein.

Wichtig: Informationen zur Verwendung einer AWS-Beispielwebsite anstelle Ihrer eigenen Website finden Sie im Tutorial: Erstellen Sie eine Pipeline, die Amazon S3 als Bereitstellungsanbieter verwendet. Suchen Sie dann in den Voraussetzungen von 1 nach „Beispiel für eine statische Website“: Stellen Sie statische Website-Dateien im Amazon S3-Abschnitt bereit.

10.    Wählen Sie unter Erkennungsoptionen ändern Amazon CloudWatch Events (empfohlen). Wählen Sie dann Weiter.

11.    Wählen Sie auf der Seite Build-Phase hinzufügen die Option Build-Phase überspringen. Wählen Sie dann Überspringen.

12.    Wählen Sie auf der Seite Bereitstellungsphase hinzufügen für Bereitstellungsanbieter die Option Amazon S3.

13.    Wählen Sie für Region die AWS-Region aus, in der sich Ihr S3-Bucket für die Produktionsausgabe befindet. Zum Beispiel: USA Ost (Nord-Virginia).

Wichtig: Wenn sich die Region des Production-Output-Buckets von der Region Ihrer Pipeline unterscheidet, müssen Sie außerdem Folgendes überprüfen:

14.    Geben Sie für Bucket den Namen Ihres S3-Buckets für die Produktionsausgabe ein. Zum Beispiel: codepipeline-output-bucket.

15.    Aktivieren Sie das Kontrollkästchen Datei vor der Bereitstellung extrahieren.
Hinweis: Geben Sie bei Bedarf einen Pfad für den Bereitstellungspfad ein.

16.    Wählen Sie Weiter.

17.    Wählen Sie Pipeline erstellen. Die Pipeline läuft, aber die Quellphase schlägt fehl. Der folgende Fehler wird angezeigt: „Das Objekt mit dem Schlüssel 'sample-website.zip' existiert nicht.“

Im Abschnitt Laden Sie die Beispielwebsite in den Eingabe-Bucket dieses Artikels hoch, wird beschrieben, wie dieser Fehler behoben werden kann.

Aktualisieren Sie die KMS-Nutzungsrichtlinie im Entwicklungskonto

Wichtig: Überspringen Sie diesen Abschnitt, wenn Sie eine bestehende CodePipeline-Servicerolle verwenden.

1.    Öffnen Sie die AWS KMS-Konsole im Entwicklungskonto.

2.    Wählen Sie den Alias Ihres Schlüssels aus (s3deploykey, für dieses Beispiel).

3.    Wählen Sie im Abschnitt Hauptbenutzer die Option Hinzufügen.

4.    Geben Sie in das Suchfeld die Servicerolle AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy ein.

5.    Wählen Sie Hinzufügen.

Konfigurieren Sie eine kontenübergreifende Rolle im Produktionskonto

Erstellen Sie eine IAM-Richtlinie für die Rolle, die Amazon S3-Berechtigungen für Ihren S3-Bucket für die Produktionsausgabe gewährt

1.    Öffnen Sie die IAM-Konsole im Produktionskonto.

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

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

Wichtig: Ersetzen Sie codepipeline-output-bucket durch den Namen Ihres S3-Buckets für die Produktionsausgabe.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Put*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket"
      ]
    }
  ]
}

4.    Wählen Sie Richtlinie überprüfen.

5.    Geben Sie unter Name einen Namen für die Richtlinie ein. Zum Beispiel: outputbucketdeployaccess.

6.    Wählen Sie Richtlinie erstellen.

Erstellen Sie eine IAM-Richtlinie für die Rolle, die die erforderlichen KMS-Berechtigungen gewährt

1.    Wählen Sie in der IAM-Konsole Create Policy.

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

Hinweis: Ersetzen Sie den ARN des KMS-Schlüssels, den Sie erstellt haben. Ersetzen Sie codepipeline-us-east-1-0123456789 durch den Namen des Artefakt-Buckets im Entwicklungskonto.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:GenerateDataKey*",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:us-east-1:<dev-account-id>:key/<key id>"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789"
      ]
    }
  ]
}

3.    Wählen Sie Richtlinie überprüfen.

4.    Geben Sie unter Name einen Namen für die Richtlinie ein. Zum Beispiel: devkmss3access.

5.    Wählen Sie Richtlinie erstellen.

Erstellen Sie eine kontenübergreifende Rolle, die das Entwicklungskonto übernehmen kann, um die Artefakte bereitzustellen

1.    Öffnen Sie die IAM-Konsole im Produktionskonto.

2.    Wählen Sie im Navigationsbereich Rollen. Wählen Sie dann Rolle erstellen.

3.    Wählen Sie ein anderes AWS-Konto.

4.    Geben Sie als Konto-ID die AWS-Konto-ID des Entwicklungskontos ein.

5.    Wählen Sie Weiter: Genehmigungen.

6.    Wählen Sie in der Liste der Richtlinien outputbucketdeployaccess und devkmss3access.

7.    Wählen Sie Weiter: Schlagworte.

8.    (Optional) Fügen Sie Schlagworte hinzu und wählen Sie dann Weiter: Bewertung.

9.    Geben Sie als Rollenname prods3role ein.

10.    Wählen Sie Rolle erstellen.

11.    Wählen Sie aus der Liste der Rollen die Option prods3role.

12.    Wählen Sie die Vertrauensbeziehung. Wählen Sie dann Vertrauensbeziehung bearbeiten.

13.    Geben Sie im Editor für Richtliniendokumente die folgende Richtlinie ein:

Wichtig: Ersetzen Sie dev-account-id durch die AWS-Konto-ID Ihres Entwicklungskontos. Ersetzen Sie AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy durch den Namen der Servicerolle für Ihre Pipeline.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

14.    Wählen Sie Trust Policy aktualisieren.

Aktualisieren Sie die Bucket-Richtlinie für den CodePipeline-Artefakt-Bucket im Entwicklungskonto

1.    Öffnen Sie die Amazon S3-Konsole im Entwicklungskonto.

2.    Wählen Sie in der Liste der Bucket-Namen den Namen Ihres Artefakt-Buckets in Ihrem Entwicklungskonto aus (in diesem Beispiel codepipeline-us-east-1-0123456789).

3.    Wählen Sie Berechtigungen. Wählen Sie Bucket-Richtlinie.

4.    Aktualisieren Sie Ihre bestehende Richtlinie im Texteditor, sodass sie die folgenden Richtlinienerklärungen enthält:

Wichtig: Um die korrekte JSON-Formatierung einzuhalten, fügen Sie nach den vorhandenen Anweisungen ein Komma hinzu. Ersetzen Sie die account-id durch die AWS-Konto-ID Ihres Produktionskontos. Ersetzen Sie codepipeline-us-east-1-0123456789 durch den Namen Ihres Artefakt-Buckets.

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*"
    ],
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789"
}

5.    Wählen Sie Speichern.

Fügen Sie Ihrer CodePipeline-Servicerolle im Entwicklungskonto eine Richtlinie hinzu, die es ihr ermöglicht, die von Ihnen erstellte kontoübergreifende Rolle anzunehmen

1.    Öffnen Sie die IAM-Konsole im Entwicklungskonto.

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

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

Wichtig: Ersetzen Sie die prod-account-id durch die AWS-Konto-ID Ihres Produktionskontos.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
      "arn:aws:iam::<prod-account-id>:role/prods3role"
    ]
  }
}

4.    Wählen Sie Richtlinie überprüfen.

5.    Geben Sie als Name assumeprods3role ein.

6.    Wählen Sie Richtlinie erstellen.

7.    Wählen Sie im Navigationsbereich Rollen. Wählen Sie dann den Namen der Servicerolle für Ihre Pipeline aus (in diesem Beispiel AWSCodePipelineServiceRole-US-East-1-CrossAccountDeploy).

8.    Wählen Sie Richtlinien anhängen. Wählen Sie dann assumeprods3role.

9.    Wählen Sie Richtlinie anhängen.

Aktualisieren Sie Ihre Pipeline, um die kontoübergreifende Rolle im Entwicklungskonto zu verwenden

Hinweis: Wenn Sie beim Ausführen von Befehlen der AWS Command Line Interface (AWS CLI) Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS CLI-Version verwenden.

1.    Rufen Sie die Pipeline-Definition als Datei mit dem Namen codepipeline.jsonab, indem Sie den folgenden AWS-CLI-Befehl ausführen:

Wichtig: Ersetzen Sie crossaccountdeploy durch den Namen Ihrer Pipeline.

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

2.    Fügen Sie die kontoübergreifende IAM-Rolle ARN (roleARN) zum Abschnitt „Bereitstellungsaktion“ der Datei codepipeline.json hinzu. Weitere Informationen finden Sie in der CodePipeline-Pipeline-Strukturreferenz im CodePipeline-Benutzerhandbuch.

Beispiel für kontoübergreifendes IAM RoleLearn

"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",

Beispiel für eine Bereitstellungsaktion, die eine kontoübergreifende IAM-Rolle (ARN) beinhaltet

Wichtig: Ersetzen Sie die Benutzer-Konto-ID durch die AWS-Konto-ID Ihres Produktionskontos.

{
  "name": "Deploy",
  "actions": [
    {
      "name": "Deploy",
      "actionTypeId": {
        "category": "Deploy",
        "owner": "AWS",
        "provider": "S3",
        "version": "1"
      },
      "runOrder": 1,
      "configuration": {
        "BucketName": "codepipeline-output-bucket",
        "Extract": "true"
      },
      "outputArtifacts": [],
      "inputArtifacts": [
        {
          "name": "SourceArtifact"
        }
      ],
      "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role",
      "region": "us-east-1",
      "namespace": "DeployVariables"
    }
  ]
}

3.    Entfernen Sie den Metadatenbereich am Ende der Datei codepipeline.json.

Wichtig: Stellen Sie sicher, dass Sie auch das Komma vor dem Metadatenabschnitt entfernen.

Beispiel für einen Abschnitt mit Metadaten

"metadata": {
    "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy",
    "created": 1587527378.629,
    "updated": 1587534327.983
}

4.    Aktualisieren Sie die Pipeline, indem Sie den folgenden Befehl ausführen:

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

Laden Sie die Beispielwebsite in den Eingabe-Bucket hoch

1.    Öffnen Sie die Amazon S3-Konsole im Entwicklungskonto.

2.    Wählen Sie in der Liste der Bucket-Namen Ihren S3-Bucket für die Entwicklungseingabe. Zum Beispiel: codepipeline-input-bucket.

3.    Wählen Sie Upload. Wählen Sie dann Dateien hinzufügen.

4.    Wählen Sie die Datei sample-website.zip aus, die Sie zuvor heruntergeladen haben.

5.    Wählen Sie Upload, um die Pipeline auszuführen. Wenn die Pipeline läuft, passiert Folgendes:

  • Die Quellaktion wählt die Datei sample-website.zip aus dem S3-Bucket für die Entwicklungseingabe (codepipeline-input-bucket). Anschließend platziert die Quellaktion die Zip-Datei als Quellartefakt im Artefakt-Bucket des Entwicklungskontos (codepipeline-us-east-1-0123456789).
  • In der Bereitstellungsaktion übernimmt die CodePipeline-Dienstrolle (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) die kontenübergreifende Rolle (prods3role) im Produktionskonto.
  • CodePipeline verwendet die kontoübergreifende Rolle (prods3role), um auf den KMS-Schlüssel und den Artefakt-Bucket im Entwicklungskonto zuzugreifen. Anschließend stellt CodePipeline die extrahierten Dateien für den S3-Bucket für die Produktionsausgabe (codepipeline-output-bucket) im Produktionskonto bereit.

Hinweis: Das Produktionskonto ist der Besitzer der extrahierten Objekte im S3-Bucket für die Produktionsausgabe (codepipeline-output-bucket).


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren