我該如何使用 CodePipeline 在受委派的管理員帳戶中部署由服務管理的 CloudFormation StackSet?
我想要使用 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-1 和 aa-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"
- 語言
- 中文 (繁體)

相關內容
- 已提問 3 個月前