CodePipeline
ユーザーガイド (API バージョン 2015-07-09)

CodePipeline サービスロールの管理

パイプライン実行プロセスの一部に対するアクセス許可は、IAM ユーザーではなく、CodePipeline に代わって動作する他のロールタイプに付与されます。サービスロールは、アカウントのリソースを使用するための CodePipeline のアクセス許可を付与する IAM ロールです。サービスロールは、CodePipeline で初めてパイプラインを作成する場合にのみ作成する必要があります。

CodePipeline では、パイプラインのステージおよびアクションを通じて、リビジョンを処理する際にこのサービスロールを使用します。このロールは、パイプラインによって使用される AWS リソースへのアクセスを制御する 1 つ以上のポリシーで設定されています。追加ポリシーをこのロールにアタッチする、ロールにアタッチされているポリシーを編集する、または AWS の他のサービスロールのポリシーを設定する場合があります。また、パイプラインへクロスアカウントアクセスを設定する際に、ポリシーをロールにアタッチすることがあります。

警告

デフォルトの CodePipeline サービスロールポリシーでは、多くの統合された AWS サービスに対して広範なアクセス許可が有効になります。サービスロールのステートメントを編集して、使用していないリソースへのアクセスを削除します。IAM ポリシーを作成するときは、最小限の特権を認めるという AWS のセキュリティアドバイスに従います。そうすれば、タスクを実行するというリクエストのアクセス許可のみを認めることができます。詳細については、「未使用の AWS サービスのアクセス許可の削除」を参照してください。

アクセス許可の範囲を制限する場合は、ポリシーステートメントを変更するか、ロールに別のポリシーをアタッチすると、パイプラインが機能しなくなる可能性があることに注意してください。パイプラインは、必ずサービスロールに変更してからテストします。

デフォルトの CodePipeline サービスロールのポリシーの確認

デフォルトでは、CodePipeline の IAM サービスロールのポリシーステートメント、AWS-CodePipeline-Service には、アカウントの他のリソースを使用するために CodePipeline で必要なアクセス許可が含まれます。

注記

コンソールでは、2018 年 9 月より前に作成されたサービスロールは、「oneClick_AWS-CodePipeline-Service_ID-Number」という名前で作成されています。

2018 年 9 月以降に作成されたサービスロールは、サービスロール名の形式として「AWSCodePipelineServiceRole-Region-Pipeline_Name」を使用しています。たとえば、eu-west-2 においてコンソールで作成したパイプラインの名前が MyFirstPipeline である場合、作成されるサービスロール名は「AWSCodePipelineServiceRole-eu-west-2-MyFirstPipeline」となります。

現在、AWS-CodePipeline-Service には、次のポリシーステートメントが含まれます。

{ "Statement": [ { "Action": [ "iam:PassRole" ], "Resource": "*", "Effect": "Allow", "Condition": { "StringEqualsIfExists": { "iam:PassedToService": [ "cloudformation.amazonaws.com", "elasticbeanstalk.amazonaws.com", "ec2.amazonaws.com", "ecs-tasks.amazonaws.com" ] } } }, { "Action": [ "codecommit:CancelUploadArchive", "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetUploadArchiveStatus", "codecommit:UploadArchive" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplication", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "elasticbeanstalk:*", "ec2:*", "elasticloadbalancing:*", "autoscaling:*", "cloudwatch:*", "s3:*", "sns:*", "cloudformation:*", "rds:*", "sqs:*", "ecs:*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "lambda:InvokeFunction", "lambda:ListFunctions" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "opsworks:CreateDeployment", "opsworks:DescribeApps", "opsworks:DescribeCommands", "opsworks:DescribeDeployments", "opsworks:DescribeInstances", "opsworks:DescribeStacks", "opsworks:UpdateApp", "opsworks:UpdateStack" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "cloudformation:CreateStack", "cloudformation:DeleteStack", "cloudformation:DescribeStacks", "cloudformation:UpdateStack", "cloudformation:CreateChangeSet", "cloudformation:DeleteChangeSet", "cloudformation:DescribeChangeSet", "cloudformation:ExecuteChangeSet", "cloudformation:SetStackPolicy", "cloudformation:ValidateTemplate" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "codebuild:BatchGetBuilds", "codebuild:StartBuild" ], "Resource": "*", "Effect": "Allow" }, { "Effect": "Allow", "Action": [ "devicefarm:ListProjects", "devicefarm:ListDevicePools", "devicefarm:GetRun", "devicefarm:GetUpload", "devicefarm:CreateUpload", "devicefarm:ScheduleRun" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "servicecatalog:ListProvisioningArtifacts", "servicecatalog:CreateProvisioningArtifact", "servicecatalog:DescribeProvisioningArtifact", "servicecatalog:DeleteProvisioningArtifact", "servicecatalog:UpdateProduct" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cloudformation:ValidateTemplate" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ecr:DescribeImages" ], "Resource": "*" } ], "Version": "2012-10-17" }

注記

CodePipeline のサービスロールに、AWS Elastic Beanstalk を使用するパイプラインの "elasticbeanstalk:DescribeEvents" アクションが含まれていることを確認します。このアクセス許可がないと、AWS Elastic Beanstalk のデプロイアクションは失敗やエラーになることなく中止します。

他の AWS サービスのアクセス許可の追加

サービスロールのポリシーステートメントは、パイプラインで使用する前に、デフォルトのサービスロールのポリシーステートメントに含まれていない AWS サービスのアクセス許可で更新する必要があります。

これは、AWS サービスの CodePipeline にサポートが追加される前に、パイプラインで使用しているサービスロールが作成された場合に特に重要です。

以下のテーブルは、他の AWS サービスにサポートが追加された場合の例を示しています。

AWS サービス CodePipeline のサポート日付
Amazon ECR 2018 年 11 月 27 日
AWS Service Catalog 2018 年 10 月 16 日
AWS Device Farm 2018 年 7 月 19 日
Amazon ECS 2017 年 12 月 12 日
CodeCommit 2016 年 4 月 18 日
AWS OpsWorks 2016 年 6 月 2 日
AWS CloudFormation 2016 年 11 月 3 日
AWS CodeBuild​ 2016 年 12 月 1 日

追加サポートサービスのアクセス許可を追加するには、以下の手順を行います。

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. IAM コンソールのナビゲーションペインで、[Roles] を選択し、ロールのリストから AWS-CodePipeline-Service ロールを選択します。

  3. サービスロールポリシーの列の インラインポリシー の [Permissions] タブで、Edit Policy を選択します。

    注記

    サービスロールには、oneClick_AWS-CodePipeline-1111222233334 のような形式の名前が付いています。

  4. [Policy Document] ボックスに必要なアクセス許可を追加します。たとえば、CodeCommit がサポートされるように、以下をポリシーステートメントに追加します。

    { "Action": [ "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:UploadArchive", "codecommit:GetUploadArchiveStatus", "codecommit:CancelUploadArchive" ], "Resource": "*", "Effect": "Allow" },

    AWS OpsWorks がサポートされるように、以下をポリシーステートメントに追加します。

    { "Action": [ "opsworks:CreateDeployment", "opsworks:DescribeApps", "opsworks:DescribeCommands", "opsworks:DescribeDeployments", "opsworks:DescribeInstances", "opsworks:DescribeStacks", "opsworks:UpdateApp", "opsworks:UpdateStack" ], "Resource": "*", "Effect": "Allow" },

    AWS CloudFormation がサポートされるように、以下をポリシーステートメントに追加します。

    { "Action": [ "cloudformation:CreateStack", "cloudformation:DeleteStack", "cloudformation:DescribeStacks", "cloudformation:UpdateStack", "cloudformation:CreateChangeSet", "cloudformation:DeleteChangeSet", "cloudformation:DescribeChangeSet", "cloudformation:ExecuteChangeSet", "cloudformation:SetStackPolicy", "cloudformation:ValidateTemplate", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" },

    AWS CodeBuild がサポートされるように、以下をポリシーステートメントに追加します。

    { "Action": [ "codebuild:BatchGetBuilds", "codebuild:StartBuild" ], "Resource": "*", "Effect": "Allow" },

    AWS Device Farm がサポートされるように、以下をポリシーステートメントに追加します。

    { "Action": [ "devicefarm:ListProjects", "devicefarm:ListDevicePools", "devicefarm:GetRun", "devicefarm:GetUpload", "devicefarm:CreateUpload", "devicefarm:ScheduleRun" ], "Resource": "*", "Effect": "Allow" },

    AWS Service Catalog がサポートされるように、以下をポリシーステートメントに追加します。

    { "Effect": "Allow", "Action": [ "servicecatalog:ListProvisioningArtifacts", "servicecatalog:CreateProvisioningArtifact", "servicecatalog:DescribeProvisioningArtifact", "servicecatalog:DeleteProvisioningArtifact", "servicecatalog:UpdateProduct" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cloudformation:ValidateTemplate" ], "Resource": "*" }
  5. Amazon ECR がサポートされるように、以下をポリシーステートメントに追加します。

    { "Action": [ "ecr:DescribeImages" ], "Resource": "*", "Effect": "Allow" },
  6. Amazon ECS では、Amazon ECS デプロイアクションを使用してパイプラインを作成するために必要な最小限のアクセス許可は次のとおりです。

    { "Action": [ "ecs:DescribeServices", "ecs:DescribeTaskDefinition", "ecs:DescribeTasks", "ecs:ListTasks", "ecs:RegisterTaskDefinition", "ecs:UpdateService" ], "Resource": "*", "Effect": "Allow" },

    注記

    IAM ポリシーを作成するとき、最小限の特権を認めるという標準的なセキュリティアドバイスに従いましょう。そうすれば、タスクを実行するというリクエストのアクセス許可のみを認めることができます。特定の API 呼び出しはリソースベースのアクセス権限をサポートし、アクセスを制限することを許可します。たとえば、この場合、DescribeTasks および ListTasks を呼び出すときにアクセス権限を制限するために、ワイルドカード文字 (*) を特定のリソース ARN またはリソース ARN 内のワイルドカード文字 (*) に置き換えることができます。

  7. ポリシーの検証 を選択して、ポリシーにエラーがないことを確認します。ポリシーにエラーがなければ、ポリシーの適用 を選択します。

未使用の AWS サービスのアクセス許可の削除

サービスロールのステートメントを編集して、使用していないリソースへのアクセスを削除します。たとえば、いずれのパイプラインにも Elastic Beanstalk が含まれていない場合は、ポリシーステートメントを編集して Elastic Beanstalk リソースのアクセス許可を付与するセクションを削除します。たとえば、次のセクションをポリシーステートメントから削除することができます。

{ "Action": [ "elasticbeanstalk:*", "ec2:*", "elasticloadbalancing:*", "autoscaling:*", "cloudwatch:*", "s3:*", "sns:*", "cloudformation:*", "rds:*", "sqs:*", "ecs:*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" },

同様に、いずれのパイプラインにも CodeDeploy が含まれていない場合は、ポリシーステートメントを編集して CodeDeploy リソースのアクセス許可を付与するセクションを削除できます。

{ "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "*", "Effect": "Allow" },

IAM ロールの詳細については、「IAM ロール」を参照してください。