

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

# Beanstalk 集群的权限
<a name="beanstalk-cluster-permissions"></a>

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

## 您提供的角色
<a name="beanstalk-cluster-permissions-customer-roles"></a>

Beanstalk 集群环境使用集群角色、节点角色和可观察性角色。当您在 Elastic Beanstalk 控制台中创建环境并接受默认服务访问设置时，如果您的账户中尚不存在这些设置，则控制台会为您创建所有三个设置[每个角色的名称、可信服务和权限](#beanstalk-cluster-permissions-role-details)，名称在中：
+ **集群角色 ** — 亚马逊 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 控制台之外创建这些角色，我们强烈建议您完全按照中的说明创建它们。[每个角色的名称、可信服务和权限](#beanstalk-cluster-permissions-role-details)然后，在创建环境时，将每个角色 ARN 传递到其配置选项中。有关有效的示例，请参阅[Beanstalk 集群入门](beanstalk-cluster-getting-started.md)。

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

您还可以提供可选的**应用程序角色**，运行中的应用程序使用该角色来调用 Amazon 服务。请参阅[应用程序权限](#beanstalk-cluster-permissions-application)。

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

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


**每个角色的名称、可信服务和权限**  

|  角色 | 角色名称 | 值得信赖的服务 | 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 | 无。您仅授予应用程序所需的权限。请参阅[配置应用程序角色](#beanstalk-cluster-permissions-application-role)。 | 

**提供集群、节点和可观测性角色**

1. 如果您在 Elastic Beanstalk 控制台中创建环境，则无需准备任何内容。控制台使用上表中的名称按名称查找这三个角色，在您的账户中已经存在时选择它们，当它们不存在时创建它们。它只匹配角色名称，而不是完整的 ARN，而且由于 IAM 角色名称在账户中是唯一的，因此角色所在的路径不会影响匹配。

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

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

1. 如果您的应用程序调用 Amazon 服务，请按中所述配置可选应用程序角色[配置应用程序角色](#beanstalk-cluster-permissions-application-role)。

子网集单独选择集群，因此，当您需要具有不同基础架构角色的单独集群时，请使用不同的子网集。您无法更改现有 Beanstalk 集群环境的子网或集群、节点和可观测性角色。请参阅[环境分组](beanstalk-cluster-concepts.md#beanstalk-cluster-clusters-sharing)。可选应用程序角色特定于环境，可能因环境而异；请参阅[配置应用程序角色](#beanstalk-cluster-permissions-application-role)。

## 创建环境的权限
<a name="beanstalk-cluster-permissions-caller"></a>

由于您将这些角色交给 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 服务的权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_passrole.html)和[`CreateEnvironment`](https://docs.amazonaws.cn/elasticbeanstalk/latest/api/API_CreateEnvironment.html)。

## Elastic Beanstalk 管理的角色
<a name="beanstalk-cluster-permissions-service-roles"></a>

Elastic Beanstalk 通过在您的账户中创建的`AWSServiceRoleForElasticBeanstalk`服务相关角色来运营 Beanstalk 集群环境。您不能创建、配置或传递此角色。亚马逊 EKS 同样使用自己的服务相关角色。`AWSServiceRoleForAmazonEKS`有关 Elastic Beanstalk 如何使用服务相关角色，请参阅。[将服务相关角色用于 Elastic Beanstalk](using-service-linked-roles.md)

## 确认环境使用的角色
<a name="beanstalk-cluster-permissions-verify"></a>

环境进入`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。如果环境使用应用程序角色，请运行凭据身份签入[配置应用程序角色](#beanstalk-cluster-permissions-application-role)并确认返回的 ARN 可以识别所选角色。对于基于源代码的应用程序版本，请等待版本报告`PROCESSED`；该状态确认 Amazon CodeBuild 可以使用构建角色并完成映像构建。请参阅[为 Beanstalk 集群环境构建容器镜像](beanstalk-cluster-app-versions.md)。

## 应用程序权限
<a name="beanstalk-cluster-permissions-application"></a>

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

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

应用程序角色也是读取第三方可观测性后端凭据的角色。如果您将任何可观测性后端设置为`custom`，请授予应用程序角色`secretsmanager:GetSecretValue`和`secretsmanager:DescribeSecret`命名的 Secrets Manager 密钥。`custom-credentials`请参阅[向第三方后端发送可观测性数据](monitoring-cluster-environments.md#monitoring-cluster-environments-custom-backend)。

### 配置应用程序角色
<a name="beanstalk-cluster-permissions-application-role"></a>

在创建环境之前创建应用程序角色。仅向角色授予应用程序所需的操作和资源。为亚马逊 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. 使用前面的信任策略创建角色。

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

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

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

   使用 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}}
   ```

1. 部署应用程序后，从应用程序调用所需的 Amazon 服务。要独立于服务策略验证凭据身份，请致电 Amazon STS `GetCallerIdentity`并确认返回的 ARN 可识别所选应用程序角色。

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

## 诊断角色故障
<a name="beanstalk-cluster-permissions-diagnosis"></a>

从环境的 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 集群环境构建容器镜像](beanstalk-cluster-app-versions.md)。

正在运行的应用程序接收 `AccessDenied`  
使用应用程序角色签入。[配置应用程序角色](#beanstalk-cluster-permissions-application-role)首先确认凭据身份，然后将应用程序日志和 CloudTrail 事件中被拒绝的操作和资源与角色策略进行比较。