経緯
fargateノードで動作するPodでロールが紐づけられたサービスアカウントを実行したいが、「これ!」という解決策の記事が見つかりにくかったのでメモ程度に書いています。
補足
eksctlは使用しません。
各用語・単語の説明はしません。
必要なリソース・手順
- OIDCが利用可能なeks on fargate(構築済みという前提)
- ロールの作成
- サービスアカウントの作成
- 環境変数の設定
- deployment等へのマウント追記(optional)
設定例
最小限の設定項目を記載しています。詳細はこちら.
ロールの作成
- k8s上のnamespaceは
my-ns
- サービスアカウント名は
my-sa
- ロール名は
my-role
aud, sub
についてはこちらを!
IAM および AWS STS の条件コンテキストキー.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.REGION.eks.amazonaws.com/CLUSTER_ID"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.REGION.eks.amazonaws.com/CLUSTER_ID:sub":
"system:serviceaccount:my-ns:my-sa",
"oidc.REGION.eks.amazonaws.com/CLUSTER_ID:aud": "sts.amazonaws.com"
}
}
}
]
}
サービスアカウントの作成
ここまででサービスアカウントとIAMロールの関係が認識されますが、このままではPodがロールを引き受けられません。
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa
namespace: my-ns
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::111122223333:role/my-role"
環境変数の設定
configMapなどで環境変数を用意します。
- 名前は
my-cm
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cm
data:
AWS_REGION: ap-northeast-1
AWS_ROLE_ARN: "arn:aws:iam::111122223333:role/my-role"
deployment等へのマウント追記 (optinal)
deploymentを前提に書いています。
マウントポイントに注意してください。
# spec.template.spec.containers
volumeMounts:
- mountPath: "/var/run/secrets/eks.amazonaws.com/serviceaccount/"
name: aws-token
# spec.template.spec
volumes:
- name: aws-token
projected:
sources:
- serviceAccountToken:
audience: "sts.amazonaws.com"
expirationSeconds: 86400
path: token
確認方法
CloudTrailのログでAssumeRoleWithWebIdentity
のアクションの結果が成功になっていたら適切にサービスアカウントがロールを引き受けていることがわかります。
参考
こちらは図があってわかりやすいです。
AWS EKSのIAM Roles for Service Accountsの仕組みを完全に理解する記事。
Amazon EKS Pod Identity Webhook
IAM ロールを引き受けるための Kubernetes サービスアカウントの設定
IAM および AWS STS の条件コンテキストキー