他の AWS アカウントからリソースを使用するパイプラインを CodePipeline で作成する方法について説明します。 - AWS CodePipeline

他の AWS アカウントからリソースを使用するパイプラインを CodePipeline で作成する方法について説明します。

他の AWS アカウントによって作成し、管理されるリソースを使用するパイプラインを作成します。例えば、一つのアカウントにパイプラインを、別のアカウントに CodeDeploy リソースを使用します。

注記

複数のアカウントからのアクションを使用してパイプラインを作成する場合は、クロスアカウントパイプラインの制限内で、それらが引き続き案件にアクセスできるようにアクションを構成する必要があります。クロスアカウントのアクションには、以下の制限が適用されます。

  • 一般的に、アクションは次の場合にのみ、アーティファクトを消費できます。

    • アーティファクトがパイプラインアカウントと同じアカウントにある

    • アーティファクトが別のアカウントのアクションに対してパイプラインアカウントで作成されている

    • アーティファクトが、アクションと同じアカウントで前のアクションによって生成されている

    つまり、どちらのアカウントもパイプラインアカウントでない場合は、あるアカウントから別のアカウントにアーティファクトを渡すことはできません。

  • 以下のアクションタイプでは、クロスアカウントアクションはサポートされていません。

    • Jenkins ビルドアクション

この例では、使用する AWS Key Management Service(AWS KMSキー) を作成してパイプラインに追加し、クロスアカウントアクセスを有効化するようにアカウントのポリシーおよびロールをセットアップします。AWS KMS キーの場合、キー ID 、キー ARN 、またはエイリアス ARN を使用できます。

注記

エイリアスは、 KMS キー を作成したアカウントでのみ認識されます。クロスアカウントアクションの場合、キー ID またはキー ARN のみを使用してキーを識別できます。クロスアカウントアクションには他のアカウント (AccountB) のロールを使用するため、キー ID を指定すると他のアカウント (AccountB) のキーが使用されます。

このウォークスルーおよびサンプルでは、AccountAは、パイプラインの作成に使用したアカウントです。このアカウントでは、AWS CodePipeline で使用するパイプラインアーティファクトやサービスロールの保存先である Amazon S3 バケットにアクセスできます。AccountB は、CodeDeploy アプリケーション、デプロイグループ、および CodeDeploy によって使用されるサービスロールを作成するために使用したアカウントです。

AccountA でパイプラインを編集して、AccountB で作成した CodeDeploy アプリケーションを使用するには、AccountA を以下のようにします。

  • AccountB の ARN またはアカウント ID をリクエストします (このウォークスルーで、AccountB ID は012ID_ACCOUNT_B)。

  • パイプラインのリージョンで、AWS KMS カスタマーマネージドキーを作成または使用し、そのキーを使用して、サービスロール (CodePipeline_Service_Role) および AccountB にアクセス許可を付与します。

  • AccountB に許可する Amazon S3 バケットポリシーを作成し、Amazon S3 バケットへのアクセス (例えば、 codepipeline-us-east-2-1234567890)。

  • AccountA に許可されたポリシーが AccountB によって設定されているロールを前提に、そのポリシーをサービスロール ( CodePipeline_Service_Role) にアタッチします。

  • デフォルトキーではなく、カスタマーマネージドAWS KMS キーを使用するようにパイプラインを編集します。

AccountB のリソースが、AccountA で作成されているパイプラインにアクセスできるようにするには、AccountB は以下のように行います。

  • AccountA の ARN またはアカウント ID をリクエストします (このウォークスルーで、AccountA ID は 012ID_ACCOUNT_A)。

  • に適用するポリシーを作成します。Amazon EC2 インスタンスロール Amazon S3 バケットへのアクセスを許可する CodeDeploy (codepipeline-us-east-2-1234567890)。

  • Amazon EC2 インスタンスロール に適用するポリシーを作成し、パイプラインアーティファクトの暗号化に使用される AWS KMS 顧客管理キーへのアクセスを許可する CodeDeploy の設定を AccountA に行う。

  • IAM ロール (CrossAccount_Role) を設定して信頼関係ポリシーにアタッチし、AccountA の CodePipeline サービスロールがロールを引き受けることを許可します。

  • パイプラインで必要なデプロイリソースにアクセスできるようにするポリシーを作成し、CrossAccount_Role にアタッチします。

  • Amazon S3 バケット ( codepipeline-us-east-2-1234567890) にアクセスできるようにするポリシーを作成し、それを CrossAccount_Roleにアタッチします。

前提条件: AWS KMS 暗号化キーを作成する

カスタマーマネージドキーはリージョンに固有であり、すべて AWS KMS キーです。パイプラインが作成された同じリージョンでカスタマー管理 AWS KMS キーを作成する必要があります。(例えば、us-east-2)

AWS KMS でカスタマーマネージドポリシーを作成するには
  1. AWS マネジメントコンソール を使用して AccountA にサインインし、AWS KMS コンソールを開きます。

  2. 左側で [カスタマー管理キー]を選択します。

  3. [キーの作成] を選択します。[キーの設定] で、[対称] のデフォルトを選択したまま、[] を選択します。

  4. エイリアス に、このキーに使用するエイリアス(PipelineName-Keyなど)を入力します。必要に応じて、このキーの説明とタグを入力し、[] を選択します。

  5. [キー管理アクセス許可の定義] で、このキーの管理者となるロールを選択し、[次へ] を選択します。

  6. [キーの利用方法許可の定義] の [このアカウント] で、パイプラインのサービスロールの名前 (例えば CodePipeline_Service_Role など) を選択します。[別の AWS アカウント] で、追加 [別の AWS アカウント] を選択します。ARN の一部として AccountB のアカウント ID を入力し、[次へ ] を選択します。

  7. [キーポリシーの確認と編集]で、ポリシーを確認し、[完了]を選択します。

  8. キーのリストから、キーのエイリアスを選択し、その ARN (arn:aws:kms:us-east-2:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLEなど) にコピーします。この ARN は、パイプラインの編集時とポリシーの設定時に必要になります。

ステップ 1: アカウントポリシーおよびロールをセットアップする

AWS KMS キーを作成したら、クロスアカウントアクセスを有効にするポリシーを作成してアタッチします。作成するには、AccountAおよびAccountBの両方からアクションを行う必要があります。

パイプラインを作成するポリシーおよびロールをアカウントに設定する (AccountA)

他の AWS アカウントに関連付ける CodeDeploy リソースを使用するパイプラインを作成するには、AccountA で、アーティファクトを保存するCodePipeline Amazon S3 バケットおよび CodePipeline のサービスロールの両方のポリシーを設定する必要があります。

AccountB へのアクセスを許可する Amazon S3 バケットのポリシーを作成するには (コンソール)
  1. AWS マネジメントコンソール ルに AccountA でサインインして Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. Amazon S3 バケットのリストで、パイプラインのアーティファクトが保存される Amazon S3バケットを選択します。このバケットには、codepipeline-region-1234567EXAMPLE という名前が付けられます。ここで、リージョン はパイプラインを作成した AWS リージョンであり、1234567EXAMPLE はバケット名を一意にするための 10 桁の乱数 (codepipeline-us-east-2-1234567890 など) です。

  3. Amazon S3 バケットの詳細ページで、[Properties] を選択します。

  4. プロパティペインで、[アクセス許可] を展開し、[バケットポリシーの追加]を選択します。

    注記

    ポリシーがAmazon S3バケットにすでにアタッチされている場合は、バケットポリシーの編集 を選択します。以下の例のステートメントを既存のポリシーに追加できます。新しいポリシーを追加するには、そのためのリンクを選択し、AWSポリシージェネレーターの指示に従います。詳細については、「IAMポリシーの概要」を参照してください。

  5. バケットポリシーエディターウィンドウで AccountB にパイプラインアーティファクトへのアクセスを許可するポリシーを作成し、カスタムソースやビルドアクションなどのアクションによってアーティファクトが作成された場合、出力アーティファクトを追加する機能を AccountB に追加します。

  6. [保存] を選択したら、ポリシーエディタを閉じます。

  7. [保存] を選択して、Amazon S3 バケットに対するアクセス権限を保存します。

CodePipeline のサービスロールのポリシーを作成するには (コンソール)
  1. AWS マネジメントコンソール ルに AccountA でサインインして IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで [Roles(ロール)] を選択します。

  3. [ロール名] の下にあるロールのリストで、 CodePipeline のサービスロールの名前を選択します。

  4. [アクセス許可] タブで [インラインポリシーの追加]を選択します。

  5. [JSON] タブをクリックし、次のポリシーを入力して許可します。 AccountB を選択してロールを引き受けることができます。次の例では、012ID_ACCOUNT_Bは、AccountBの ARN です。

    JSON
    { "Version":"2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::111122223333:role/*" ] } }
  6. [ポリシーの確認]を選択します。

  7. [名前] に、このポリシーの名前を入力します。[Create policy]を選択します。

AWS リソースを所有するポリシーおよびロールをアカウントに設定する (AccountB)

CodeDeploy にアプリケーション、デプロイ、デプロイグループを作成したら、あわせて [Amazon EC2 インスタンスロール] を作成します。([Run Deployment Walkthrough]ウィザードを使用している場合はこのロールが作成されますが、手動で作成することもできます。) AccountA で作成されたパイプラインは AccountB で CodeDeploy リソース作成時に使用されます。以下を実行する必要があります。

  • パイプラインアーティファクトが保存されている Amazon S3 バケットにアクセスできるようにするインスタンスロールのポリシーを設定します。

  • クロスアカウントアクセス用に設定されているAccountBに 2 番目のロールを作成します。

    この 2 番目のロールは、AccountA の Amazon S3 バケットにアクセスできるだけでなく、CodeDeploy リソースへのアクセスを許可するポリシーと、AccountA の CodePipeline サービスロールにロールを引き受けることを許可するポリシーを含んでいる必要があります。

    注記

    これらのポリシーは、他の AWS アカウントを使用して作成されているパイプラインで使用される CodeDeploy リソースのセットアップにのみ使用できます。そのほかの AWS リソースの場合は、リソース要件固有のポリシーが必要です。

CodeDeploy (コンソール) 用に設定した Amazon EC2 インスタンスロールのポリシーを作成するには
  1. AWS マネジメントコンソール に AccountB でサインインして IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで [Roles (ロール)]を選択します。

  3. [ロール名] の下にあるロールのリストで、 CodeDeploy アプリケーションの Amazon EC2 インスタンスロールとして使用するサービスロールの名前を選択します。このロール名はさまざまで、デプロイグループで複数のインスタンスロールを使用できます。詳細については、「Amazon EC2 インスタンスの IAM インスタンスプロファイルを作成する」を参照してください。

  4. [アクセス許可] タブで [インラインポリシーの追加]を選択します。

  5. JSON タブで、以下のポリシーを入力して、 Amazon S3 バケットへのアクセスを許可します。AccountA パイプラインのアーティファクトを保存するには (この例では、codepipeline-us-east-2-1234567890):

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }
  6. [ポリシーの確認]を選択します。

  7. [名前] に、このポリシーの名前を入力します。[Create policy]を選択します。

  8. AWS KMS の2番目のポリシーを作成します。このポリシーで、 arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE AccountAで作成されたカスタマーマネージドキーの ARN であり、AccountB にそのキーの使用を許可しています。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/2222222-3333333-4444-556677EXAMPLE" ] } ] }
    重要

    ここで示しているように、このポリシーでは、 キーのリソース ARN の一部として AccountAAWS KMS のアカウント ID を使用する必要があります。使用しないと、そのポリシーは機能しません。

  9. [ポリシーの確認]を選択します。

  10. [名前] に、このポリシーの名前を入力します。[Create policy]を選択します。

ここで、クロスアカウントアクセスに使用する IAMロールを作成し、AccountA の CodePipeline サービスロールがロールを引き受けられるように設定します。このロールは、CodeDeploy リソースへのアクセスを許可するポリシーと、AccountA でアーティファクトの保存に使用される Amazon S3 バケットが含まれている必要があります。

IAM でクロスアカウントロールを設定するには
  1. AWS マネジメントコンソール に AccountB でサインインして IAM コンソール (https://console.aws.amazon.com/iam) を開きます。

  2. ナビゲーションペインで [Roles (ロール)]を選択します。[ロールの作成] を選択します。

  3. [Select type of trusted entity](信頼できるエンティティのタイプを選択) で、[AnotherAWSaccount](別のアカウント) を選択します。このロールを使用できるアカウントを指定するアカウント ID に、 AWS アカウント ID で CodePipeline (AccountA)でパイプラインを作成するアカウントを入力し、[Next :許可] を選択します。

    重要

    この手順では、AccountBAccountAとの間に信頼関係ポリシーを作成します。ただし、これによりアカウントへのルートレベルのアクセスが許可されるため、CodePipeline は AccountA の CodePipeline サービスロールにスコープを絞ることを推奨しています。ステップ 16 に従ってアクセス許可を制限します。

  4. [Attach permissions policies (アクセス許可ポリシーのアタッチ)] ページで、[AmazonS3ReadOnlyAccess]、[Next :タグ] の順に選択します。

    注記

    これは、使用するポリシーではありません。ウィザードを完了するために、ポリシーを選択する必要があります。

  5. [Next: Review (次へ: レビュー)]を選択します。ロール名 に (CrossAccount_Roleなど) のロールを名前に入力します。IAMの命名規則に従う限り、このロールの名前は任意に指定できます。ロールの目的が明確になる名前を付けることを検討してください。[Create Role]を選択します。

  6. ロールのリストから、作成したポリシー (CrossAccount_Role など) を選択して、そのロールの [Summary] ページを開きます。

  7. [アクセス許可] タブで [インラインポリシーの追加]を選択します。

  8. [JSON] タブで、以下のポリシーを入力して、CodeDeploy リソースへのアクセスを許可します。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" } ] }
  9. [ポリシーの確認]を選択します。

  10. [名前] に、このポリシーの名前を入力します。[ Create policy]を選択します。

  11. [アクセス許可] タブで [インラインポリシーの追加]を選択します。

  12. [JSON] タブを選択し、 以下のポリシーを入力して、このロールに AccountA の Amazon S3 バケットに対する入力アーティファクトの取得と出力アーティファクトの保存を許可します。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }
  13. [ポリシーの確認]を選択します。

  14. [名前] に、このポリシーの名前を入力します。[Create policy]を選択します。

  15. [アクセス許可] タブで、[ポリシー名] の下のポリシーの一覧で AmazonS3ReadOnlyAccess を探し、ポリシーの横にある削除アイコン (X) を選択します。プロンプトが表示されたら、[Detach]を選択します。

  16. [信頼関係] タブ、[信頼ポリシーを編集] の順に選択します。左側の列で [プリンシパルを追加] オプションを選択します。[プリンシパルタイプ] で、[IAM ロール] を選択し、AccountA の CodePipeline サービスロールの ARN を指定します。[AWS プリンシパル] のリストから arn:aws:iam::Account_A:root を削除し、[ポリシーを更新] を選択します。

ステップ 2: パイプラインを編集する

CodePipeline コンソールを使用して、他の AWS アカウントに関連付けられているリソースを使用するパイプラインを作成または編集することはできません。ただし、コンソールを使用してパイプラインの一般的な構造を作成し、その後 AWS CLI を使用して、パイプラインを編集し、そのリソースを追加することができます。または、既存のパイプラインの構造を使用して、リソースを手動で追加することもできます。

別の AWS アカウントに関連付けられているリソースを追加するには(AWS CLI)
  1. ターミナル ( Linux, macOS , or Unix ) またはコマンドプロンプト ( Windows ) で、リソースを追加するパイプラインに対して get-pipeline コマンドを実行します。コマンドの出力を JSON ファイルにコピーします。例えば、MyFirstPipeline という名前のパイプラインに対しては、以下のようなコマンドを入力します。

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    出力は、pipeline.json ファイルを開きます。

  2. 任意のプレーンテキストエディタで JSON ファイルを開きます。アーティファクトストアの "type": "S3" の後に、KMS 暗号化キー、ID、タイプ情報を追加します。ここで、codepipeline-us-east-2-1234567890 は、Amazon S3 バケット名で使用されるパイプラインのアーティファクトの保存にされ、arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE は、先ほど作成したカスタマー管理キーの ARN です。

    { "artifactStore”: { "location": "codepipeline-us-east-2-1234567890", "type": "S3", "encryptionKey": { "id": "arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE", "type": "KMS" } },
  3. AccountB に関連付けられている CodeDeploy リソースを使用するためのデプロイアクションをステージに追加して、roleArn 値など作成したクロスアカウントロール (CrossAccount_Role) に指定します。

    以下の例では、ExternalDeployという名前のデプロイアクションを追加する JSON を示しています。また、AccountBで作成された CodeDeploy リソースを Staging という名前のステージで使用しています。以下の例では、AccountBの ARN は012ID_ACCOUNT_Bです。

    , { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyAppBuild" } ], "name": "ExternalDeploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "AccountBApplicationName", "DeploymentGroupName": "AccountBApplicationGroupName" }, "runOrder": 1, "roleArn": "arn:aws:iam::012ID_ACCOUNT_B:role/CrossAccount_Role" } ] }
    注記

    これは、パイプライン全体の JSON ではなく、ステージでのアクションの構造です。

  4. metadata コマンドが使用できるように、ファイルから update-pipeline 行を削除する必要があります。JSON ファイルのパイプライン構造からセクションを削除します ("metadata": { } 行と、"created""pipelineARN"、および"updated"フィールド)。

    例えば、構造から以下の行を削除します。

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" }

    ファイルを保存します。

  5. 変更を適用するには、以下のように、パイプライン JSON ファイルを指定して、 update-pipeline コマンドを実行します。

    重要

    ファイル名の前に必ず file:// を含めてください。このコマンドでは必須です。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    このコマンドは、編集したパイプラインの構造全体を返します。

別の AWS アカウントに関連付けられているリソースを使用するパイプラインをテストするには
  1. ターミナル ( Linux, macOS , or Unix ) またはコマンドプロンプト ( Windows ) で、以下のように、パイプラインの名前を指定して、start-pipeline-execution コマンドを実行します。

    aws codepipeline start-pipeline-execution --name MyFirstPipeline

    詳細については、「パイプラインを手動で開始する」を参照してください。

  2. AWS マネジメントコンソール にサインインして、CodePipeline コンソール ( https://console.aws.amazon.com/codesuite/codebuild/home) を開きます。

    AWS アカウントに関連付けられているすべてのパイプラインの名前が表示されます。

  3. [Name]で、先ほど編集したパイプラインの名前を選択します。これにより、パイプラインの詳細ビューが開いて、パイプラインの各ステージの各アクションの状態などがわかります。

  4. パイプラインの進行状況を監視します。別の AWS アカウントに関連付けられているリソースを使用するアクションの成功メッセージを待ちます。

    注記

    AccountA を使用してサインインしている間にアクションの詳細を表示しようとすると、エラーが発生します。サインアウトしてから、AccountB でサインインして、 CodeDeploy でデプロイの詳細を表示します。