Closed5

IRSA,PodIdentityをterraform moduleで使う

not75743not75743

【事前準備】Kubernetesアクセス許可設定

ローカル、github actionsのterraformでk8sリソースを作成できるようにする

data "aws_eks_cluster" "cluster" {
  name = aws_eks_cluster.main.name
}

data "aws_eks_cluster_auth" "cluster" {
  name = aws_eks_cluster.main.name
}

# terraformから接続するためのKubernetesプロバイダーの設定
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.cluster.token
}
not75743not75743

IRSA

  • default namespaceのs3-public-readのSA経由でs3バケットをリストできるようにした
  • serviceaccountは作ってくれないため、モジュール外で定義する必要あり
  • カスタムIAMポリシーも作ってくれないっぽいので、モジュール外で定義する必要あり
resource "aws_iam_policy" "s3_bucket_read" {
  name = "s3-bucket-read"
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "s3:ListAllMyBuckets",
        ]
        Resource = ["arn:aws:s3:::*"]
      }
    ]
  })
}

module "s3_bucket_read" {
  source    = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
  version   = "5.59.0"
  role_name = "s3-bucket-read"

  role_policy_arns = {
    s3_custom = aws_iam_policy.s3_bucket_read.arn
  }

  oidc_providers = {
    one = {
      provider_arn               = aws_iam_openid_connect_provider.main.arn
      namespace_service_accounts = ["default:s3-bucket-read"]
    }
  }
}

resource "kubernetes_service_account" "s3_bucket_read" {
  metadata {
    name      = "s3-bucket-read"
    namespace = "default"
    annotations = {
      "eks.amazonaws.com/role-arn" = module.s3_bucket_read.iam_role_arn
    }
  }
}
not75743not75743

PodIdentity

  • IRSAより簡潔に書ける
  • serviceaccountは作ってくれないため、モジュール外で定義する必要あり
  • カスタムIAMポリシーはモジュール内で定義できる
module "s3_bucket_read" {
  source  = "terraform-aws-modules/eks-pod-identity/aws"
  version = "1.12.1"

  name = "s3-bucket-read"

  attach_custom_policy = true
  policy_statements = [
    {
      effect    = "Allow"
      actions   = ["s3:ListAllMyBuckets"]
      resources = ["arn:aws:s3:::*"]
    }
  ]

  associations = {
    one = {
      cluster_name    = aws_eks_cluster.main.name
      namespace       = "default"
      service_account = "s3-bucket-read"
    }
  }
}

resource "kubernetes_service_account" "s3_bucket_read" {
  metadata {
    name      = "s3-bucket-read"
    namespace = "default"
  }
}
not75743not75743

終わり
serviceaccountのnameとnamespaceを外部からinputするようにすれば、serviceaccountの作成も自動化できるはず

このスクラップは2ヶ月前にクローズされました