跳至內容

我該如何使用 CodePipeline 在受委派的管理員帳戶中部署由服務管理的 CloudFormation StackSet?

3 分的閱讀內容
0

我想要使​​用 AWS CodePipeline 將 AWS CloudFormation StackSet 部署到 AWS Organizations 中的目標組織單位 (OU)。我想使用服務管理的權限,在受委派的管理員帳戶中部署堆疊。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

先決條件:啟動 AWS CloudFormation StackSets 與組織之間的可信任存取。有關權限,請參閱啟用可信任存取所需的權限。您必須是管理帳戶中的管理員使用者才能啟動可信任存取。

註冊委派管理員帳戶

若要將會員帳戶委派為管理員帳戶,請執行以下 register-delegated-administrator AWS CLI 命令:

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

**注意:**將 111122223333 替換為您的帳戶 ID。

若要確認註冊,請執行以下 list-delegated-administrators CLI 命令:

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

設定管道

若要建立允許執行 CloudFormation 動作的管道,您可以使用 Codepipeline 主控台或 AWS CLI。

使用主控台

若要使用 CodePipeline 主控台建立管道,請參閱從靜態範本建立管道。對於設定範本,請新增以下 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

**注意:**您為 CallAs 指定的 AWS Identity and Access Management (IAM) 服務角色必須具有 organizations:ListDelegatedAdministrators 權限。

使用 AWS CLI

若要使用 AWS CLI 建立管道,請參閱建立管道 (CLI)

(選用) 建立堆疊

如果您未使用範本來建立管道,則必須在 CloudFormation 中為您的管道建立一個堆疊。

使用主控台

若要使用 CloudFormation 主控台建立堆疊,請參閱建立堆疊。在 Parameters (參數) 區段中,新增 StackSet 執行個體要部署到的 AWS 區域。例如,在 TargetRegions 中加入 aa-example-1,aa-example-2。確保您為 CallAs 指定的 IAM 服務角色具有 organizations:ListDelegatedAdministrators 權限。

**注意:**在您建立堆疊之後,由於尚未上傳來源的 .zip 檔案,預期管道會失敗。您需要在準備好來源檔案後上傳 .zip 檔案。

使用 AWS CLI

使用與 cp-template.yaml 相同的檔案路徑,然後執行以下 create-stack AWS CLI 命令:

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

**注意:**將 stack-name 替換為您的堆疊名稱,將 //./cp-template.yaml 替換為您的檔案路徑,並將 aa-example-1aa-example-2 替換為您的區域。

將原始檔案上傳到您的 Amazon S3 儲存貯體

準備來源檔案

若要定義部署目標,請建立一個 .txt 檔案,並將其命名為 ou.txt。將以下程式碼新增至 .txt 檔案:

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

若要定義 CloudFormation 範本參數,請建立一個 .txt 檔案,並將其命名為 parameters.txt。將以下程式碼新增至 .txt 檔案:

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

若要建立 StackSet 範本,請建立一個 .txt 檔案,並將其命名為 template.yaml。將以下程式碼新增至 .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

部署原始檔案

將這三個檔案壓縮為 source.zip,然後將 .zip 檔案上傳到來源 Amazon Simple Storage Service (Amazon S3) 儲存貯體的根目錄。如果管道失敗且您收到 "Account used is not a delegated administrator" 錯誤,請確認您已將該帳戶註冊為委派管理員。

相關資訊

AWS CloudFormation StackSets 部署動作參考

如何解決執行 ListStackSets 作業時出現的錯誤 ?"Account used is not a delegated administrator"

AWS 官方已更新 3 個月前