

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

# 第 1 步：配置 Amazon EKS 集群并设置 IAM 权限
<a name="EKS-tutorial-step1"></a>

**配置 Amazon EKS 集群并创建允许 Amazon EKS 服务账户连接到 Amazon Keyspaces 表所需的 IAM 资源**

1. 为 Amazon EKS 集群创建 Open ID Connect（OIDC）身份提供者。需要执行此操作才能将 IAM 角色用于服务账户。有关 OIDC 身份提供者以及如何创建它们的更多信息，请参阅《Amazon EKS 用户指南》中的[为集群创建 IAM OIDC 提供商](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

   1. 使用以下命令为您的集群创建 IAM OIDC 身份提供商。此示例假定集群名称为 `my-eks-cluster`。如果集群名称不同，请务必在所有未来的命令中更新名称。

      ```
      eksctl utils associate-iam-oidc-provider --cluster my-eks-cluster --approve 
      ```

   1. 使用以下命令，确认 OIDC 身份提供者已在 IAM 中注册。

      ```
      aws iam list-open-id-connect-providers --region us-east-1
      ```

      输出应如下所示：记下 OIDC 的 Amazon 资源名称（ARN），下一步为服务账户创建信任策略时需要该名称。

      ```
      {
          "OpenIDConnectProviderList": [
              ..
              {
                  "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
              }
          ]
      }
      ```

1. 为 Amazon EKS 集群创建服务账户。服务账户为在*容器组（pod）*中运行的进程提供身份。容器组是最小、最简单的 Kubernetes 对象，可以用来部署容器化应用程序。接下来，创建一个 IAM 角色，服务账户可代入该角色来获取资源权限。您可以从 Pod 访问任何 AWS 服务，该服务账号已配置为使用服务账号，该账号可以代入具有该服务访问权限的 IAM 角色。

   1. 为服务账户创建新的命名空间。命名空间有助于隔离为本教程创建的集群资源。您可以使用以下命令创建新的命名空间。

      ```
      kubectl create namespace my-eks-namespace
      ```

   1. 要使用自定义命名空间，必须将其与 Fargate 配置文件关联。下面是一个代码示例。

      ```
      eksctl create fargateprofile \
          --cluster my-eks-cluster \
          --name my-fargate-profile \
          --namespace my-eks-namespace \
          --labels *=*
      ```

   1. 使用以下命令在 Amazon EKS 集群的命名空间 `my-eks-namespace` 中创建一个名为 `my-eks-serviceaccount` 的服务账户。

      ```
      cat >my-serviceaccount.yaml <<EOF
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: my-eks-serviceaccount
        namespace: my-eks-namespace
      EOF
      kubectl apply -f my-serviceaccount.yaml
      ```

   1. 运行以下命令来创建信任策略文件，指示 IAM 角色信任您的服务账户。主体必须先建立这种信任关系，然后才能代入角色。需要对文件进行以下编辑：
      + 对于 `Principal`，输入 IAM 返回给 `list-open-id-connect-providers` 命令的 ARN。ARN 包含您的账号和区域。
      + 在`condition`语句中，替换 AWS 区域 和 OIDC ID。
      + 确认服务账户名称和命名空间正确无误。

      在下一步中创建 IAM 角色时，需要附加该信任策略文件。

      ```
      cat >trust-relationship.json <<EOF
      {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
                      }
                  }
              }
          ]
      }
      EOF
      ```

      可选：您还可以在 `StringEquals` 和 `StringLike` 条件中添加多个条目，以允许多个服务账户或命名空间代入角色。要允许您的服务账户在其他 AWS 账户中代入 IAM 角色，请参阅《Amazon EKS 用户指南》**中的[跨账户 IAM 权限](https://docs.aws.amazon.com/eks/latest/userguide/cross-account-access.html)。

1. 创建一个名为 `my-iam-role` 的 IAM 角色，供 Amazon EKS 服务账户代入。将上一步中创建的信任策略文件附加到该角色。信任策略指定了 IAM 角色可以信任的服务账户和 OIDC 身份提供者。

   ```
   aws iam create-role --role-name my-iam-role --assume-role-policy-document file://trust-relationship.json --description "EKS service account role"
   ```

1. 通过附加访问策略向 IAM 角色分配 Amazon Keyspaces 权限。

   1. 附加访问策略以定义 IAM 角色可以对特定 Amazon Keyspaces 资源执行的操作。在本教程中，我们使用 AWS 托管策略`AmazonKeyspacesFullAccess`，因为我们的应用程序将向您的 Amazon Keyspaces 表中写入数据。但是，作为最佳实践，建议创建实现最低权限原则的自定义访问策略。有关更多信息，请参阅 [Amazon Keyspaces 如何与 IAM 配合使用](security_iam_service-with-iam.md)。

      ```
      aws iam attach-role-policy --role-name my-iam-role --policy-arn=arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess
      ```

      使用以下语句确认策略已成功附加到 IAM 角色。

      ```
      aws iam list-attached-role-policies --role-name my-iam-role
      ```

      输出应如下所示：

      ```
      {
          "AttachedPolicies": [
              {
                  "PolicyName": "AmazonKeyspacesFullAccess",
                  "PolicyArn": "arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess"
              }
          ]
      }
      ```

   1. 使用服务账户可以代入的 IAM 角色的 Amazon 资源名称（ARN）为服务账户添加注释。确保使用您的账户 ID 更新角色 ARN。

      ```
      kubectl annotate serviceaccount -n my-eks-namespace my-eks-serviceaccount eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/my-iam-role
      ```

1. 确认 IAM 角色和服务账户均已正确配置。

   1. 使用以下语句确认 IAM 角色的信任策略已正确配置。

      ```
      aws iam get-role --role-name my-iam-role --query Role.AssumeRolePolicyDocument
      ```

      输出应如下所示：

      ```
      {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.us-east-1/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount"
                      }
                  }
              }
          ]
      }
      ```

   1. 确认已使用 IAM 角色为 Amazon EKS 服务账户添加注释。

      ```
      kubectl describe serviceaccount my-eks-serviceaccount -n my-eks-namespace
      ```

      输出应如下所示：

      ```
      Name: my-eks-serviceaccount 
      Namespace:my-eks-namespace
      Labels: <none>
      Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-iam-role 
      Image pull secrets: <none> 
      Mountable secrets: <none> 
      Tokens: <none> 
      [...]
      ```

创建 Amazon EKS 服务账户、IAM 角色并配置所需的关系和权限后，请继续[第 2 步：配置应用程序](EKS-tutorial-step2.md)。