スキップしてコンテンツを表示

CodePipeline を用いて、サービスマネージド CloudFormation StackSet を委任管理者アカウントにデプロイする方法を教えてください。

所要時間3分
0

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 リージョンを [パラメータ] セクションに追加します。たとえば、TargetRegionsaa-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"

AWS公式更新しました 1年前
コメントはありません