第 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 提供商以及如何创建它们的更多信息,请参阅 A ma zon EKS 用户指南中的为您的集群创建 IAM OIDC 提供商

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

      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 中运行的进程提供身份。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. 使用以下命令my-eks-serviceaccount在 Amazon EKS 集群my-eks-namespace的命名空间中创建一个名称为的服务账户。

      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 返回给命令的 ARN。list-open-id-connect-providersARN 包含您的账号和地区。

      • 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 角色,请参阅 A mazon EKS 用户指南中的跨账户 IAM 权限

  3. 创建一个名为 Amazon EKS 服务账户my-iam-role的 IAM 角色,该角色的名称将由该账户代替。将上一步中创建的信任策略文件附加到该角色。信任策略指定了 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. 确认 Amazon EKS 服务账户已使用 IAM 角色进行注释。

      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:配置应用程序