Elastic Beanstalk サービスロールの管理 - AWS Elastic Beanstalk

Elastic Beanstalk サービスロールの管理

AWS Elastic Beanstalk は、環境を管理およびモニタリングするためのアクションを、環境のリソースに対しユーザーに代わって実行します。Elastic Beanstalk は、これらのアクションを実行する特定のアクセス許可を必要とし、これらのアクセス許可を取得するために AWS Identity and Access Management (IAM) サービスロールを引き受けます。

Elastic Beanstalk は、サービスロールを引き受けるときはいつでも一時的セキュリティ認証情報を使用する必要があります。これらの認証情報を取得するために、Elastic Beanstalk により、リージョン固有エンドポイントの AWS Security Token Service (AWS STS) にリクエストが送信されます。詳細については、IAM ユーザーガイドの「IAM の一時的なセキュリティ認証情報」を参照してください。

注記

環境が配置されたリージョンの AWS STS エンドポイントが非アクティブ化されている場合、Elastic Beanstalk は、非アクティブ化できない代替エンドポイントを使用してリクエストを送信します。このエンドポイントは別のリージョンに関連付けられています。つまり、このリクエストはクロスリージョンのリクエストとなります。詳細については、IAM ユーザーガイドの「AWS リージョンでの AWS STS のアクティブ化と非アクティブ化」を参照してください。

Elastic Beanstalk コンソールと EB CLI を使用したサービスロールの管理

Elastic Beanstalk コンソールと EB CLI を使用すると、十分なアクセス許可セットを含むサービスロールを環境に設定できます。デフォルトのサービスロールが作成され、その中の管理ポリシーが使用されます。

マネージドサービスロールのポリシー

Elastic Beanstalk により、拡張ヘルスモニタリング用の管理ポリシーが 1 つ、またマネージドプラットフォーム更新用の (必要な他のアクセス許可を含む) 管理ポリシーが 1 つ、それぞれ指定されます。コンソールと EB CLI は、デフォルトのサービスロールを作成する際に、これらのポリシーの両方を割り当てます。これらのポリシーは、このデフォルトのサービスロールでのみ使用するものです。アカウント内の他のユーザーまたはロールでは使用しないでください。

このポリシーでは、インスタンスおよび環境のヘルスをモニタリングするアクセス許可を Elastic Beanstalk に付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticloadbalancing:DescribeInstanceHealth", "elasticloadbalancing:DescribeLoadBalancers", "elasticloadbalancing:DescribeTargetHealth", "ec2:DescribeInstances", "ec2:DescribeInstanceStatus", "ec2:GetConsoleOutput", "ec2:AssociateAddress", "ec2:DescribeAddresses", "ec2:DescribeSecurityGroups", "sqs:GetQueueAttributes", "sqs:GetQueueUrl", "autoscaling:DescribeAutoScalingGroups", "autoscaling:DescribeAutoScalingInstances", "autoscaling:DescribeScalingActivities", "autoscaling:DescribeNotificationConfigurations", "sns:Publish" ], "Resource": [ "*" ] } ] }

このポリシーでは、お客様に代わって環境を更新してマネージドプラットフォームを更新するアクセス許可を Elastic Beanstalk に付与します。

サービスレベルでのアクセス許可のグループ化

このポリシーは、提供された一連のアクセス許可に基づくステートメントごとにグループ化されます。

  • ElasticBeanstalkPermissions – このアクセス許可グループは、Elastic Beanstalk サービスアクション (Elastic Beanstalk API) を呼び出す際に使用します。

  • AllowPassRoleToElasticBeanstalkAndDownstreamServices – このアクセス許可グループにより、Elastic Beanstalk や AWS CloudFormation などのダウンストリームサービスに対し、任意のロールを渡すことが可能になります。

  • ReadOnlyPermissions – このアクセス許可グループは、実行中の環境に関する情報を収集するため使用します。

  • *OperationPermissions – この命名パターンを持つグループは、プラットフォームの更新を実行するために必要なオペレーションを呼び出すためのものです。

  • *BroadOperationPermissions – この命名パターンを持つグループは、プラットフォームの更新を実行するために必要なオペレーションを呼び出すためのものです。またこれには、レガシー環境をサポートするための広範なアクセス許可も含まれています。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ElasticBeanstalkPermissions", "Effect": "Allow", "Action": [ "elasticbeanstalk:*" ], "Resource": "*" }, { "Sid": "AllowPassRoleToElasticBeanstalkAndDownstreamServices", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::*:role/*", "Condition": { "StringEquals": { "iam:PassedToService": [ "elasticbeanstalk.amazonaws.com", "ec2.amazonaws.com", "ec2.amazonaws.com.cn", "autoscaling.amazonaws.com", "elasticloadbalancing.amazonaws.com", "ecs.amazonaws.com", "cloudformation.amazonaws.com" ] } } }, { "Sid": "ReadOnlyPermissions", "Effect": "Allow", "Action": [ "autoscaling:DescribeAccountLimits", "autoscaling:DescribeAutoScalingGroups", "autoscaling:DescribeAutoScalingInstances", "autoscaling:DescribeLaunchConfigurations", "autoscaling:DescribeLoadBalancers", "autoscaling:DescribeNotificationConfigurations", "autoscaling:DescribeScalingActivities", "autoscaling:DescribeScheduledActions", "ec2:DescribeAccountAttributes", "ec2:DescribeAddresses", "ec2:DescribeAvailabilityZones", "ec2:DescribeImages", "ec2:DescribeInstanceAttribute", "ec2:DescribeInstances", "ec2:DescribeKeyPairs", "ec2:DescribeLaunchTemplates", "ec2:DescribeLaunchTemplateVersions", "ec2:DescribeSecurityGroups", "ec2:DescribeSnapshots", "ec2:DescribeSpotInstanceRequests", "ec2:DescribeSubnets", "ec2:DescribeVpcClassicLink", "ec2:DescribeVpcs", "elasticloadbalancing:DescribeInstanceHealth", "elasticloadbalancing:DescribeLoadBalancers", "elasticloadbalancing:DescribeTargetGroups", "elasticloadbalancing:DescribeTargetHealth", "logs:DescribeLogGroups", "rds:DescribeDBEngineVersions", "rds:DescribeDBInstances", "rds:DescribeOrderableDBInstanceOptions", "sns:ListSubscriptionsByTopic" ], "Resource": [ "*" ] }, { "Sid": "EC2BroadOperationPermissions", "Effect": "Allow", "Action": [ "ec2:AllocateAddress", "ec2:AssociateAddress", "ec2:AuthorizeSecurityGroupEgress", "ec2:AuthorizeSecurityGroupIngress", "ec2:CreateLaunchTemplate", "ec2:CreateLaunchTemplateVersion", "ec2:CreateSecurityGroup", "ec2:DeleteLaunchTemplate", "ec2:DeleteLaunchTemplateVersions", "ec2:DeleteSecurityGroup", "ec2:DisassociateAddress", "ec2:ReleaseAddress", "ec2:RevokeSecurityGroupEgress", "ec2:RevokeSecurityGroupIngress" ], "Resource": "*" }, { "Sid": "EC2RunInstancesOperationPermissions", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*" } } }, { "Sid": "EC2TerminateInstancesOperationPermissions", "Effect": "Allow", "Action": [ "ec2:TerminateInstances" ], "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringLike": { "ec2:ResourceTag/aws:cloudformation:stack-id": [ "arn:aws:cloudformation:*:*:stack/awseb-e-*", "arn:aws:cloudformation:*:*:stack/eb-*" ] } } }, { "Sid": "ECSBroadOperationPermissions", "Effect": "Allow", "Action": [ "ecs:CreateCluster", "ecs:DescribeClusters", "ecs:RegisterTaskDefinition" ], "Resource": "*" }, { "Sid": "ECSDeleteClusterOperationPermissions", "Effect": "Allow", "Action": "ecs:DeleteCluster", "Resource": "arn:aws:ecs:*:*:cluster/awseb-*" }, { "Sid": "ASGOperationPermissions", "Effect": "Allow", "Action": [ "autoscaling:AttachInstances", "autoscaling:CreateAutoScalingGroup", "autoscaling:CreateLaunchConfiguration", "autoscaling:DeleteLaunchConfiguration", "autoscaling:DeleteAutoScalingGroup", "autoscaling:DeleteScheduledAction", "autoscaling:DetachInstances", "autoscaling:DeletePolicy", "autoscaling:PutScalingPolicy", "autoscaling:PutScheduledUpdateGroupAction", "autoscaling:PutNotificationConfiguration", "autoscaling:ResumeProcesses", "autoscaling:SetDesiredCapacity", "autoscaling:SuspendProcesses", "autoscaling:TerminateInstanceInAutoScalingGroup", "autoscaling:UpdateAutoScalingGroup" ], "Resource": [ "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/awseb-e-*", "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/eb-*", "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/awseb-e-*", "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/eb-*" ] }, { "Sid": "CFNOperationPermissions", "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": [ "arn:aws:cloudformation:*:*:stack/awseb-*", "arn:aws:cloudformation:*:*:stack/eb-*" ] }, { "Sid": "ELBOperationPermissions", "Effect": "Allow", "Action": [ "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer", "elasticloadbalancing:ConfigureHealthCheck", "elasticloadbalancing:CreateLoadBalancer", "elasticloadbalancing:DeleteLoadBalancer", "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", "elasticloadbalancing:DeregisterTargets", "elasticloadbalancing:RegisterInstancesWithLoadBalancer", "elasticloadbalancing:RegisterTargets" ], "Resource": [ "arn:aws:elasticloadbalancing:*:*:targetgroup/awseb-*", "arn:aws:elasticloadbalancing:*:*:targetgroup/eb-*", "arn:aws:elasticloadbalancing:*:*:loadbalancer/awseb-*", "arn:aws:elasticloadbalancing:*:*:loadbalancer/eb-*", "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/awseb-*/*", "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/eb-*/*" ] }, { "Sid": "CWLogsOperationPermissions", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:DeleteLogGroup", "logs:PutRetentionPolicy" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*" }, { "Sid": "S3ObjectOperationPermissions", "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectVersionAcl" ], "Resource": "arn:aws:s3:::elasticbeanstalk-*/*" }, { "Sid": "S3BucketOperationPermissions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetBucketPolicy", "s3:ListBucket", "s3:PutBucketPolicy" ], "Resource": "arn:aws:s3:::elasticbeanstalk-*" }, { "Sid": "SNSOperationPermissions", "Effect": "Allow", "Action": [ "sns:CreateTopic", "sns:GetTopicAttributes", "sns:SetTopicAttributes", "sns:Subscribe" ], "Resource": "arn:aws:sns:*:*:ElasticBeanstalkNotifications-*" }, { "Sid": "SQSOperationPermissions", "Effect": "Allow", "Action": [ "sqs:GetQueueAttributes", "sqs:GetQueueUrl" ], "Resource": [ "arn:aws:sqs:*:*:awseb-e-*", "arn:aws:sqs:*:*:eb-*" ] }, { "Sid": "CWPutMetricAlarmOperationPermissions", "Effect": "Allow", "Action": [ "cloudwatch:PutMetricAlarm" ], "Resource": [ "arn:aws:cloudwatch:*:*:alarm:awseb-*", "arn:aws:cloudwatch:*:*:alarm:eb-*" ] } ] }

管理ポリシーの内容は、IAM コンソールの [ポリシー] ページでも表示することができます。

注記

これまで Elastic Beanstalk では、AWSElasticBeanstalkService マネージドサービスロールポリシーをサポートしていました。現在このポリシーは、AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy に置き換えられています。以前のポリシーは、IAM コンソールから表示および使用できる場合があります。ただし、新しい管理ポリシー (AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy) の使用を選択されることをお勧めします。カスタムリソースをご使用の場合は、カスタムポリシーを追加して、そのリソースにアクセス許可を付与します。

Elastic Beanstalk コンソールを開きます。

Elastic Beanstalk コンソールで環境を起動すると、aws-elasticbeanstalk-service-role という名前のデフォルトのサービスロールが作成され、デフォルトのアクセス許可を含む管理ポリシーが、そのサービスロールにアタッチされます。

Elastic Beanstalk が aws-elasticbeanstalk-service-role ロールを引き受けることができるようにするために、サービスロールは Elastic Beanstalk を信頼関係ポリシーの信頼されたエンティティとして指定します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "elasticbeanstalk.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "elasticbeanstalk" } } } ] }

環境に対してマネージドプラットフォーム更新を有効にすると、Elastic Beanstalk は、マネージド更新を実行するための個別のマネージド更新サービスロールを引き受けます。Elastic Beanstalk コンソールのデフォルトでは、このマネージド更新サービスロールにも、生成された同じサービスロール (aws-elasticbeanstalk-service-role) が使用されます。デフォルトのサービスロールを変更すると、マネージド更新サービスにリンクされたロール (AWSServiceRoleForElasticBeanstalkManagedUpdates) を使用するように、コンソールによってマネージド更新サービスロールが設定されます。サービスにリンクされたロールの詳細については、「サービスにリンクされたロールの使用」を参照してください。

注記

アクセス許可の状態によっては、Elastic Beanstalk サービスが、サービスにリンクされたロールの作成に必ず成功するとは限りません。このため、明示的な作成がコンソールで試行されます。サービスにリンクされたロールがアカウントに確実に付与されるようにするには、コンソールを使用して 1 回以上は環境を作成します。環境を作成する前に、マネージド更新が有効になるように設定する必要があります。

EB CLI の使用

Elastic Beanstalk コマンドラインインターフェイス (EB CLI) の eb create コマンドを使用して環境を起動する際に、--service-role オプションでサービスロールを指定しない場合は、Elastic Beanstalk によってデフォルトのサービスロール (aws-elasticbeanstalk-service-role) が作成されます。デフォルトのサービスロールが既に存在する場合、Elastic Beanstalk はそのサービスロールを新しい環境で使用します。また、Elastic Beanstalk コンソールでも、このような状況に対し同様のアクションが実行されます。

ただし、EB CLI コマンドオプションを使用する場合には、コンソールとは異なりマネージド更新サービスロールを指定することはできません。環境のマネージド更新を有効にする場合は、設定オプションを使用してマネージド更新サービスロールを設定する必要があります。次の例では、マネージド更新を有効にし、デフォルトのサービスロールをマネージド更新サービスロールとして使用しています。

例 .ebextensions/managed-platform-update.config

option_settings: aws:elasticbeanstalk:managedactions: ManagedActionsEnabled: true PreferredStartTime: "Tue:09:00" ServiceRoleForManagedUpdates: "aws-elasticbeanstalk-service-role" aws:elasticbeanstalk:managedactions:platformupdate: UpdateLevel: patch InstanceRefreshEnabled: true

Elastic Beanstalk API を使用したサービスロールの管理

Elastic Beanstalk API の CreateEnvironment アクションを使用して環境を作成する場合は、ServiceRole 名前空間の aws:elasticbeanstalk:environment 設定オプションを使用して、サービスロールを指定します。Elastic Beanstalk API を使用しての拡張ヘルスモニタリングの詳細については、「Elastic Beanstalk API での拡張ヘルスレポートの使用」を参照してください。

さらに、環境に対してマネージドプラットフォーム更新を有効にする場合は、ServiceRoleForManagedUpdates 名前空間の aws:elasticbeanstalk:managedactions オプションを使用してマネージド更新サービスロールを指定できます。

サービスにリンクされたロールの使用

サービスにリンクされたロールは、Elastic Beanstalk によって事前定義された一意のタイプのサービスロールであり、サービスが自動的に他の AWS のサービスを呼び出すために必要な、すべてのアクセス許可が含まれています。このサービスにリンクされたロールはお客様のアカウントに関連付けられています。Elastic Beanstalk によって一度作成されたロールは、追加の環境を作成するときにも使用されます。Elastic Beanstalk 環境でのサービスにリンクされたロールの使用の詳細については、「Elastic Beanstalk でのサービスにリンクされたロールの使用」を参照してください。

Elastic Beanstalk API を使用して環境を作成する際にサービスロールを指定しない場合は、(それが存在しない場合には) モニタリングサービスにリンクされたロールが、Elastic Beanstalk によりアカウントに作成されます。Elastic Beanstalk は、作成された環境でこのロールを使用します。IAM を使用して、モニタリングサービスにリンクされたロールを、アカウント用として事前に作成することもできます。アカウントでこのロールの取得が完了したら、そのロールにより Elastic Beanstalk API、Elastic Beanstalk コンソール、または EB CLI を使用しての環境の作成が可能になります。

環境に対してマネージドプラットフォーム更新を有効にし、名前空間 aws:elasticbeanstalk:managedactionsServiceRoleForManagedUpdates オプションの値として AWSServiceRoleForElasticBeanstalkManagedUpdates を指定した場合、(それが存在しない場合には) アカウントのためのマネージド更新サービスにリンクされたロールが、Elastic Beanstalk により作成されます。Elastic Beanstalk は、この作成されたロールを使用して、新しい環境でのマネージド更新を実行します。

注記

環境の作成時に Elastic Beanstalk でモニタリングサービスおよびマネージド更新サービスにリンクされたロールをアカウントに作成する場合は、iam:CreateServiceLinkedRole アクセス許可が必要です。このアクセス許可がない場合、環境の作成は失敗し、問題を報告するメッセージが表示されます。

別の方法として、サービスにリンクされたロールを作成するアクセス許可を持つ別のユーザーが IAM を使用して、サービスにリンクされたロールを事前に作成できます。この方法では、環境を作成するために iam:CreateServiceLinkedRole のアクセス許可は必要ありません。

デフォルトのサービスロールのアクセス許可を確認する

デフォルトのサービスロールに付与されるアクセス許可は、作成日時、最後に環境を起動した日時、使用したクライアントに基づき変化します。デフォルトのサービスロールに付与されるアクセス許可は、IAM コンソールで確認できます。

デフォルトのサービスロールのアクセス権限を確認する

  1. IAM コンソールで [ロール] ページを開きます。

  2. [aws-elasticbeanstalk-service-role] を選択します。

  3. [Permissions (アクセス許可)] タブで、ロールにアタッチされたポリシーのリストを確認します。

  4. ポリシーにより付与されるアクセス権限を表示するには、ポリシーを選択します。

古くなったデフォルトのサービスロールを更新する

必要なアクセス許可がデフォルトのサービスロールに付与されていない場合は、Elastic Beanstalk 環境マネジメントコンソールで新しい環境を作成し、アクセス許可を更新します。

あるいは、デフォルトのサービスロールに管理ポリシーを手動で追加することも可能です。

デフォルトのサービスロールに管理ポリシーを追加する

  1. IAM コンソールで [ロール] ページを開きます。

  2. [aws-elasticbeanstalk-service-role] を選択します。

  3. [Permissions (アクセス許可)] タブで、[Attach policy (ポリシーのアタッチ)] を選択します。

  4. AWSElasticBeanstalk を入力してポリシーをフィルタリングします。

  5. 次のポリシーを指定し、[Attach policy (ポリシーのアタッチ)] を選択します。

    • AWSElasticBeanstalkEnhancedHealth

    • AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy

デフォルトのサービスロールにアクセス許可を付与する

アプリケーションに AWS リソースを参照する設定ファイルが含まれており、そのアクセス許可がデフォルトのサービスロールに含まれていない場合、Elastic Beanstalk に追加のアクセス許可が必要となる場合があります。これらの追加のアクセス許可は、マネージド更新の実行中に構成ファイルを処理する際、必要な参照を解決するために必要です。アクセス許可がない場合には、更新が失敗し、Elastic Beanstalk からは、不足しているアクセス許可を示すメッセージが出力されます。IAM コンソールで次の手順を実行し、新たなサービスのためのアクセス許可を、デフォルトのサービスロールに追加します。

デフォルトのサービスロールにその他のポリシーを追加する

  1. IAM コンソールで [ロール] ページを開きます。

  2. [aws-elasticbeanstalk-service-role] を選択します。

  3. [Permissions (アクセス許可)] タブで、[Attach policy (ポリシーのアタッチ)] を選択します。

  4. アプリケーションで使用する追加サービスの管理ポリシーを選択します。例えば、AmazonAPIGatewayAdministratorAmazonElasticFileSystemFullAccess などです。

  5. [Attach policy] を選択します。

サービスロールの作成

デフォルトのサービスロールを使用できない場合は別途サービスロールを作成します。

サービスロールを作成する

  1. IAM コンソールで [ロール] ページを開きます。

  2. [ロールの作成] を選択します。

  3. [AWS service] (AWS サービス) で、[AWS Elastic Beanstalk] を選択してから、ユースケースを選択します。

  4. [Next: Permissions (次へ: アクセス許可)] を選択します。

  5. AWSElasticBeanstalkManagedUpdatesCustomerRolePolicyAWSElasticBeanstalkEnhancedHealth の管理ポリシー、ならびにアプリケーションで必要なアクセス権限を付与するその他のポリシーがあればそれらもアタッチします。

  6. [次へ: タグ] を選択します。

  7. (オプション) ロールにタグを追加します。

  8. [Next: Review ] (次へ: レビュー) を選択します。

  9. ロールの名前を入力します。

  10. [ロールの作成] を選択します。

環境の作成時に、環境の作成ウィザードを使用するか、--service-role コマンドで eb create オプションを指定することで、カスタムサービスロールを適用します。