管理 Elastic Beanstalk 服务角色 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

管理 Elastic Beanstalk 服务角色

为了管理和监控您的环境,Amazon Elastic Beanstalk 代表您对环境资源执行操作。Elastic Beanstalk 需要特定的权限才能执行这些操作,它通过代入 Amazon Identity and Access Management(IAM)服务角色来获得这些权限。

Elastic Beanstalk 在其代入服务角色时需要使用临时安全凭证。要获取这些凭证,Elastic Beanstalk 会将请求发送到一个特定于区域的端点上的 Amazon Security Token Service(Amazon STS)。有关更多信息,请参阅《IAM 用户指南》中的临时安全凭证

注意

如果您的环境所在的区域的 Amazon STS 端点已停用,Elastic Beanstalk 会将请求发送到无法停用的替代端点上。此端点与不同的区域关联。因此,该请求是跨区域请求。有关更多信息,请参阅《IAM 用户指南》中的在 Amazon 区域中激活和停用 Amazon 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 及其他下游服务,例如 Amazon 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.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 控制台中查看和使用较早的策略。

要查看托管式策略的内容,请参阅《Amazon 托管式策略参考指南》中的 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 预定义的独特类型的服务角色,它具有服务代表您调用其他 Amazon 服务所需的所有权限。服务相关角色与您的账户关联。Elastic Beanstalk 将创建一次,然后在创建其他环境时重用。有关将服务相关角色与 Elastic Beanstalk 环境结合使用的详细信息,请参阅将服务相关角色用于 Elastic Beanstalk

如果您使用 Elastic Beanstalk API 创建环境并且未指定服务角色,Elastic Beanstalk 将为您的账户创建监控服务相关角色(如果尚不存在该角色)。Elastic Beanstalk 将此角色用于新环境。您也可以使用 IAM 提前为账户创建监控服务相关角色。在您的账户拥有此角色后,您可以通过 Elastic Beanstalk API、Elastic Beanstalk 控制台或 EB CLI 使用该角色创建环境。

如果您为环境启用托管式平台更新并指定 AWSServiceRoleForElasticBeanstalkManagedUpdates 作为 aws: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. 要查看策略授予的权限,请选择相应的策略。

更新过期的默认服务角色

如果默认服务角色缺少必需的权限,您可以通过在 Elastic Beanstalk 环境管理控制台中创建新环境来更新它。

或者,您可以手动向默认服务角色添加托管式策略。

向默认服务角色添加托管式策略
  1. 在 IAM 控制台中,打开 Roles(角色)页面

  2. 选择 aws-elasticbeanstalk-service-role

  3. Permissions(权限)选项卡上,选择 Attach policies(附加策略)。

  4. 输入 AWSElasticBeanstalk 以筛选策略。

  5. 选择下列策略,然后选择 Attach policy(附加策略):

    • AWSElasticBeanstalkEnhancedHealth

    • AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy

向默认服务角色添加权限

如果您的应用程序包含引用 Amazon 资源(默认服务角色不包含该资源的权限)的配置文件,则 Elastic Beanstalk 可能需要附加权限。在托管更新期间处理配置文件时,需要这些附加权限才能解析这些引用。如果缺少权限,则更新将失败,并且 Elastic Beanstalk 将返回一条消息来指明所需的权限。按照这些步骤,在 IAM 控制台中将附加服务的权限添加到默认服务角色。

向默认服务角色添加附加策略
  1. 在 IAM 控制台中,打开 Roles(角色)页面

  2. 选择 aws-elasticbeanstalk-service-role

  3. Permissions(权限)选项卡上,选择 Attach policies(附加策略)。

  4. 选择适用于应用程序使用的附加服务的托管策略。例如,AmazonAPIGatewayAdministratorAmazonElasticFileSystemFullAccess

  5. 选择 Attach policy(附加策略)。

创建服务角色

如果您无法使用默认服务角色,请创建一个服务角色。

创建服务角色
  1. 在 IAM 控制台中,打开 Roles(角色)页面

  2. 选择 Create role(创建角色)。

  3. Amazon service(亚马逊云科技服务)下,选择 Amazon Elastic Beanstalk,然后选择您的使用案例。

  4. 选择Next: Permissions(下一步: 权限)

  5. 附加 AWSElasticBeanstalkManagedUpdatesCustomerRolePolicyAWSElasticBeanstalkEnhancedHealth 托管式策略以及提供应用程序所需权限的任何其他策略。

  6. 选择 Next: Tags(下一步: 标签)。

  7. (可选)将标签添加到角色。

  8. 选择 Next: Review(下一步: 审核)。

  9. 输入角色的名称。

  10. 选择 Create role(创建角色)。

在使用环境创建向导或通过 eb create 命令中的 --service-role 选项创建环境时应用您的自定义服务角色。