本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
管理 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
– 采用这种命名模式的组适用于使用 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 命令选项时您不能指定托管更新服务角色。如果您为环境启用了托管更新,您必须通过配置选项设置托管更新服务角色。以下示例启用托管更新并使用默认服务角色作为托管更新服务角色。
例 .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 使用该角色创建环境。
如果您为环境启用托管式平台更新并指定 AWSServiceRoleForElasticBeanstalkManagedUpdates
作为 aws:elasticbeanstalk:managedactions
命名空间 ServiceRoleForManagedUpdates
选项的值,则 Elastic Beanstalk 会为您的账户创建托管式更新服务相关角色(如果该角色尚不存在)。Elastic Beanstalk 使用该角色为新环境执行托管式更新。
注意
在您创建环境时,如果 Elastic Beanstalk 尝试为您的账户创建监控和托管更新服务相关角色,您必须具有 iam:CreateServiceLinkedRole
权限。如果您没有此权限,环境创建将失败,并显示说明问题的消息。
作为替代方案,也可以让具有创建服务相关角色权限的另一用户使用 IAM 事先创建服务相关角色。使用此方法,您不需要 iam:CreateServiceLinkedRole
权限即可创建环境。
验证默认服务角色权限
您的默认服务角色授予的权限不固定,具体取决于其创建时间、您上次启动环境的时间以及您使用的客户端。在 IAM 控制台中,您可以验证由默认服务角色授予的权限。
验证默认服务角色的权限
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择 aws-elasticbeanstalk-service-role。
-
在 Permissions(权限)选项卡中,审核附加到角色的策略列表。
-
要查看策略授予的权限,请选择相应的策略。
更新过期的默认服务角色
如果默认服务角色缺少必需的权限,您可以通过在 Elastic Beanstalk 环境管理控制台中创建新环境来更新它。
或者,您可以手动向默认服务角色添加托管式策略。
向默认服务角色添加托管式策略
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择 aws-elasticbeanstalk-service-role。
-
在 Permissions(权限)选项卡上,选择 Attach policies(附加策略)。
-
输入
AWSElasticBeanstalk
以筛选策略。 -
选择下列策略,然后选择 Attach policy(附加策略):
-
AWSElasticBeanstalkEnhancedHealth
-
AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy
-
向默认服务角色添加权限
如果您的应用程序包含引用 AWS 资源(默认服务角色不包含该资源的权限)的配置文件,则 Elastic Beanstalk 可能需要附加权限。在托管更新期间处理配置文件时,需要这些附加权限才能解析这些引用。如果缺少权限,则更新将失败,并且 Elastic Beanstalk 将返回一条消息来指明所需的权限。按照这些步骤,在 IAM 控制台中将附加服务的权限添加到默认服务角色。
向默认服务角色添加附加策略
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择 aws-elasticbeanstalk-service-role。
-
在 Permissions(权限)选项卡上,选择 Attach policies(附加策略)。
-
选择适用于应用程序使用的附加服务的托管策略。例如,
AmazonAPIGatewayAdministrator
或AmazonElasticFileSystemFullAccess
。 -
选择 Attach policy(附加策略)。
创建服务角色
如果您无法使用默认服务角色,请创建一个服务角色。
创建服务角色
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择 Create role(创建角色)。
-
在 AWS service(亚马逊云科技服务)下,选择 AWS Elastic Beanstalk,然后选择您的使用案例。
-
选择下一步: 权限。
-
附加
AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy
和AWSElasticBeanstalkEnhancedHealth
托管式策略以及提供应用程序所需权限的任何其他策略。 -
选择 Next: Tags(下一步: 标签)。
-
(可选)将标签添加到角色。
-
选择 Next: Review(下一步: 审核)。
-
输入角色的名称。
-
选择 Create role(创建角色)。
在使用环境创建向导或通过 eb create
命令中的 --service-role
选项创建环境时应用您的自定义服务角色。