Salta al contenuto

Come posso utilizzare CodePipeline per distribuire uno StackSet CloudFormation gestito dal servizio in un account amministratore delegato?

5 minuti di lettura
0

Desidero utilizzare AWS CodePipeline per distribuire uno StackSet AWS CloudFormation che utilizzi come destinazioni unità organizzative (UO) in AWS Organizations. Desidero utilizzare le autorizzazioni gestite dal servizio per distribuire lo stack in un account amministratore delegato.

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.

Prerequisito: attiva l'accesso attendibile tra AWS CloudFormation StackSets e Organizations. Per le autorizzazioni, consulta Autorizzazioni necessarie per abilitare l'accesso attendibile. Devi essere un utente amministratore nell'account di gestione per abilitare l'accesso attendibile.

Registra l'account amministratore delegato

Per delegare un account membro come account amministratore, esegui questo comando AWS CLI register-delegated-administrator:

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

Nota: sostituisci 111122223333 con l'ID del tuo account.

Per verificare la registrazione, esegui questo comando CLI list-delegated-administrators:

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

Configura la pipeline

Per creare una pipeline che consenta le operazioni di CloudFormation, puoi utilizzare la console Codepipeline o AWS CLI.

Utilizza la console

Per creare una pipeline utilizzando la console CodePipeline, consulta Crea una pipeline da modelli statici. Per Configure template (Configura modello), aggiungi questo modello cp-template.yaml:

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

Nota: il ruolo di servizio AWS Identity and Access Management (AWS IAM) specificato per CallAs deve avere l'autorizzazione organizations:ListDelegatedAdministrators.

Utilizza AWS CLI

Per creare la pipeline utilizzando AWS CLI, consulta Creazione di una pipeline (CLI).

(Facoltativo) Crea uno stack

Se non utilizzi un modello per creare la pipeline, devi creare uno stack in CloudFormation per la pipeline.

Utilizza la console

Per creare uno stack utilizzando la console CloudFormation, consulta Creazione di uno stack. Nella sezione Parametri, aggiungi le Regioni AWS in cui vengono distribuite le istanze StackSet. Ad esempio, includi aa-example-1, aa-example-2 in TargetRegions. Assicurati che il ruolo di servizio IAM specificato per CallAs abbia l'autorizzazione organizations:ListDelegatedAdministrators.

Nota: dopo aver creato lo stack, è normale che la pipeline generi un errore perché non hai caricato il file .zip di origine. Il file .zip viene caricato dopo aver preparato i file di origine.

Utilizza AWS CLI

Utilizza lo stesso percorso di file che hai usato per cp-template.yaml, quindi esegui questo comando AWS CLI create-stack:

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

Nota: sostituisci stack-name con il nome del tuo stack, //./cp-template.yaml con il percorso del tuo file e aa-example-1 e aa-example-2 con le tue Regioni.

Carica i file di origine nel bucket Amazon S3

Prepara i file di origine

Per definire le destinazioni della distribuzione, create un file .txt denominato ou.txt. Aggiungi il seguente codice al file .txt:

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

Per definire i parametri del modello CloudFormation, crea un file .txt denominato parameters.txt. Aggiungi il seguente codice al file .txt:

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

Per creare il modello StackSet, crea un file .txt denominato template.yaml. Aggiungi il seguente codice al file .txt:

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

Distribuisci i file di origine

Comprimi i tre file in source.zip, quindi carica il file .zip nella directory principale del bucket Amazon Simple Storage Service (Amazon S3) di origine. Se la pipeline dà esito negativo e ricevi l'errore "Account used is not a delegated administrator", verifica di aver registrato l'account come amministratore delegato.

Informazioni correlate

Riferimento alle operazioni di distribuzione di AWS CloudFormation StackSets

How do I resolve the error when I run the ListStackSets operation?"Account used is not a delegated administrator" (Come posso risolvere l'errore "Account used is not a delegated administrator" quando eseguo l'operazione ListStackSets?)

AWS UFFICIALEAggiornata 3 mesi fa