

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

# 服務帳戶的 IAM 角色
<a name="iamserviceaccounts"></a>

**提示**  
 `eksctl` 支援設定透過 EKS [Pod Identity Associations 執行應用程式的 EKS](pod-identity-associations.md) 精細許可 

Amazon EKS 支援[此處](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)的服務帳戶角色 (IRSA)】，可讓叢集運算子將 AWS IAM 角色映射至 Kubernetes 服務帳戶。

這可為在 EKS 上執行並使用其他 AWS 服務的應用程式提供精細的許可管理。這些可能是使用 S3、任何其他資料服務 (RDS、MQ、STS、DynamoDB) 或 Kubernetes 元件的應用程式，例如 AWS Load Balancer 控制器或 ExternalDNS。

您可以使用 輕鬆建立 IAM 角色和服務帳戶對`eksctl`。

**注意**  
如果您使用[執行個體角色](iam-policies.md)，並考慮改用 IRSA，則不應混合兩者。

## 運作方式
<a name="iam-how-works"></a>

它透過 EKS 公開的 IAM OpenID Connect 提供者 (OIDC) 運作，且 IAM 角色必須參考 IAM OIDC 提供者 （特定於指定的 EKS 叢集） 來建構，並參考其將繫結的 Kubernetes 服務帳戶。建立 IAM 角色後，服務帳戶應包含該角色的 ARN 做為註釋 (`eks.amazonaws.com/role-arn`)。根據預設，將建立或更新服務帳戶以包含角色註釋，這可以使用旗標 停用`--role-only`。

在 EKS 中，有一個[許可控制器](https://github.com/aws/amazon-eks-pod-identity-webhook/)，根據 Pod 使用的服務帳戶上的註釋，分別將 AWS 工作階段登入資料注入 Pod 的角色。& `AWS_ROLE_ARN``AWS_WEB_IDENTITY_TOKEN_FILE`環境變數會公開登入資料。由於使用了最新版本的 AWS 開發套件 （如需確切版本的詳細資訊，請參閱[此處](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions))，應用程式將使用這些登入資料。

資源`eksctl`的名稱為 *iamserviceaccount*，代表 IAM 角色和服務帳戶對。

## 來自 CLI 的用量
<a name="_usage_from_cli"></a>

**注意**  
服務帳戶的 IAM 角色需要 Kubernetes 1.13 版或更新版本。

IAM OIDC 提供者預設為未啟用，您可以使用下列命令來啟用它，或使用組態檔案 （請參閱下文）：

```
eksctl utils associate-iam-oidc-provider --cluster=<clusterName>
```

一旦您有與叢集相關聯的 IAM OIDC 提供者，若要建立繫結至服務帳戶的 IAM 角色，請執行：

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --namespace=<serviceAccountNamespace> --attach-policy-arn=<policyARN>
```

**注意**  
您可以指定`--attach-policy-arn`多次使用多個政策。

更具體地說，您可以透過執行以下操作來建立具有 S3 唯讀存取權的服務帳戶：

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
```

根據預設，它會在`default`命名空間中建立，但您可以指定任何其他命名空間，例如：

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --namespace=s3-app --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
```

**注意**  
如果命名空間尚不存在，則會建立命名空間。

如果您已在叢集中建立服務帳戶 （沒有 IAM 角色），則需要使用 `--override-existing-serviceaccounts` 旗標。

自訂標記也可以透過指定 套用至 IAM 角色`--tags`：

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --tags "Owner=John Doe,Team=Some Team"
```

CloudFormation 會產生包含隨機字串的角色名稱。如果您偏好預先決定的角色名稱，您可以指定 `--role-name`：

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-name "custom-role-name"
```

當服務帳戶由一些其他工具建立和管理時，例如 helm，請使用 `--role-only` 來防止衝突。然後，另一個工具負責維護角色 ARN 註釋。請注意， `--override-existing-serviceaccounts` 對 `roleOnly`/`--role-only` 服務帳戶沒有影響，一律會建立角色。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-only --role-name=<customRoleName>
```

當您擁有要與服務帳戶搭配使用的現有角色時，您可以提供 `--attach-role-arn`旗標，而不是提供政策。為了確保角色只能由指定的服務帳戶擔任，您應該[在此處](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)設定關係政策文件】。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --attach-role-arn=<customRoleARN>
```

若要更新服務帳戶角色許可，您可以執行 `eksctl update iamserviceaccount`。

**注意**  
 `eksctl delete iamserviceaccount` `ServiceAccounts` 即使 未建立 Kubernetes， 也會將其刪除`eksctl`。

## 使用組態檔案
<a name="_usage_with_config_files"></a>

若要`iamserviceaccounts`使用組態檔案管理 ，您會希望在 下設定`iam.withOIDC: true`和列出您想要的帳戶`iam.serviceAccount`。

所有命令都支援 `--config-file`，您可以像節點群組一樣管理 *iamserviceaccounts*。 **`eksctl create iamserviceaccount` 命令支援 `--include`和 `--exclude`旗標 （如需這些運作方式的詳細資訊，請參閱[本節](general-nodegroups.md#node-include))。命令`--only-missing`也`eksctl delete iamserviceaccount`支援 ，因此您可以像節點群組一樣執行刪除。

**注意**  
IAM 服務帳戶的範圍在命名空間中，即兩個具有相同名稱的服務帳戶可能存在於不同的命名空間中。因此，若要將服務帳戶唯一定義為 `--include`、 `--exclude`旗標的一部分，您需要以 `namespace/name` 格式傳遞名稱字串。例如

```
eksctl create iamserviceaccount --config-file=<path> --include backend-apps/s3-reader
```

使用 IRSA 搭配已知的使用案例，例如 `cluster-autoscaler`和 ，`wellKnownPolicies`包含啟用 的選項`cert-manager`，作為政策清單的速記。

支援的已知政策和其他屬性`serviceAccounts`會記錄在[組態結構描述中](https://geoffcline.github.io/eksctl-schema-demo/#iam-serviceAccounts)。

您可以使用下列組態範例搭配 `eksctl create cluster`：

```
# An example of ClusterConfig with IAMServiceAccounts:
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: cluster-13
  region: us-west-2

iam:
  withOIDC: true
  serviceAccounts:
  - metadata:
      name: s3-reader
      # if no namespace is set, "default" will be used;
      # the namespace will be created if it doesn't exist already
      namespace: backend-apps
      labels: {aws-usage: "application"}
    attachPolicyARNs:
    - "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
    tags:
      Owner: "John Doe"
      Team: "Some Team"
  - metadata:
      name: cache-access
      namespace: backend-apps
      labels: {aws-usage: "application"}
    attachPolicyARNs:
    - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess"
    - "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess"
  - metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels: {aws-usage: "cluster-ops"}
    wellKnownPolicies:
      autoScaler: true
    roleName: eksctl-cluster-autoscaler-role
    roleOnly: true
  - metadata:
      name: some-app
      namespace: default
    attachRoleARN: arn:aws:iam::123:role/already-created-role-for-app
nodeGroups:
  - name: "ng-1"
    tags:
      # EC2 tags required for cluster-autoscaler auto-discovery
      k8s.io/cluster-autoscaler/enabled: "true"
      k8s.io/cluster-autoscaler/cluster-13: "owned"
    desiredCapacity: 1
```

如果您在未設定這些欄位的情況下建立叢集，您可以使用下列命令來啟用您所需的一切：

```
eksctl utils associate-iam-oidc-provider --config-file=<path>
eksctl create iamserviceaccount --config-file=<path>
```

## 詳細資訊
<a name="_further_information"></a>
+  [服務帳戶的精細 IAM 角色簡介](https://aws.amazon.com/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts/) 
+  [EKS 使用者指南 - 服務帳戶的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions) 
+  [將 IAM 使用者和角色映射至 Kubernetes RBAC 角色](iam-identity-mappings.md) 