View a markdown version of this page

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

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

Beanstalk 集群的权限

Beanstalk 集群环境不使用 Beanstalk Standard 的亚马逊弹性计算云 (Amazon EC2) 实例配置文件。您提供 Amazon EKS 为其集群和节点所需的 IAM 角色,以及 Elastic Beanstalk 用于发布环境指标、日志和跟踪的角色。您可以选择为正在运行的应用程序提供应用程序角色。Elastic Beanstalk 使用服务相关角色来运行自己的环境。

您提供的角色

Beanstalk 集群环境使用集群角色、节点角色和可观察性角色。当您在 Elastic Beanstalk 控制台中创建环境并接受默认服务访问设置时,如果您的账户中尚不存在这些设置,则控制台会为您创建所有三个设置每个角色的名称、可信服务和权限,名称在中:

  • 集群角色 — 亚马逊 EKS 为 Elastic Beanstalk 创建的集群承担此角色。在aws:elasticbeanstalk:eks命名空间的cluster-role设置中传递其 ARN。

  • 节点角色 — 集群的 Amazon EC2 节点担任此角色,这必须允许它们从 Amazon ECR 提取应用程序映像。在aws:elasticbeanstalk:eks命名空间的node-role设置中传递其 ARN。

  • 可观察性角色 — 发布环境指标、日志和跟踪的组件通过 Amazon EKS Pod Identity 承担此角色。在aws:elasticbeanstalk:eks:environment命名空间的observability-role设置中传递其 ARN。

如果您在 Elastic Beanstalk 控制台之外创建这些角色,我们强烈建议您完全按照中的说明创建它们。每个角色的名称、可信服务和权限然后,在创建环境时,将每个角色 ARN 传递到其配置选项中。有关有效的示例,请参阅Beanstalk 集群入门。

如果您为 Elastic Beanstalk 提供构建到容器镜像中的源代码,则还需要提供镜像构建角色。 Amazon CodeBuild 假设它在你的账户中运行构建。此角色属于应用程序版本构建,而不是运行环境。请参阅为 Beanstalk 集群环境构建容器镜像。

您还可以提供可选的应用程序角色,运行中的应用程序使用该角色来调用 Amazon 服务。请参阅应用程序权限。

重要

使用下表中的角色名称。控制台按名称选择现有角色,因此它不会选择您使用其他名称创建的角色,而必须自己选择该角色。名称对于集群重用也很重要:Elastic Beanstalk 在其创建的集群中注册集群、节点和可观测性角色,同一子网集上的后续环境必须提供相同的三个角色。Elastic Beanstalk 拒绝角色不同的环境,而不是将其放置在另一个集群上。请参阅环境分组。

每个角色信任不同的服务并拥有自己的权限:

每个角色的名称、可信服务和权限
角色 角色名称 值得信赖的服务 Amazon 托管策略
集群 角色 aws-elasticbeanstalk-eks-cluster-role eks.amazonaws.com AmazonEKSClusterPolicy, AmazonEKSNetworkingPolicy, AmazonEKSComputePolicy, AmazonEKSBlockStoragePolicy, AmazonEKSLoadBalancingPolicy, AWSElasticBeanstalkEKSTagging
节点角色 aws-elasticbeanstalk-eks-node-role ec2.amazonaws.com AmazonEKSWorkerNodeMinimalPolicy, AmazonEC2ContainerRegistryPullOnly, AmazonSSMManagedInstanceCore
可观测性角色 aws-elasticbeanstalk-eks-observability-role pods.eks.amazonaws.com CloudWatchAgentServerPolicy, AWSElasticBeanstalkEKSObservability
映像生成角色 aws-elasticbeanstalk-eks-image-build-role codebuild.amazonaws.com AWSElasticBeanstalkEKSImageBuild
应用程序角色(可选) 你选择名字 pods.eks.amazonaws.com 无。您仅授予应用程序所需的权限。请参阅配置应用程序角色。
提供集群、节点和可观测性角色
  1. 如果您在 Elastic Beanstalk 控制台中创建环境,则无需准备任何内容。控制台使用上表中的名称按名称查找这三个角色,在您的账户中已经存在时选择它们,当它们不存在时创建它们。它只匹配角色名称,而不是完整的 ARN,而且由于 IAM 角色名称在账户中是唯一的,因此角色所在的路径不会影响匹配。

  2. 如果您使用 Amazon CLI 或 API,请先创建这三个角色。两个客户都不会为你创建它们。在上表中为每个角色指定名称和可信服务,并附上列出的策略。角色必须与环境位于同一个 Amazon 账户中。

  3. 创建环境时,在cluster-rolenode-role、和observability-role设置中提供所有三个 ARN。明确提供可观测性角色而不是依赖默认角色,这样子网集上的每个环境都会注册相同的角色。

  4. 如果您的应用程序调用 Amazon 服务,请按中所述配置可选应用程序角色配置应用程序角色。

子网集单独选择集群,因此,当您需要具有不同基础架构角色的单独集群时,请使用不同的子网集。您无法更改现有 Beanstalk 集群环境的子网或集群、节点和可观测性角色。请参阅环境分组。可选应用程序角色特定于环境,可能因环境而异;请参阅配置应用程序角色。

创建环境的权限

由于您将这些角色交给 Elastic Beanstalk,因此创建环境的委托人需要权限才能传递这些角色。Elastic Beanstalk 会在配置任何内容之前对此进行验证,因此请向该委托人授予以下权限:

  • iam:GetRole以及iam:PassRole你传递的每个角色:集群、节点和可观测性角色,以及应用程序角色和映像构建角色(如果你使用它们)。iam:PassRole使用iam:PassedToService条件键进行范围。它的值是接收角色的服务:eks.amazonaws.com集群角色、节点角色、ec2.amazonaws.com可观察性和应用程序角色、pods.eks.amazonaws.com映像构建角色,codebuild.amazonaws.com以及elasticbeanstalk.amazonaws.com因为 Elastic Beanstalk 代表您传递这些角色。

  • iam:CreateServiceLinkedRole,这是账户中的第一个 Beanstalk 集群环境所需要的,这样 Elastic Beanstalk 和 Amazon EKS 才能创建其服务相关角色。使用条件键对其进行限定范围,iam:AWSServiceName条件键的值为elasticbeanstalk.amazonaws.com和eks.amazonaws.com。

以下政策支持所有这些。将账户 ID 替换为您自己的账户 ID,使用您的应用程序角色的名称,并移除您未传递的任何角色。显示的角色名称是上表中的角色名称,由控制台创建和选择。

与按名称选择角色的控制台不同,策略根据角色的完整 ARN 来匹配角色,因此每个Resource条目都必须包含该角色的 IAM 路径。控制台创建的角色所在的位置/service-role/,如下所示。如果你以其他方式创建了一个角色,它可能没有路径,在这种情况下,它的 ARN 是arn:aws:iam::111122223333:role/role-name。要读取角色的 ARN,请运行aws iam get-role --role-name role-name --query Role.Arn --output text。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "InspectTheRoles", "Effect": "Allow", "Action": "iam:GetRole", "Resource": [ "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-cluster-role", "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-node-role", "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-observability-role", "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-image-build-role", "arn:aws:iam::111122223333:role/my-application-role" ] }, { "Sid": "PassTheRolesToBeanstalk", "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-cluster-role", "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-node-role", "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-observability-role", "arn:aws:iam::111122223333:role/service-role/aws-elasticbeanstalk-eks-image-build-role", "arn:aws:iam::111122223333:role/my-application-role" ], "Condition": { "StringEquals": { "iam:PassedToService": [ "eks.amazonaws.com", "ec2.amazonaws.com", "pods.eks.amazonaws.com", "codebuild.amazonaws.com", "elasticbeanstalk.amazonaws.com" ] } } }, { "Sid": "CreateServiceLinkedRolesOnFirstEnvironment", "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "arn:aws:iam::111122223333:role/aws-service-role/*", "Condition": { "StringEquals": { "iam:AWSServiceName": [ "elasticbeanstalk.amazonaws.com", "eks.amazonaws.com" ] } } } ] }

iam:GetRole在自己的语句中,因为iam:PassedToService条件密钥仅存在于PassRole请求中。将其应用于同一语句iam:GetRole中将完全阻止该权限的授予。

此政策仅涵盖角色传递。它不授予创建应用程序和环境所需的 Elastic Beanstalk 操作。

如果没有这些权限,CreateEnvironment则会失败,因为命名了它无法执行的操作AccessDenied时出现错误。有关更多信息,请参阅授予委托人将角色传递给 Amazon 服务的权限和CreateEnvironment。

Elastic Beanstalk 管理的角色

Elastic Beanstalk 通过在您的账户中创建的AWSServiceRoleForElasticBeanstalk服务相关角色来运营 Beanstalk 集群环境。您不能创建、配置或传递此角色。亚马逊 EKS 同样使用自己的服务相关角色。AWSServiceRoleForAmazonEKS有关 Elastic Beanstalk 如何使用服务相关角色,请参阅。将服务相关角色用于 Elastic Beanstalk

确认环境使用的角色

环境进入Ready状态后,阅读其已解析的配置:

$ aws elasticbeanstalk describe-configuration-settings \ --application-name my-app \ --environment-name my-cluster-env \ --query "ConfigurationSettings[0].OptionSettings[?OptionName=='cluster-role' || OptionName=='node-role' || OptionName=='observability-role'].[Namespace,OptionName,Value]" \ --output table

确认集群、节点和可观测性角色条目包含创建期间提供的 ARN。如果环境使用应用程序角色,请运行凭据身份签入配置应用程序角色并确认返回的 ARN 可以识别所选角色。对于基于源代码的应用程序版本,请等待版本报告PROCESSED;该状态确认 Amazon CodeBuild 可以使用构建角色并完成映像构建。请参阅为 Beanstalk 集群环境构建容器镜像。

应用程序权限

当正在运行的应用程序必须调用 Amazon 服务时,使用应用程序角色。在创建环境之前配置角色,并仅授予应用程序所需的权限。应用程序通过亚马逊 EKS Pod 身份而不是通过亚马逊 EC2 实例配置文件接收角色。

在aws:elasticbeanstalk:eks:environment命名空间的application-role设置中传递角色的 ARN,或者在创建环境时在 Elastic Beanstalk 控制台中选择该角色。

应用程序角色也是读取第三方可观测性后端凭据的角色。如果您将任何可观测性后端设置为custom,请授予应用程序角色secretsmanager:GetSecretValue和secretsmanager:DescribeSecret命名的 Secrets Manager 密钥。custom-credentials请参阅向第三方后端发送可观测性数据。

配置应用程序角色

在创建环境之前创建应用程序角色。仅向角色授予应用程序所需的操作和资源。为亚马逊 EKS Pod 身份配置其信任策略,包括sts:TagSession为pods.eks.amazonaws.com服务主体配置sts:AssumeRole和信任策略:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
  1. 使用前面的信任策略创建角色。

  2. 附加基于身份的政策,仅授予应用程序所需的服务操作和资源。

  3. 在 Elastic Beanstalk 控制台中,启动环境创建工作流程并扩展服务访问权限。

  4. 在 “应用程序角色-可选” 下选择角色。完成剩余的环境配置,然后创建环境。

    使用 Amazon CLI 或 API,改为在create-environment请求中添加application-role选项来选择角色:

    --option-settings \ Namespace=aws:elasticbeanstalk:eks:environment,OptionName=application-role,Value=arn:aws:iam::111122223333:role/my-application-role
  5. 部署应用程序后,从应用程序调用所需的 Amazon 服务。要独立于服务策略验证凭据身份,请致电 Amazon STS GetCallerIdentity并确认返回的 ARN 可识别所选应用程序角色。

如果应用程序收到AccessDenied,请确认您在环境创建期间选择了预期角色,其信任策略是否允许 Amazon EKS Pod Identity,以及其基于身份的政策是否允许所请求的操作和资源。更正信任或权限政策,重复凭证身份检查和应用程序服务调用。如果选择了错误的角色,请使用预期角色创建替代环境,而不是向错误的角色添加应用程序权限。当环境需要不同的访问权限时,使用不同的应用程序角色。不要向群集或节点角色授予应用程序权限。

诊断角色故障

从环境的 Elastic Beanstalk 事件开始。设置operation_start为请求失败前夕记录的时间戳:

$ operation_start='timestamp-recorded-before-the-request' $ aws elasticbeanstalk describe-events \ --environment-name my-cluster-env \ --severity ERROR \ --start-time "$operation_start" \ --max-items 20
环境创建拒绝了基础设施的角色

确认该角色在环境账户中,其信任策略和附加策略符合当前的 Amazon EKS 自动模式指南,且其 ARN 已完成。如果请求的子网集已经有注册的集群,请使用其注册的群集和节点角色。操作错误表明请求值和注册值存在冲突。更正请求并再次创建环境。您无法在现有环境中替换这些角色。

无法检索应用程序映像

验证节点角色是否具有已记录的 Amazon ECR 检索权限和信任政策。还要验证图像 URI 和任何限制访问的存储库策略。更正角色或存储库策略,然后再次部署应用程序版本。

源代码生成报告 FAILED

验证应用程序版本构建配置中的编译角色并检查编译诊断。在创建新的应用程序版本之前,更正角色信任或权限策略。请参阅为 Beanstalk 集群环境构建容器镜像。

正在运行的应用程序接收 AccessDenied

使用应用程序角色签入。配置应用程序角色首先确认凭据身份,然后将应用程序日志和 CloudTrail 事件中被拒绝的操作和资源与角色策略进行比较。