1. はじめに

EKS クラスターを作成したのはいいが、kubectl で Kubernetes API をコールした際、アクセス権限のエラーが出力されたということはありませんか。

よくある理由としては、デフォルト設定では、 Kubernetes API のコールは、クラスターを作成した IAM ユーザーや IAM ロールに限られます。

クラスターは、Terraform 等でクラスター作成され、Terraform 用 IAM ユーザーが利用されることが多いとおもいます。

そのため、自分自身のIAM ユーザーで Kubernetes API をコールしても、Kubernetes API にアクセスする権限が与えられていないため、Kubernetes API を呼び出すことができないのです。

こういった際にKubernetes API をコールする必要がある IAM ユーザーやロールにアクセス権限を与えるために利用されるのが、Access Entry です。

本記事では、Access Entry の説明や設定例について記述してゆきます。

2. Access Entry とは?

Access Entry とは、Kubernetes内部の設定ファイル(aws-auth ConfigMap)を触ることなく、AWS側(IAM)だけでEKSクラスターのアクセス権限を一元管理できる機能です。

2.1. クラスターの認証モード(Authentication Mode)

Access Entry を利用するにあたり、EKSクラスターには「認証モード」という設定が用意されています。これにより、従来の権限管理から新しい Access Entry へどのように移行するかを制御できます。

認証モード 概要 補足・ユースケース
CONFIG_MAP 従来の方式です。aws-auth ConfigMap のみを使用して権限を管理します。 互換性のために残されていますが、現在は非推奨です。
API_AND_CONFIG_MAP Access Entry(API)と aws-auth ConfigMap の両方を評価します。 既存のクラスターから新しい方式へ安全に移行したい場合に最適です。
API aws-auth ConfigMap を完全に無視し、Access Entry のみで権限を管理します。 新規クラスターにおけるベストプラクティスです。

2.2. Access Entryの必要性

Access Entry 以前は、aws-auth ConfigMap という機能で認証が利用されていましたが、現在は非推奨となっています。

aws-auth では、いくつかの運用上の問題がありました。

  • aws-auth ConfigMapの問題点
    • aws-auth ConfigMapは、設定の誤りや誤削除によって、管理者を含む全員がクラスターから完全に締め出されるリスクがある
    • クラスター作成者のクラスター管理者権限を削除することができない

Access Entry では、Kubernetesの内部を触ることなくAWS API経由で安全かつシンプルにアクセス権限を管理できるため、これらの問題がすべて解決されています。

3. 設定例(Terraform)

実際に Terraform を使用して、特定の IAM ユーザーやルートアカウント、踏み台サーバー(Bastion)用の IAM ロールにクラスターの管理者権限を付与する設定例です。

# 1. 開発用・管理用のIAMユーザー(例: terraformユーザー)への権限付与
resource "aws_eks_access_entry" "console_user" {
  cluster_name  = module.eks.cluster_name
  principal_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:user/terraform"
  type          = "STANDARD"
}

resource "aws_eks_access_policy_association" "console_user_admin" {
  cluster_name  = module.eks.cluster_name
  policy_arn    = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy"
  principal_arn = aws_eks_access_entry.console_user.principal_arn

  access_scope {
    type = "cluster"
  }
}

# 2. ルートアカウントへの権限付与(エマージェンシー用)
resource "aws_eks_access_entry" "root_user" {
  cluster_name  = module.eks.cluster_name
  principal_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
  type          = "STANDARD"
}

resource "aws_eks_access_policy_association" "root_user_admin" {
  cluster_name  = module.eks.cluster_name
  policy_arn    = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy"
  principal_arn = aws_eks_access_entry.root_user.principal_arn

  access_scope {
    type = "cluster"
  }
}

# 3. 踏み台サーバー(Bastion)のIAMロールへの権限付与
resource "aws_eks_access_entry" "bastion" {
  cluster_name  = module.eks.cluster_name
  principal_arn = var.bastion_iam_role_arn
  type          = "STANDARD"
  
  # クラスターが作成された後に実行されるよう制御
  depends_on = [module.eks]
}

resource "aws_eks_access_policy_association" "bastion_admin" {
  cluster_name  = module.eks.cluster_name
  policy_arn    = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy"
  principal_arn = var.bastion_iam_role_arn

  access_scope {
    type = "cluster"
  }

  # Access Entryが作成された後にポリシーを紐付ける
  depends_on = [aws_eks_access_entry.bastion]
}

このように Terraform でEKS クラスターと 必要なIAM ユーザーと IAM ロールだけを簡潔にマッピングすることができます。

※ ここでは、AmazonEKSClusterAdminPolicy をロールに割り当てていますが、実運用する際は、最小権限で権限付与することをおすすめします。

4. おわりに

今回は Amazon EKS の Access Entry について、その概要と Terraform での設定例を紹介しました。

これまでの aws-auth ConfigMap 運用上の問題でAccess Entry の登場によって改善されました。

Kubernetes の内部リソース(ConfigMap)に触れることなく、IAMだけで権限を一元管理できるのは、運用面で楽になるはずです。

これから新しく EKS クラスターを構築する際は、ぜひ認証モードを API に設定し、Access Entry を利用してみることをおすすめします。

5. 参考

EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する

アクセスエントリを作成する

IAM ユーザーおよびロールに Kubernetes API へのアクセスを付与する

Amazon EKSのアクセス管理をAccess Entryでシンプルにする