Direkt zum Inhalt

Wie verwende ich CodePipeline, um ein vom Dienst verwaltetes CloudFormation StackSet in einem delegierten Administratorkonto bereitzustellen?

Lesedauer: 4 Minute
0

Ich möchte AWS CodePipeline verwenden, um ein AWS CloudFormation StackSet für Zielorganisationseinheiten (OUs) in AWS-Organisationen bereitzustellen. Ich möchte dienstverwaltete Berechtigungen verwenden, um den Stack in einem delegierten Administratorkonto bereitzustellen.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Voraussetzung: Aktiviere den vertrauenswürdigen Zugriff zwischen AWS CloudFormation StackSets und Organizations. Informationen zu Berechtigungen findest du unter Berechtigungen, die für den vertrauenswürdigen Zugriff erforderlich sind. Du musst ein Administratorbenutzer im Verwaltungskonto sein, um den vertrauenswürdigen Zugriff zu aktivieren.

Delegiertes Administratorkonto registrieren

Um ein Mitgliedskonto als Administratorkonto zu delegieren, führe den folgenden AWS-CLI-Befehl register-delegated-administrator aus:

aws organizations register-delegated-administrator \
  --service-principal=member.org.stacksets.cloudformation.amazonaws.com \
  --account-id="111122223333"

Hinweis: Ersetze 111122223333 durch deine AWS-Konto-ID.

Führe den folgenden CLI-Befehl list-delegated-administrators aus, um die Registrierung zu überprüfen:

aws organizations list-delegated-administrators \
    --service-principal=member.org.stacksets.cloudformation.amazonaws.com

Pipeline einrichten

Um eine Pipeline zu erstellen, die CloudFormation-Aktionen ermöglicht, kannst du die Code-Pipeline-Konsole oder die AWS-CLI verwenden.

Konsole verwenden

Informationen zum Erstellen einer Pipeline mithilfe der CodePipeline-Konsole findest du unter Erstellen einer Pipeline aus statischen Vorlagen. Füge für Vorlage konfigurieren die folgende cp-template.yaml-Vorlage hinzu:

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  TargetRegions:
    Type: String

Resources:
  Bucket:
    Type: "AWS::S3::Bucket"
    DeletionPolicy: Retain
    Properties:
      VersioningConfiguration:
        Status: Enabled

  ServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - codepipeline.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: CodePipelinePermissions
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:GetObjectVersion
                  - s3:GetBucketVersioning
                  - s3:PutObject
                  - s3:PutObjectAcl
                Resource:
                  - !Sub arn:aws:s3:::${Bucket}
                  - !Sub arn:aws:s3:::${Bucket}/*
              - Effect: Allow
                Action:
                  - cloudformation:CreateStackSet
                  - cloudformation:UpdateStackSet
                  - cloudformation:DeleteStackSet
                  - cloudformation:DescribeStackSet
                  - cloudformation:DescribeStackSetOperation
                  - cloudformation:ListStackInstances
                  - cloudformation:CreateStackInstances
                Resource: "*"
              - Effect: Allow
                Action:
                  - organizations:ListDelegatedAdministrators
                Resource: "*"

  Pipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      RoleArn: !GetAtt ServiceRole.Arn
      ArtifactStore:
        Type: S3
        Location: !Ref Bucket
      Stages:
        - Name: Source
          Actions:
            - Name: SourceAction
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: S3
                Version: "1"
              Configuration:
                S3Bucket: !Ref Bucket
                S3ObjectKey: "source.zip"
                PollForSourceChanges: false
              OutputArtifacts:
                - Name: SourceArtifact
        - Name: Deploy
          Actions:
            - Name: ServiceManaged-SS
              RunOrder: "1"
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Provider: CloudFormationStackSet
                Version: "1"
              Configuration:
                PermissionModel: SERVICE_MANAGED
                CallAs: DELEGATED_ADMIN
                OrganizationsAutoDeployment: Enabled
                Regions: !Ref TargetRegions
                StackSetName: !Sub codepipeline-deployed-cfn-${AWS::AccountId}-stackset
                MaxConcurrentPercentage: "50"
                FailureTolerancePercentage: "100"
                ConcurrencyMode: SOFT_FAILURE_TOLERANCE
                Capabilities: CAPABILITY_NAMED_IAM,CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
                DeploymentTargets: "SourceArtifact::ou.txt"
                TemplatePath: "SourceArtifact::template.yaml"
                Parameters: "SourceArtifact::parameters.txt"
              InputArtifacts:
                - Name: SourceArtifact

Hinweis: Die AWS Identity and Access Management (IAM)-Servicerolle, die du für CallAs angegeben hast, muss über die Berechtigung organizations:ListDelegatedAdministrators verfügen.

AWS CLI verwenden

Informationen zur Verwendung der AWS-CLI zum Erstellen der Pipeline findest du unter Pipeline erstellen (CLI).

(Optional) Stapel erstellen

Wenn du keine Vorlage verwendest, um deine Pipeline zu erstellen, musst du in CloudFormation einen Stack für deine Pipeline erstellen.

Konsole verwenden

Informationen zum Erstellen eines Stacks mithilfe der CloudFormation-Konsole findest du unter Stapel erstellen. Füge im Abschnitt Parameter die AWS-Regionen hinzu, in denen die StackSet-Instances bereitgestellt werden. Füge beispielsweise aa-example-1, aa-example-2 in TargetRegions ein. Stelle sicher, dass die IAM-Servicerolle, die du für CallAs angegeben hast, über die Berechtigung organizations:ListDelegatedAdministrators verfügt.

Hinweis: Nachdem du den Stack erstellt hast, wird erwartet, dass die Pipeline fehlschlägt, weil du die ZIP-Quelldatei nicht hochgeladen hast. Du lädst die ZIP-Datei hoch, nachdem du die Quelldateien vorbereitet hast.

AWS CLI verwenden

Verwende denselben Dateipfad, den du für cp-template.yaml verwendet hast, und führe dann den folgenden create-stack-AWS-CLI-Befehl aus:

aws cloudformation create-stack \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM \
  --template-body file://cp-template.yaml \
  --parameters ParameterKey=TargetRegions,ParameterValue=aa-example-1\\,aa-example-2

Hinweis: Ersetze stack-name durch den Namen deines Stacks, //./cp-template.yaml mit deinem Dateipfad und aa-example-1 sowie aa-example-2 mit deinen Regionen.

Quelldateien in deinen Amazon S3-Bucket hochladen

Quelldateien vorbereiten

Um Bereitstellungsziele zu definieren, erstelle eine TXT-Datei und nenne sie ou.txt. Füge der TXT-Datei den folgenden Code hinzu:

["ou-xrop-xxxxxxxx","ou-xrop-yyyyyyyy"]

Um die CloudFormation-Vorlagenparameter zu definieren, erstelle eine TXT-Datei und nenne sie parameters.txt. Füge der TXT-Datei den folgenden Code hinzu:

[
  {
    "ParameterKey": "VersioningStatus",
    "ParameterValue": "Enabled"
  }
]

Um die StackSet-Vorlage zu erstellen, erstelle eine TXT-Datei und nenne sie template.yaml. Füge der TXT-Datei den folgenden Code hinzu:

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  VersioningStatus:
    Type: String
    Default: Suspended
    AllowedValues:
      - Enabled
      - Suspended

Resources:
  S3Bucket:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Delete
    Properties:
      VersioningConfiguration:
        Status: !Ref VersioningStatus

Quelldateien bereitstellen

Komprimiere die drei Dateien in source.zip und lade dann die ZIP-Datei in das Stammverzeichnis des Amazon Simple Storage Service (Amazon S3)-Quell-Buckets hoch. Wenn die Pipeline fehlschlägt und der Fehler "Account used is not a delegated administrator" angezeigt wird, bestätige, dass du das Konto als delegierter Administrator registriert hast.

Ähnliche Informationen

Aktionsreferenz für die Bereitstellung von AWS CloudFormation StackSets

Wie behebe ich den Fehler , wenn ich den ListStackSets-Vorgang ausführe?"Account used is not a delegated administrator"

AWS OFFICIALAktualisiert vor 3 Monaten