管理 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 STS 中的在 AWS 區域中啟用和停用

使用 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— 具有此命名模式的群組適用於使用 tag-on-create 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.rproxy.goskope.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 受管政策不提供精細許可,其會授予使用 Elastic Beanstalk 應用程式可能需要的所有許可。在某些情況下,您可能希望進一步限制我們託管策略的權限。如需一個使用案例的範例,請參閱防止跨環境 Amazon S3 儲存貯體存取

此外,我們的受管政策也不涵蓋您可能新增至解決方案,並且不由 Elastic Beanstalk 管理的自訂資源許可。若要實作更精細的許可、最低必要許可或自訂資源許可,請使用自訂政策

已廢除的 受管政策

在過去,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 命令選項指定受管更新服務角色。如果您為環境啟用受管更新,您必須透過組態選項設定受管更新服務角色。下列範例會啟用受管更新,並使用預設服務角色以做為受管更新服務角色。

範例 .ebextension/. managed-platform-update 配置
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

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

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

更新 out-of-date 預設服務角色

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

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

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

  2. 選擇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

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

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

  5. 選擇連接政策

建立服務角色

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

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

  2. 選擇建立角色

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

  4. 選擇下一步:許可

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

  6. 選擇下一步:標籤

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

  8. 選擇下一步:檢閱

  9. 輸入角色的名稱。

  10. 選擇建立角色

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