# main.tf # ------------------------------------------------- # Enable OIDC Provider for EKS (IRSA) # ------------------------------------------------- data "tls_certificate" "eks" { url = data.aws_eks_cluster.this.identity[0].oidc[0].issuer } data "aws_iam_openid_connect_provider" "eks" { url = data.aws_eks_cluster.this.identity[0].oidc[0].issuer } # ------------------------------------------------- # IAM Role for EBS CSI Driver (IRSA) # ------------------------------------------------- resource "aws_iam_role" "ebs_csi_role" { name = "AmazonEKS_EBS_CSI_DriverRole-${var.ebs_csi_role_suffix}" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Federated = data.aws_iam_openid_connect_provider.eks.arn } Action = "sts:AssumeRoleWithWebIdentity" Condition = { StringEquals = { "${replace(data.aws_eks_cluster.this.identity[0].oidc[0].issuer, "https://", "")}:aud" = "sts.amazonaws.com" "${replace(data.aws_eks_cluster.this.identity[0].oidc[0].issuer, "https://", "")}:sub" = "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } }] }) } resource "aws_iam_role_policy_attachment" "ebs_csi_policy" { role = aws_iam_role.ebs_csi_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy" } # ------------------------------------------------- # Kubernetes ServiceAccount # ------------------------------------------------- resource "kubernetes_service_account_v1" "ebs_csi_sa" { metadata { name = "ebs-csi-controller-sa" namespace = "kube-system" annotations = { "eks.amazonaws.com/role-arn" = aws_iam_role.ebs_csi_role.arn } } depends_on = [aws_iam_role_policy_attachment.ebs_csi_policy] } # ------------------------------------------------- # Install AWS EBS CSI Driver via Helm # ------------------------------------------------- resource "helm_release" "ebs_csi_driver" { name = "aws-ebs-csi-driver" repository = "https://kubernetes-sigs.github.io/aws-ebs-csi-driver" chart = "aws-ebs-csi-driver" namespace = "kube-system" set { name = "controller.serviceAccount.create" value = "false" } set { name = "controller.serviceAccount.name" value = kubernetes_service_account_v1.ebs_csi_sa.metadata[0].name } depends_on = [kubernetes_service_account_v1.ebs_csi_sa] } resource "kubernetes_annotations" "gp2_default" { api_version = "storage.k8s.io/v1" kind = "StorageClass" metadata { name = "gp2" } annotations = { "storageclass.kubernetes.io/is-default-class" = "true" } }