Closed5

EKSのIRSAを理解する

not75743not75743

各コンポーネントの役割

↑チュートリアルのワークフロー図がわかりやすい

OIDCプロバイダ

管轄:AWS
役割:EKSクラスタとIAMロール間の認証を橋渡しする(とてもざっくり)

サービスアカウント

管轄:k8s(EKS)
役割:Kubernetesポッドやリソースに特定のIAMロールを紐付ける

IAMロール

管轄:AWS
役割:AWSリソースに対するアクセス権限を提供する

not75743not75743

なぜIRSAが必要?

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/iam-roles-for-service-accounts.html

最小特権 – IAM アクセス許可の範囲をサービスアカウントに設定すると、そのサービスアカウントを使用する Pods のみにそのアクセス許可を付与できます。また、この機能により、kiam や kube2iam などのサードパーティーのソリューションが不要になります。

認証情報の分離 – Pod's のコンテナは、そのコンテナが使用するサービスアカウントに関連付けられた IAM ロールの認証情報のみを取得できます。コンテナは、他の Pods のコンテナで使われている認証情報にアクセスすることはできません。サービスアカウントの IAM ロールを使用する場合、Pod's コンテナには Amazon EKS ノード IAM ロール に割り当てられたアクセス許可も付与されます (Amazon EC2 インスタンスメタデータサービス (IMDS) への Pod のアクセスをブロックしていない場合)。詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

監査性 - 遡及的な監査を確実に行うため、AWS CloudTrail を介してアクセスとイベントのロギングを利用できます。

ノードレベルの認証情報(IAMロール)では不必要な権限を与えてしまう可能性があるため

not75743not75743

terraformで試す

terraform側

IRSA terraform
resource "aws_iam_openid_connect_provider" "main" {
  url             = var.eks_issuer
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = ["testtesttesttesttesttesttesttesttesttest"]
}

resource "aws_iam_role" "main" {
  name = "s3-test-terraform"

  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect = "Allow",
        Principal = {
          Federated = aws_iam_openid_connect_provider.main.arn
        },
        Action = "sts:AssumeRoleWithWebIdentity",
        Condition = {
          StringEquals = {
            "${aws_iam_openid_connect_provider.main.url}:aud" = "sts.amazonaws.com",
            "${aws_iam_openid_connect_provider.main.url}:sub" = "system:serviceaccount:default:s3-test-terraform"
          }
        }
      }
    ]
  })
}

resource "aws_iam_policy" "main" {
  name        = "s3-test-terraform"
  description = "Example policy for IRSA"
  policy      = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect   = "Allow",
        Action   = "s3:*",
        Resource = "*"
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "main" {
  role       = aws_iam_role.main.name
  policy_arn = aws_iam_policy.main.arn
}

k8s(EKS)側

irsa-test.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: s3-test-terraform
  namespace: default
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::xxxx:role/s3-test-terraform

---

apiVersion: v1
kind: Pod
metadata:
  name: eks-iam-test3
  namespace: default
spec:
  serviceAccountName: s3-test-terraform
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      command: ['aws', 's3', 'ls']
  restartPolicy: Never

実行

s3バケット一覧が出力されればOK

❯ k apply -f irsa-test.yaml 
serviceaccount/s3-test-terraform created
pod/eks-iam-test3 created

❯ k logs -f eks-iam-test3
このスクラップは5ヶ月前にクローズされました