第 1 步:配置 Amazon EKS 集群并设置 IAM 权限 - Amazon Keyspaces(Apache Cassandra 兼容)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

第 1 步:配置 Amazon EKS 集群并设置 IAM 权限

配置 Amazon EKS 集群并创建允许 Amazon EKS 服务账户连接到 Amazon Keyspaces 表所需的 IAM 资源
  1. 为 Amazon EKS 集群创建 Open ID Connect(OIDC)身份提供者。需要执行此操作才能将 IAM 角色用于服务账户。有关 OIDC 身份提供者以及如何创建它们的更多信息,请参阅《Amazon EKS 用户指南》中的为集群创建 IAM OIDC 提供商

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

      eksctl utils associate-iam-oidc-provider --cluster my-eks-cluster --approve
    2. 使用以下命令,确认 OIDC 身份提供者已在 IAM 中注册。

      aws iam list-open-id-connect-providers --region aws-region

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

      { "OpenIDConnectProviderList": [ .. { "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.aws-region.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" } ] }
  2. 为 Amazon EKS 集群创建服务账户。服务账户为在容器组(pod)中运行的进程提供身份。容器组是最小、最简单的 Kubernetes 对象,可以用来部署容器化应用程序。接下来,创建一个 IAM 角色,服务账户可代入该角色来获取资源权限。您可以从 Pod 访问任何 Amazon 服务,该服务账号已配置为使用服务账号,该账号可以代入具有该服务访问权限的 IAM 角色。

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

      kubectl create namespace my-eks-namespace
    2. 要使用自定义命名空间,必须将其与 Fargate 配置文件关联。下面是一个代码示例。

      eksctl create fargateprofile \ --cluster my-eks-cluster \ --name my-fargate-profile \ --namespace my-eks-namespace \ --labels *=*
    3. 使用以下命令在 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
    4. 运行以下命令来创建信任策略文件,指示 IAM 角色信任您的服务账户。主体必须先建立这种信任关系,然后才能代入角色。需要对文件进行以下编辑:

      • 对于 Principal,输入 IAM 返回给 list-open-id-connect-providers 命令的 ARN。ARN 包含您的账号和区域。

      • condition语句中,替换 Amazon Web Services 区域 和 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.aws-region.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.aws-region.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount", "oidc.eks.aws-region.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] } EOF

      可选:您还可以在 StringEqualsStringLike 条件中添加多个条目,以允许多个服务账户或命名空间代入角色。要允许您的服务账户在其他 Amazon 账户中代入 IAM 角色,请参阅《Amazon EKS 用户指南》中的跨账户 IAM 权限

  3. 创建一个名为 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"
  4. 通过附加访问策略向 IAM 角色分配 Amazon Keyspaces 权限。

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

      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" } ] }
    2. 使用服务账户可以代入的 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
  5. 确认 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.aws-region.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.aws-region/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.aws-region.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount" } } } ] }
    2. 确认已使用 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 步:配置应用程序