DEV Community

leroykayanda
leroykayanda

Posted on

Create EKS Service Account in terraform

Set up the IAM role like so

resource "aws_iam_role" "role" {
  name = "${var.env}-${var.service}"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRoleWithWebIdentity"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Federated = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:oidc-provider/${local.eks_oidc_issuer}"
        }
      },
    ]
  })
}

resource "aws_iam_policy" "policy" {
  name = "${var.env}-${var.service}"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "s3:PutObject",
          "s3:ListBucket",
          "s3:GetObject",
          "s3:DeleteObject"
        ]
        Effect   = "Allow"
        Resource = "*"
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "attachment" {
  role       = aws_iam_role.role.name
  policy_arn = aws_iam_policy.policy.arn
}
Enter fullscreen mode Exit fullscreen mode

create the service account

resource "kubernetes_service_account" "this" {
  metadata {
    name      = var.service
    namespace = var.service
    annotations = {
      "eks.amazonaws.com/role-arn" = aws_iam_role.role.arn
    }
  }
  automount_service_account_token = true
}
Enter fullscreen mode Exit fullscreen mode

data.tf

data "aws_eks_cluster" "cluster" {
  name = "${var.cluster_env}-${var.cluster_name}"
}

data "aws_eks_cluster_auth" "auth" {
  name = "${var.cluster_env}-${var.cluster_name}"
}

data "aws_caller_identity" "current" {}

data "aws_eks_cluster" "cluster" {
  name = "${var.cluster_env}-${var.cluster_name}"
}
Enter fullscreen mode Exit fullscreen mode

locals.tf

locals {
  eks_oidc_issuer = trimprefix(data.aws_eks_cluster.cluster.identity[0].oidc[0].issuer, "https://")
}
Enter fullscreen mode Exit fullscreen mode

providers.tf

provider "kubernetes" {
  host                   = data.aws_eks_cluster.cluster.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority[0].data)
  token                  = data.aws_eks_cluster_auth.auth.token
}
Enter fullscreen mode Exit fullscreen mode

Configure the app to use the service account

apiVersion: apps/v1
kind: Deployment
metadata:
  name: references
  namespace: references
  labels:
    app: references
spec:
  replicas: 1
  selector:
    matchLabels:
      app: references
  template:
    metadata:
      labels:
        app: references
    spec:
      serviceAccountName: references
      containers:
        - name: references
          image: nginx
          ports:
            - containerPort: 8501
Enter fullscreen mode Exit fullscreen mode

Top comments (0)