CodePipeline を用いて、サービスマネージド CloudFormation StackSet を委任管理者アカウントにデプロイする方法を教えてください。
AWS CodePipeline を使用し、AWS CloudFormation StackSet を AWS Organizations の組織単位 (OU) にデプロイしたいと考えています。サービスマネージド権限により、委任管理者アカウントにスタックをデプロイしたいです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
前提条件: AWS CloudFormation StackSets と Organization 間で信頼されたアクセスが有効であること。権限については、「信頼されたアクセスの有効化に必要な権限」を参照してください。信頼されたアクセスを有効にするには、管理アカウントの管理者ユーザーである必要があります。
委任管理者アカウントを登録する
メンバーアカウントを管理者アカウントとして委任するには、次の AWS CLI コマンド register-delegated-administrator を実行します。
aws organizations register-delegated-administrator \ --service-principal=member.org.stacksets.cloudformation.amazonaws.com \ --account-id="111122223333"
注: 111122223333 をアカウント ID に置き換えてください。
登録を確認するには、次の CLI コマンド list-delegated-administrators を実行します。
aws organizations list-delegated-administrators \ --service-principal=member.org.stacksets.cloudformation.amazonaws.com
パイプラインを設定する
CloudFormation アクションを許可するパイプラインを作成するには、コードパイプラインコンソールまたは 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 コンソールを使用してスタックを作成する場合は、「スタックの作成」を参照してください。StackSet インスタンスのデプロイ先となる AWS リージョンを [パラメータ] セクションに追加します。たとえば、TargetRegions に aa-example-1, aa-example-2 を含めます。CallAs に指定する IAM サービスロールには、organizations:ListDelegatedAdministrators 権限が必要です。
注: スタックの作成後、ソースの .zip ファイルがアップロードされていないことが原因で、パイプラインで障害が発生することが想定されます。ソースファイルの準備後、.zip ファイルをアップロードします。
AWS CLI を使用する
cp-template.yaml のファイルパスと同じパスを指定し、次の 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
注: 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
ソースファイルをデプロイする
3 つのファイルを 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"
- 言語
- 日本語

関連するコンテンツ
質問済み 8年前
AWS公式更新しました 10ヶ月前