如何使用 Terraform 将 AWS IAM 角色分配给服务帐户?
How to assign AWS IAM Role to Service Account with Terraform?
我在 AWS 上有一个 Kubernetes EKS 集群,我的目标是能够在我的 Spring 启动应用程序中查看特定的配置映射。
在我的本地环境中,一切正常,但是当我在 AWS 中使用此设置时,我进入禁止状态并且我的应用程序无法 运行。
我已经创建了一个服务帐户,但不知道如何创建可以分配所需 IAM 角色的 Terraform 脚本。
任何帮助将不胜感激。
这取决于几件事。
可以通过不同的方式向 Pods 提供 AWS IAM 角色,但现在推荐的方式是使用 IAM Roles for Service Accounts, IRSA。
根据您使用 Terraform 提供 Kubernetes 集群的方式,这也可以通过不同的方式完成。如果你用AWS EKS and provision the cluster using the Terraform AWS EKS module, then you should set enable_irsa到true
.
然后您需要为您的应用程序创建一个 IAM 角色 (Pods),并且您需要 return 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。
首先,我使用以下代码创建了必要的角色:
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>
我认为您在这里遗漏了一些东西..您应该按照此处所述在角色和 oidc 提供者之间添加信任关系:
我在 AWS 上有一个 Kubernetes EKS 集群,我的目标是能够在我的 Spring 启动应用程序中查看特定的配置映射。 在我的本地环境中,一切正常,但是当我在 AWS 中使用此设置时,我进入禁止状态并且我的应用程序无法 运行。 我已经创建了一个服务帐户,但不知道如何创建可以分配所需 IAM 角色的 Terraform 脚本。 任何帮助将不胜感激。
这取决于几件事。
可以通过不同的方式向 Pods 提供 AWS IAM 角色,但现在推荐的方式是使用 IAM Roles for Service Accounts, IRSA。
根据您使用 Terraform 提供 Kubernetes 集群的方式,这也可以通过不同的方式完成。如果你用AWS EKS and provision the cluster using the Terraform AWS EKS module, then you should set enable_irsa到true
.
然后您需要为您的应用程序创建一个 IAM 角色 (Pods),并且您需要 return 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。
首先,我使用以下代码创建了必要的角色:
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>
我认为您在这里遗漏了一些东西..您应该按照此处所述在角色和 oidc 提供者之间添加信任关系: