【问题标题】:How to assign AWS IAM Role to Service Account with Terraform?如何使用 Terraform 将 AWS IAM 角色分配给服务账户?
【发布时间】:2021-01-22 12:46:14
【问题描述】:

我在 AWS 上有一个 Kubernetes EKS 集群,我的目标是能够在我的 Spring Boot 应用程序中查看特定的配置映射。 在我的本地环境中,一切正常,但是当我在 AWS 中使用此设置时,我进入禁止状态并且我的应用程序无法运行。 我创建了一个服务帐户,但不明白如何创建可以分配所需 IAM 角色的 Terraform 脚本。 任何帮助将不胜感激。

【问题讨论】:

    标签: amazon-web-services kubernetes terraform amazon-iam amazon-eks


    【解决方案1】:

    这取决于几件事。

    可以通过不同方式向 Pod 提供 AWS IAM 角色,但现在推荐的方式是使用 IAM Roles for Service Accounts, IRSA

    根据您使用 Terraform 配置 Kubernetes 集群的方式,这也以不同的方式完成。如果您使用AWS EKS 并使用Terraform AWS EKS module 配置集群,则应将enable_irsa 设置为true

    然后,您需要为您的应用程序(Pod)创建一个 IAM 角色,并且您需要返回 IAM 角色的 ARN。这可以使用aws_iam_role 资源来完成。

    您需要为您的 pod 创建一个 Kubernetes ServiceAccount,它可以使用 Terraform 创建,但许多人希望将 Yaml 用于 Kubernetes 资源。 ServiceAccount 需要使用 IAM 角色 ARN 进行注释,例如:

    annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::14xxx84:role/my-iam-role
    

    请参阅EKS workshop for IAM Roles for Service Accounts 课程以获取相关指南。但是,它不使用 Terraform。

    【讨论】:

      【解决方案2】:

      首先我使用以下代码创建了必要的角色:

      data "aws_iam_policy_document" "eks_pods" {
        statement {
          actions = ["sts:AssumeRoleWithWebIdentity"]
          effect  = "Allow"
      
          condition {
            test     = "StringEquals"
            variable = "${replace(aws_iam_openid_connect_provider.eks.url, "https://", "")}:sub"
            values   = ["system:serviceaccount:kube-system:aws-node"]
          }
      
          principals {
            identifiers = [aws_iam_openid_connect_provider.eks.arn]
            type        = "Federated"
          }
        }
      }
      
      # create a role that can be attached to pods.
      resource "aws_iam_role" "eks_pods" {
        assume_role_policy = data.aws_iam_policy_document.eks_pods.json
        name               = "eks-pods-iam-role01"
      
        depends_on = [aws_iam_openid_connect_provider.eks]
      }
      
      resource "aws_iam_role_policy_attachment" "aws_pods" {
        role       = aws_iam_role.eks_pods.name
        policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
        depends_on = [aws_iam_role.eks_pods]
      }
      

      然后我使用以下命令将创建的角色附加到服务帐户。我还没有在 terraform 中找到任何方法:

      kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/role-arn=arn:aws:iam::<your_account>:role/eks-pods-iam-role01
      

      然后您可以验证您的服务帐户,它应该会显示新的注释。

      kubectl describe sa aws-node -n kube-system
      Name:                aws-node
      Namespace:           kube-system
      Labels:              <none>
      Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::<ur_account>:role/eks-pods-iam-role01
      Image pull secrets:  <none>
      Mountable secrets:   aws-node-token-xxxxx
      Tokens:              aws-node-token-xxxxx
      Events:              <none>
      

      【讨论】:

        【解决方案3】:

        我认为您在这里遗漏了一些东西..您应该在角色和 oidc 提供者之间添加信任关系,如下所述:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-10
          • 2017-03-16
          • 2021-02-03
          • 2018-06-13
          • 2018-11-10
          • 2018-08-20
          • 1970-01-01
          • 2022-11-27
          相关资源
          最近更新 更多