別の AWS アカウントのリソース CodePipeline を使用するパイプラインを に作成する - AWS CodePipeline

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

別の AWS アカウントのリソース CodePipeline を使用するパイプラインを に作成する

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

注記

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

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

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

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

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

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

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

    • Jenkins ビルドアクション

この例では、使用する AWS Key Management Service (AWS KMS) キーを作成し、パイプラインにキーを追加し、クロスアカウントアクセスを有効にするためのアカウントポリシーとロールを設定する必要があります。 AWS KMS キーの場合、キー ID、キー ARN、またはエイリアス ARN を使用できます。

注記

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

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

AccountA が AccountB によって作成された CodeDeploy アプリケーションを使用するようにパイプラインを編集するには、AccountA は次のことを行う必要があります。 AccountB

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

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

  • Amazon S3 バケットへのアクセスを AccountB に付与する Amazon S3 バケットポリシーを作成します (例: codepipeline-us-east-2-1234567890)。

  • AccountAAccountB によって設定されたロールを引き受けることを許可するポリシーを作成し、そのポリシーをサービスロール (CodePipeline_Service_Role) にアタッチします。

  • パイプラインを編集して、デフォルト AWS KMS キーの代わりにカスタマーマネージドキーを使用します。

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

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

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

  • AccountA のパイプラインアーティファクトの暗号化に使用される AWS KMS カスタマーマネージドキーへのアクセス CodeDeploy を許可する、 に設定されている Amazon EC2 インスタンスロールに適用されるポリシーを作成します。

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

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

  • Amazon S3 バケット (-) へのアクセスを許可するポリシーを作成し、CrossAccount_Role にアタッチします。codepipeline-us-east2-1234567890

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

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

でカスタマーマネージドキーを作成するには AWS KMS
  1. AccountA AWS Management Console で にサインインし、コンソールを開きます 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)

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

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

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

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

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

    注記

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

  5. [Bucket Policy Editor]ウィンドウに以下のポリシーを入力します。これにより、AccountB はパイプラインアーティファクトにアクセスできるようになり、カスタムソースやビルドアクションなどのアクションによって作成された場合は、AccountBで出力アーティファクトを追加することができます。

    次の例では、AccountBの ARN は、012ID_ACCOUNT_Bです。Amazon S3 バケットの ARN は codepipeline-us-east-2-1234567890 です。これらの ARN を、アクセスを許可するアカウントの ARN、および Amazon S3 バケットの ARN に置き換えます。

    { "Version": "2012-10-17", "Id": "SSEAndSSLPolicy", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "Bool": { "aws:SecureTransport": false } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890" } ] }
  6. [保存] を選択したら、ポリシーエディタを閉じます。

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

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

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

  3. ロールのリストのロール名 で、 のサービスロールの名前を選択します CodePipeline。

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

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

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::012ID_ACCOUNT_B: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 リソースには、リソース要件に固有のポリシーが必要です。

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

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

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

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

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

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

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

  8. の 2 つ目のポリシーを作成します。 AWS KMS ここで、 arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLEAccountA で作成され、AccountB がそのキーを使用できるように設定されたカスタマーマネージドキーの ARN です。

    { "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:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE" ] } ] }
    重要

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

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

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

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

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

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

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

    重要

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

  4. アクセス許可ポリシー をアタッチAmazonS3ReadOnlyAccess を選択し、次へ: タグ を選択します。

    注記

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

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

  6. ロールのリストから、先ほど作成したロール (CrossAccount_Role など) を選択して、そのロールの概要ページを開きます。

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

  8. JSON タブを選択し、次のポリシーを入力して CodeDeploy リソースへのアクセスを許可します。

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

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

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] } ] }
  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 encryptionKey 、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. ステージにデプロイアクションを追加して、作成したクロスアカウントロール (CrossAccount_RoleAccountB に関連付けられた CodeDeploy リソースを使用します。 roleArn

    次の例は、 という名前のデプロイアクションを追加する JSON を示していますExternalDeploy。ステージング という名前のステージで AccountB で作成された CodeDeploy リソースを使用します。 以下の例では、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. AccountA AWS Management Console で にサインインし、 CodePipelinehttp://console.aws.amazon.com/codesuite/codepipeline/home でコンソールを開きます。

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

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

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

    注記

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