

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon EKS 存取項目身分驗證
<a name="eks-access-entries"></a>

Amazon EKS 支援兩種機制來授予 IAM 主體呼叫叢集 Kubernetes API 的許可：舊版 `aws-auth` ConfigMap 和較新的[存取項目 API](https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html)。存取項目會授予 Kubernetes API 對 IAM 主體的存取權，而不需要您編輯 ConfigMap。 AWS Batch 可以透過任一機制對您的叢集進行身分驗證。

當您`ENABLED`在運算環境中`eksConfiguration.accessEntry.desiredState`將 設定為 時， AWS Batch 可以管理叢集上該運算環境的存取項目。您不再需要手動編輯 `aws-auth` ConfigMap。

是否 AWS Batch 佈建存取項目取決於您的 AWS Batch 運算環境和 Amazon EKS 叢集組態。如需詳細資訊，請參閱 [與叢集 的互動 `authenticationMode`](#eks-access-entries-matrix)。

## 的值 `accessEntry.desiredState`
<a name="eks-access-entries-desired-state"></a>

上的 `desiredState` 欄位會`EksAccessEntry`宣告運算環境所需的存取項目狀態。有效的值如下：

`ENABLED`  
AWS Batch 在叢集上為運算環境建立受 AWS Batch管存取項目。只有在叢集上的所有運算環境都`desiredState`設為 時， AWS Batch 才會建立受 AWS Batch管存取項目 `ENABLED`（如需詳細資訊[如何 AWS Batch 協調`desiredState`跨運算環境](#eks-access-entries-reconciliation)，請參閱 )。

`DISABLED`  
AWS Batch 會刪除叢集的 AWS Batch受管存取項目。只有在叢集上的所有運算環境都`desiredState`設為 時， AWS Batch 才會刪除受 AWS Batch管存取項目 `DISABLED`（如需詳細資訊[如何 AWS Batch 協調`desiredState`跨運算環境](#eks-access-entries-reconciliation)，請參閱 )。必須透過 ConfigMap `aws-auth` 設定對叢集的存取。

`INHERIT_FROM_CLUSTER`  
AWS Batch 會延遲至叢集目前的存取項目 `status`。在身分驗證模式為 的 Amazon EKS 叢集上`API`， 會 AWS Batch 建立和管理存取項目，因為叢集沒有要返回的 `aws-auth` ConfigMap。在身分驗證模式為 `CONFIG_MAP`或 的叢集上`API_AND_CONFIG_MAP`， AWS Batch 不會新增或移除存取項目。

運算環境也會在 [DescribeComputeEnvironments](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeComputeEnvironments.html) 回應中公開唯讀`accessEntry.status`欄位。 `ACTIVE`表示運算環境的 AWS Batch受管存取項目存在於叢集上，並優先於 `aws-auth` ConfigMap。 `INACTIVE`表示不存在受 AWS Batch管存取項目。這可能是因為 `desiredState` 是 `DISABLED`，因為以叢集為目標的運算環境尚未在 上達成一致`desiredState`，或是因為項目尚未佈建。如果 `accessEntry.status`是 `INACTIVE`，則 Batch 會使用 `aws-auth` ConfigMap 進行叢集存取。

**注意**  
存取項目會在叢集上存在時`ACTIVE`立即報告，即使 AWS Batch 尚未完成關聯使其可供使用的存取政策。如果運算環境狀態變更為 ，`INVALID`而 `accessEntry.status`為 `ACTIVE`，請參閱 [Amazon EKS 存取項目設定不完整](batch_eks_invalid_compute_environment.md#batch_eks_access_entry_incomplete)。

**注意**  
如果您省略 `accessEntry` 欄位， AWS Batch 不會記錄運算環境`desiredState`的 ，`DescribeComputeEnvironments`也不會傳回一個。為了佈建存取項目， AWS Batch 的行為與 相同`INHERIT_FROM_CLUSTER`。

## 與叢集 的互動 `authenticationMode`
<a name="eks-access-entries-matrix"></a>

特定 AWS Batch 的行為`desiredState`方式取決於叢集的身分驗證模式。下表同時適用於 `CreateComputeEnvironment`和 `UpdateComputeEnvironment`。


<table>
<thead>
  <tr><th>叢集 <code>authenticationMode</code></th><th>運算環境 <code>accessEntry.desiredState=ENABLED</code></th><th>運算環境 <code>accessEntry.desiredState=DISABLED</code></th><th>運算環境 <code>accessEntry.desiredState=INHERIT_FROM_CLUSTER</code></th></tr>
</thead>
<tbody>
  <tr><td><code>CONFIG_MAP</code></td><td colspan="3">叢集上無法使用存取項目，因此 AWS Batch 不會建立或移除。 AWS Batch 仍會記錄您指定的值。變更叢集的身分驗證模式後，該記錄的值會在您的下一個 <code>CreateComputeEnvironment</code>或指定 的 <code>UpdateComputeEnvironment</code> 呼叫上生效<code>desiredState</code>。</td></tr>
  <tr><td><code>API_AND_CONFIG_MAP</code></td><td colspan="2">AWS Batch 會比較共用叢集的運算環境中記錄的值，請參閱 <a href="#eks-access-entries-reconciliation">如何 AWS Batch 協調`desiredState`跨運算環境</a>。</td><td>保留現有的存取模式。 AWS Batch 不會新增或移除存取項目。</td></tr>
  <tr><td><code>API</code></td><td>在叢集上建立和維護存取項目。</td><td>請求會遭到拒絕。此模式中的叢集不支援 <code>aws-auth</code> ConfigMap，而且無法在叢集建立後啟用 ConfigMap 方法，因此 <code>DISABLED</code>會讓運算環境無法進行身分驗證。</td><td>在叢集上建立和維護存取項目。當叢集僅限 時<code>API</code>，繼承相當於 <code>ENABLED</code>。</td></tr>
</tbody>
</table>


## 如何 AWS Batch 協調`desiredState`跨運算環境
<a name="eks-access-entries-reconciliation"></a>

由於單一 Amazon EKS 叢集可以支援多個 AWS Batch 運算環境，因此叢集的存取組態是共用資源。 AWS Batch 因此， 會協調或比較和解析這些運算環境中記錄`desiredState`的值。

當叢集的 `authenticationMode`為 時`API_AND_CONFIG_MAP`， 會 AWS Batch 比較以叢集為目標之相同 AWS 帳戶和 AWS 區域中每個運算環境所`desiredState`記錄的 。 AWS Batch 會使用此比較來判斷是否要新增或移除指定 之每個 `CreateComputeEnvironment`或 `UpdateComputeEnvironment`操作的存取項目`desiredState`。

每個運算環境都有 `desiredState=ENABLED`  
AWS Batch 在叢集上建立存取項目。

每個運算環境都有 `desiredState=DISABLED`  
AWS Batch 如果存在存取項目， 會從叢集中刪除存取項目。

記錄`desiredState`的值不完全相符  
AWS Batch 會保留現有的存取模式。存取項目不會新增或移除。這包括 `ENABLED`、 `DISABLED`和 的任何混合`INHERIT_FROM_CLUSTER`，也包括沒有`desiredState`記錄的任何運算環境。

**注意**  
若要將身分驗證模式為 `API_AND_CONFIG_MAP` ConfigMap `aws-auth` 的叢集轉換為存取項目身分驗證，`desiredState=ENABLED`請在以叢集為目標的每個 AWS Batch 運算環境中設定 。若要轉返，請在每個轉換`desiredState=DISABLED`上設定 。

## 在您的叢集上 AWS Batch 建立的內容
<a name="eks-access-entries-what-batch-creates"></a>

AWS Batch 每個叢集建立一個符合上述條件的存取項目，然後將 `AWSBatchClusterPolicy` Amazon EKS 存取政策與該存取項目建立關聯。存取項目是每個叢集而非每個運算環境，因此以相同叢集為目標的所有 AWS Batch 運算環境都會共用。

**注意**  
刪除運算環境不會移除存取項目，即使它是叢集上的最後一個 AWS Batch 運算環境。若要移除 AWS Batch受管存取項目，請在每個以叢集為目標的 AWS Batch 運算環境`desiredState=DISABLED`上呼叫 `UpdateComputeEnvironment` 與 ，然後再刪除它們。

存取項目本身不足以在叢集上執行任務。如需您必須自行設定的Kubernetes許可和節點存取權，請參閱 [您仍然必須提供的叢集組態](#eks-access-entries-additional-configuration)。

## 所需的許可
<a name="eks-access-entries-permissions"></a>

AWS Batch 會使用呼叫 `CreateComputeEnvironment`或 `UpdateComputeEnvironment`操作的 IAM 身分憑證來管理存取項目。必須允許該身分執行下列 Amazon EKS 動作：
+ `eks:DescribeCluster`
+ `eks:DescribeAccessEntry`
+ `eks:CreateAccessEntry`
+ `eks:AssociateAccessPolicy`
+ `eks:DeleteAccessEntry`

## 設定存取項目
<a name="eks-access-entries-configure"></a>

您可以透過 [CreateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_CreateComputeEnvironment.html) 或 [UpdateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_UpdateComputeEnvironment.html) API `eksConfiguration.accessEntry`的 欄位，在運算環境中設定存取項目。

------
#### [ AWS CLI ]

**在建立運算環境時啟用受 AWS Batch管存取項目**

```
$ aws batch create-compute-environment \
    --compute-environment-name {{my-eks-ce}} \
    --type MANAGED \
    --eks-configuration 'eksClusterArn={{arn:aws:eks:us-east-1:123456789012:cluster/my-cluster}},kubernetesNamespace={{my-aws-batch-namespace}},accessEntry={desiredState=ENABLED}' \
    --compute-resources 'type=EC2,maxvCpus=128,subnets={{subnet-a123456b}},securityGroupIds={{sg-a12b3456}},instanceRole={{arn:aws:iam::123456789012:instance-profile/my-node-instance-profile}}'
```

**在現有的運算環境中啟用受 AWS Batch管存取項目**

```
$ aws batch update-compute-environment \
    --compute-environment {{my-eks-ce}} \
    --eks-configuration 'accessEntry={desiredState=ENABLED}'
```

**檢查狀態**

```
$ aws batch describe-compute-environments \
    --compute-environments {{my-eks-ce}} \
    --query "computeEnvironments[0].eksConfiguration.accessEntry"
```

回應包含`desiredState`您指定的 和觀察到的 `status`：

```
{
    "desiredState": "ENABLED",
    "status": "ACTIVE"
}
```

**注意**  
AWS Batch 會`accessEntry.status`傳回所有 Amazon EKS 運算環境，且`desiredState`只有在您已設定時才傳回。您從未指定的運算環境會`status`單獨`accessEntry`傳回。

若要 AWS Batch 停止管理存取項目，請`DISABLED`改為將 `desiredState`設定為 。執行此作業之前，請檢閱 [與叢集 的互動 `authenticationMode`](#eks-access-entries-matrix)：在身分驗證模式為 的叢集上`DISABLED`遭到拒絕`API`，而在身分驗證模式為存取項目`API_AND_CONFIG_MAP`的叢集上，只有在以叢集為目標的每個 AWS Batch 運算環境都設定為 後，才會移除存取項目`DISABLED`。

------
#### [ API ]

在 [CreateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_CreateComputeEnvironment.html) 或 [UpdateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_UpdateComputeEnvironment.html) 請求中使用 `eksConfiguration.accessEntry` 物件。

**使用 AWS Batch受管存取項目建立運算環境**

包含在請求內文`accessEntry`中：

```
{
    "computeEnvironmentName": "{{my-eks-ce}}",
    "type": "MANAGED",
    "state": "ENABLED",
    "eksConfiguration": {
        "eksClusterArn": "{{arn:aws:eks:us-east-1:123456789012:cluster/my-cluster}}",
        "kubernetesNamespace": "{{my-aws-batch-namespace}}",
        "accessEntry": {
            "desiredState": "ENABLED"
        }
    },
    "computeResources": {
        "type": "EC2",
        "maxvCpus": 128,
        "subnets": ["{{subnet-a123456b}}"],
        "securityGroupIds": ["{{sg-a12b3456}}"],
        "instanceRole": "{{arn:aws:iam::123456789012:instance-profile/my-node-instance-profile}}"
    }
}
```

**更新現有運算環境的存取項目**

```
{
    "computeEnvironment": "{{my-eks-ce}}",
    "eksConfiguration": {
        "accessEntry": {
            "desiredState": "ENABLED"
        }
    }
}
```

如需詳細資訊，請參閱 *AWS Batch API 參考*中的 、[`EksAccessEntry`](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksAccessEntry.html)[CreateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_CreateComputeEnvironment.html) 和 [UpdateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_UpdateComputeEnvironment.html)。

------

## 您仍然必須提供的叢集組態
<a name="eks-access-entries-additional-configuration"></a>

存取項目只會控制對叢集進行 AWS Batch 身分驗證的方式。它不會授予執行任務所需的 AWS Batch Kubernetes許可，也不會讓 AWS Batch 啟動 的執行個體加入叢集。無論您使用哪種身分驗證機制，您仍然必須設定下列兩項。

**重要**  
為叢集 (`accessEntry.status=ACTIVE`) 上的 AWS Batch 服務連結角色建立 AWS Batch受管存取項目後，其優先順序會高於角色的 `aws-auth` ConfigMap 組態。 AWS Batch 服務連結角色的 ConfigMap 項目未使用，而是改用存取項目進行 AWS Batch 驗證。若要返回 ConfigMap 身分驗證，`desiredState=DISABLED`請在以叢集為目標的所有運算環境中設定 。這會移除受 AWS Batch管存取項目。

Kubernetes AWS Batch 命名空間的 許可  
AWS Batch 需要Kubernetes許可，才能在您在 中指定的命名空間中建立和管理 Pod`eksConfiguration.kubernetesNamespace`。建立 命名空間，然後根據您的身分驗證方法，使用下列其中一種方法設定這些許可：  
+ **存取政策關聯 （存取項目 時為必要`status=ACTIVE`)** — 當您`desiredState=ENABLED`在所有以叢集為目標的運算環境中設定 時， 會使用叢集層級 AWS Batch 建立存取項目`AWSBatchClusterPolicy`。然後，您必須將命名空間範圍建立關聯`AWSBatchNamespacePolicy`，以授予 AWS Batch 建立和管理 Pod 的許可。

  存取項目到達 後`status=ACTIVE`，請使用 建立命名空間政策的關聯 AWS CLI：

  ```
  $ aws eks associate-access-policy \
      --cluster-name {{my-cluster}} \
      --principal-arn {{arn:aws:iam::123456789012:role/aws-service-role/batch.amazonaws.com/AWSServiceRoleForBatch}} \
      --policy-arn arn:aws:eks::aws:cluster-access-policy/AWSBatchNamespacePolicy \
      --access-scope type=namespace,namespaces={{my-aws-batch-namespace}}
  ```

  將 {{my-aws-batch-namespace}} 取代為您在 中指定的值`eksConfiguration.kubernetesNamespace`。
**重要**  
如果沒有命名空間範圍政策關聯，任務將保持停滯`RUNNABLE`狀態。叢集層級政策本身不會授予 Pod 管理許可。
+ **Kubernetes 角色和角色繫結 （當存取項目 時`status=INACTIVE`)** — 如果 AWS Batch受管存取項目未處於作用中狀態，請建立授予這些許可Kubernetes的角色和角色繫結，如中所述[步驟 2：準備您的 Amazon EKS 叢集 AWS Batch](getting-started-eks.md#getting-started-eks-step-1)。您可以為每個叢集執行此操作一次。
**注意**  
當受 AWS Batch管存取項目處於作用中 (`status=ACTIVE`) 時，會略過 RBAC Kubernetes 角色。您必須改用存取政策關聯方法。
AWS Batch 不會為您建立這些資源，且 AWS Batch受管存取項目不會取代這些資源。如果遺失，當任務無法啟動`VALID`時，運算環境仍會變成 。

節點執行個體角色的叢集存取  
 AWS Batch 啟動的執行個體會使用您在 中指定的執行個體描述檔加入叢集`computeResources.instanceRole`。該角色需要自己的叢集存取權，而叢集與 AWS Batch受管存取項目分開， AWS Batch 且未設定。  
組態方法取決於叢集的 `authenticationMode`：  
+ **在 `authenticationMode`為 的叢集`CONFIG_MAP`**上 — 您必須使用 `aws-auth` ConfigMap。這些叢集不支援存取項目。
+ **在 `authenticationMode` 為 的叢集`API_AND_CONFIG_MAP`**上 — 節點執行個體角色可以使用 `aws-auth` ConfigMap 或存取項目進行身分驗證。如果執行個體角色已在 ConfigMap 中映射，節點將成功加入，而無需為角色建立存取項目。
+ **在 `authenticationMode`為 的叢集`API`**上 — 您必須為節點執行個體角色建立存取項目。ConfigMap `aws-auth` 不會用於這些叢集上的身分驗證。
若要建立節點執行個體角色的存取項目，請使用 AWS CLI：  

```
$ aws eks create-access-entry \
    --cluster-name {{my-cluster}} \
    --principal-arn {{arn:aws:iam::123456789012:role/my-node-instance-role}} \
    --type EC2_LINUX
```

```
$ aws eks associate-access-policy \
    --cluster-name {{my-cluster}} \
    --principal-arn {{arn:aws:iam::123456789012:role/my-node-instance-role}} \
    --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSWorkerNodePolicy \
    --access-scope type=cluster
```
如需詳細資訊，請參閱《**Amazon EKS 使用者指南**》中的[建立存取項目](https://docs.aws.amazon.com/eks/latest/userguide/creating-access-entries.html)。  
如果沒有節點執行個體角色的適當叢集存取，EC2 執行個體將無法加入叢集。任務將保持 `RUNNABLE` 狀態，因為沒有容量向叢集註冊。

## 在 `aws-auth` ConfigMap 和存取項目之間進行選擇
<a name="eks-access-entries-choosing"></a>

存取項目身分驗證是 Amazon EKS 運算環境 AWS Batch 上新 的建議路徑，並提供下列優點：
+ 無需手動編輯 `aws-auth` ConfigMap 即可授予對叢集的 AWS Batch 存取權。
+ 提供可存取叢集之主體的可稽核 API 驅動記錄。
+ 對於其 `authenticationMode`為 `API`且不支援 ConfigMap `aws-auth` 的叢集為必要。

如果您的叢集`authenticationMode`是 `CONFIG_MAP`，則無法使用存取項目，並透過 ConfigMap `aws-auth` 進行 AWS Batch 驗證。如需說明，請參閱[確認 `aws-auth ConfigMap` 已正確設定](verify-configmap-config.md)。