我目前正在使用EKSCTL配置我的EKS集群,我想使用Terraform来配置集群。我正在使用Terraform EKS模块来创建集群。我已经使用EKSCTL创建了以下命令的身份映射
eksctl create iamidentitymapping -- region us-east-1 --cluster stage-cluster --arn arn:aws:iam::111222333444:role/developer --username dev-service
我想将这个命令转换为Terraform,但这不是的最佳方式
resource "null_resource" "eks-identity-mapping" {
depends_on = [
module.eks,
aws_iam_policy_attachment.eks-policy-attachment
]
provisioner "local-exec" {
command = <<EOF
eksctl create iamidentitymapping
--cluster ${var.eks_cluster_name}
--arn ${data.aws_iam_role.mwaa_role.arn}
--username ${var.mwaa_username}
--profile ${var.aws_profile}
--region ${var.mwaa_aws_region}
EOF
}
}
我如何使用Kubernetes提供商来实现这个
我还没有找到这个特定命令的明确匹配,但您可以通过在kubernetes中设置aws-auth
配置映射,一次性添加所有用户/角色及其访问权限来实现类似的功能。
例如,我们使用以下内容来提供集群的管理员列表:
resource "kubernetes_config_map" "aws_auth" {
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = {
mapRoles = <<CONFIGMAPAWSAUTH
- rolearn: ${var.k8s-node-iam-arn}
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
- rolearn: arn:aws:iam::111222333444:role/developer
username: dev-service
groups:
- system:masters
CONFIGMAPAWSAUTH
}
}
请注意,该文件包含所有角色映射,因此应确保var.k8s-node-iam-arn
设置为集群的超级用户,否则可能会被锁定。此外,您还必须设置这些角色将获得的访问权限。
您还可以添加特定的IAM用户,而不是角色:
- userarn: arn:aws:iam::1234:user/user.first
username: user.first
groups:
- system:masters
您可以直接在eks模块中执行此操作。您创建要添加的角色列表,例如:
locals {
aws_auth_roles = [
{
rolearn = ${data.aws_iam_role.mwaa_role.arn}
username = ${var.mwaa_username}
groups = [
"system:masters"
]
},
]
}
然后在模块中添加:
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "19.5.1"
[...]
# aws-auth configmap
manage_aws_auth_configmap = true
aws_auth_roles = local.aws_auth_roles
[...]
}
注:在";terraform aws模块/eks/aws";(14,17(为map_users
和map_roles
,19为manage_aws_auth_configmap
和aws_auth_users
,aws_auth_roles
。请参阅此处的文档:https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/19.7.0#input_manage_aws_auth_configmap
更新:为了使其工作并且不会出现类似Error: The configmap "aws-auth" does not exist
的错误,您还需要添加以下身份验证部分:
data "aws_eks_cluster_auth" "default" {
name = local.cluster_name
}
provider "kubernetes" {
host = module.eks.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
token = data.aws_eks_cluster_auth.default.token
}