管理 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 使用者指南》中的臨時安全登入資料

注意

如果您的環境所在區域的 AWS STS 端點已停用,Elastic Beanstalk 會在無法停用的替代端點上傳送請求。此端點與其他區域相關聯。因此,該請求是跨區域請求。如需詳細資訊,請參閱《IAM 使用者指南》中的在 AWS 區域內啟用和停用 AWS STS

使用 Elastic Beanstalk 主控台和 EB CLI 管理服務角色

透過一組足夠的許可,您可以使用 Elastic Beanstalk 主控台和 EB CLI,為您的環境設定服務角色。它們會建立預設服務角色並在其中使用受管政策。

受管服務角色政策

Elastic Beanstalk 提供了一個用於增強型運作狀態監控的受管政策,以及另一個具備受管平台更新所需額外許可的受管政策。主控台和 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 – 具有此命名模式的群組用於呼叫必要的操作來執行平台更新。它們也包含支援舊式環境的廣泛許可。

  • *TagResource – 具有此命名模式的群組適用於使用建立時標記 API 的呼叫,以在 Elastic Beanstalk 環境中建立的資源上附加標籤。

{ "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:CreateOrUpdateTags", "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:AddTags", "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-*" ] }, { "Sid": "AllowECSTagResource", "Effect": "Allow", "Action": [ "ecs:TagResource" ], "Resource": "*", "Condition": { "StringEquals": { "ecs:CreateAction": [ "CreateCluster", "RegisterTaskDefinition" ] } } } ] }

若要檢視受管政策的內容,您也可以使用 IAM 主控台中的 Policies (政策) 頁面

注意

在過去,Elastic Beanstalk 支援 AWSElasticBeanstalkService 受管服務角色政策。此政策已由 AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy 取代。您可能仍然可以在 IAM 主控台中查看和使用先前的政策。

若要檢視受管政策內容,請參閱《AWS 受管政策參考指南》中的 AWSElasticBeanstalkService

但是,我們建議您轉換為使用新的受管政策 (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 服務不一定能夠成功為您建立此服務連結角色。因此,主控台會嘗試明確地建立。為確保您的帳戶具有此服務連結角色,請至少在使用主控台後建立環境,然後將受管更新設定為在建立環境前啟用。

使用 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 動作建立環境時,請使用 aws:elasticbeanstalk:environment 命名空間中的 ServiceRole 組態選項來指定服務角色。如需有關搭配 Elastic Beanstalk API 使用增強型運作狀態監視的詳細資訊,請參閱將增強型運作狀態報告與 Elastic Beanstalk API 搭配使用

此外,如果您為環境啟用受管平台更新,您可以使用 aws:elasticbeanstalk:managedactions 命名空間的 ServiceRoleForManagedUpdates 選項指定受管更新服務角色。

使用服務連結角色

服務連結角色是獨特的服務角色類型,由 Elastic Beanstalk 預先定義以納入所有該服務代表您呼叫其他 AWS 服務所需的許可。服務連結角色會您的帳戶建立關聯。Elastic Beanstalk 只會建立一次此角色,然後在建立其他環境時重複使用。如需透過 Elastic Beanstalk 環境使用服務連結角色的詳細資訊,請參閱使用 Elastic Beanstalk 的服務連結角色

如果您使用 Elastic Beanstalk API 建立環境,且未指定服務角色,Elastic Beanstalk 會為您的帳戶建立監控服務連結角色 (如果該角色不存在)。Elastic Beanstalk 會將此角色用於新的環境。您也可以使用 IAM,預先建立您帳戶的監控服務連結角色。在您的帳戶擁有此角色之後,您可以使用它來建立使用 Elastic Beanstalk API、Elastic Beanstalk 主控台或 EB CLI 的環境。

如果您啟用環境的受管平台更新,並指定 AWSServiceRoleForElasticBeanstalkManagedUpdatesaws:elasticbeanstalk:managedactions 命名空間 ServiceRoleForManagedUpdates 選項的值,Elastic Beanstalk 會為您的帳戶建立受管更新服務連結角色 (如果該角色不存在)。Elastic Beanstalk 使用此角色為新環境執行受管更新。

注意

當您建立環境時,若 Elastic Beanstalk 嘗試為您的帳戶建立監控和受管更新服務連結角色,您必須擁有 iam:CreateServiceLinkedRole 許可。如果您沒有此許可,環境建立會失敗,並顯示一則說明問題的訊息。

或者,具有建立服務連結角色許可的另一個使用者可用 IAM 預先建立服務連結角色。使用此方法,您不需要 iam:CreateServiceLinkedRole 許可即可建立環境。

驗證預設服務角色許可

由您的預設服務角色所授予的許可,可能會基於角色建立的時間、上次啟動環境的時間和使用的用戶端,而有所不同。在 IAM 主控台中,您可以驗證預設服務角色所授予的許可。

若要驗證預設服務角色的許可
  1. 在 IAM 主控台中,開啟 Roles (角色) 頁面

  2. 選擇 aws-elasticbeanstalk-service-role (aws-elasticbeanstalk-service-role)

  3. Permissions (許可) 索引標籤中,請檢閱角色連接的政策清單。

  4. 若要檢視政策所授予的許可,請選擇政策。

更新過時的預設服務角色

如果預設的服務角色缺少所需的許可,您可以藉由在 Elastic Beanstalk 環境的管理主控台中建立新環境,來更新該角色的許可。

或者,您可以透過手動方式,將受管政策新增至預設的服務角色。

若要受管政策新增到預設的服務角色
  1. 在 IAM 主控台中,開啟 Roles (角色) 頁面

  2. 選擇 aws-elasticbeanstalk-service-role (aws-elasticbeanstalk-service-role)

  3. Permissions (許可) 標籤上,選擇 Attach policies (連接政策)。

  4. 輸入 AWSElasticBeanstalk 來篩選政策。

  5. 選擇下列的政策,然後選擇 Attach policy (連接政策):

    • AWSElasticBeanstalkEnhancedHealth

    • AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy

新增預設服務角色的許可

如果您的應用程式包含引用 AWS 資源的組態檔案,而這些資源的許可未包含在預設服務角色中,則 Elastic Beanstalk 可能需要額外的許可。當它在受管更新期間處理組態檔案時,需要這些額外的許可來解析這些引用。如果缺少許可,則更新會失敗,而且 Elastic Beanstalk 會傳回訊息,指示所需的許可。請依照下列步驟將其他服務的許可新增至 IAM 主控台中的預設服務角色。

若要針對預設服務角色新增額外的政策
  1. 在 IAM 主控台中,開啟 Roles (角色) 頁面

  2. 選擇 aws-elasticbeanstalk-service-role (aws-elasticbeanstalk-service-role)

  3. Permissions (許可) 標籤上,選擇 Attach policies (連接政策)。

  4. 為您的應用程式使用的其他服務,選取受管原則,例如 AmazonAPIGatewayAdministratorAmazonElasticFileSystemFullAccess

  5. 選擇 Attach policy (連接政策)。

建立服務角色

如果您無法使用預設服務角色,請建立服務角色。

若要建立服務角色
  1. 在 IAM 主控台中,開啟 Roles (角色) 頁面

  2. 選擇 建立角色

  3. AWS service (AWS 服務) 之下選擇 AWS Elastic Beanstalk,然後選取您的使用案例。

  4. 選擇 Next: Permissions (下一步:許可)。

  5. 連接 AWSElasticBeanstalkManagedUpdatesCustomerRolePolicyAWSElasticBeanstalkEnhancedHealth 受管政策,以及提供您應用程式所需許可的其他任何政策。

  6. 選擇 下一步:標籤

  7. (選用) 附加標籤至角色。

  8. 選擇 下一步:檢閱

  9. 輸入角色的名稱。

  10. 選擇 建立角色

當您利用環境建立精靈eb create 指令中的 --service-role 選項來建立環境時,請套用自訂的服務角色。