Closed5
IRSA,PodIdentityをterraform moduleで使う

【事前準備】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
}

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
}
}
}

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"
}
}

終わり
serviceaccountのnameとnamespaceを外部からinputするようにすれば、serviceaccountの作成も自動化できるはず
このスクラップは2ヶ月前にクローズされました