IRSAの適用
クラスター内でサービスアカウント用のIAMロールを使用するには、IAM OIDC Identity Providerを作成してクラスターに関連付ける必要があります。OIDCはすでにプロビジョニングされ、EKSクラスターに関連付けられています:
{"OpenIDConnectProviderList": [
{"Arn": "arn:aws:iam::1234567890:oidc-provider/oidc.eks.us-east-2.amazonaws.com/id/7185F12D2B62B8DA97B0ECA713F66C86"
}
]
}
Amazon EKSクラスターとの関連付けを確認します。
{ "oidc": {"issuer": "https://oidc.eks.us-west-2.amazonaws.com/id/7185F12D2B62B8DA97B0ECA713F66C86"
}
}
cartsサービスがDynamoDBテーブルの読み書きに必要な権限を提供するIAMロールはすでに作成されています。以下のようにポリシーを確認できます:
{"Statement": [
{"Action": "dynamodb:*",
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:us-west-2:1234567890:table/eks-workshop-carts",
"arn:aws:dynamodb:us-west-2:1234567890:table/eks-workshop-carts/index/*"
],
"Sid": "AllAPIActionsOnCart"
}
],
"Version": "2012-10-17"
}
また、このロールには適切な信頼関係が設定されており、EKSクラスターに関連付けられたOIDCプロバイダーがこのロールを引き受けることができるようになっています(ただし、サブジェクトがcartsコンポーネントのServiceAccountである場合に限ります)。以下のように確認できます:
{"Version": "2012-10-17",
"Statement": [
{"Sid": "",
"Effect": "Allow",
"Principal": {"Federated": "arn:aws:iam::1234567890:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/22E1209C76AE64F8F612F8E703E5BBD7"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": { "StringEquals": {"oidc.eks.us-west-2.amazonaws.com/id/22E1209C76AE64F8F612F8E703E5BBD7:sub": "system:serviceaccount:carts:carts"
}
}
}
]
}
あとは、cartsアプリケーションに関連付けられているService Accountオブジェクトに必要なアノテーションを追加して再設定するだけです。これにより、IRSAが上記のIAMロールを使用するPodに正しい認可を提供できるようになります。
まず、carts DeploymentにどのSAが関連付けられているかを確認しましょう。
Service Account: cart
次に、Service Accountアノテーション用のIAMロールのARNを提供するCARTS_IAM_ROLEの値を確認します。
arn:aws:iam::1234567890:role/eks-workshop-carts-dynamo
使用するIAMロールを確認したら、Kustomizeを実行してService Accountの変更を適用できます。
これにより、サービスアカウントが次のように変更されます:
- Kustomize Patch
- ServiceAccount/carts
- Diff
apiVersion: v1
kind: ServiceAccount
metadata:
name: carts
namespace: carts
annotations:
eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}
name: carts
namespace: carts
apiVersion: v1
kind: ServiceAccount
metadata:
+ annotations:
+ eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}
name: carts
namespace: carts
Service Accountにアノテーションが付けられたかを確認します。
Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::1234567890:role/eks-workshop-carts-dynamo
ServiceAccountを更新したので、cartsPodをリサイクルして変更を反映させます:
deployment.apps/carts restarted
Waiting for deployment "carts" rollout to finish: 1 old replicas are pending termination...
deployment "carts" successfully rolled out