我在 EKS 集群中运行 Spring Boot (2.6.6) 应用程序,该应用程序尝试通过承担 AWS 角色来对 AWS 进行身份验证。到目前为止我已经关注了这个doc。
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sts</artifactId>
<version>1.12.9</version>
</dependency>
</dependencies>
在我的应用程序 helm/k8s 设置中:
apiVersion: apps/v1
kind: Deployment
spec
template:
metadata:
...
spec:
serviceAccountName: myapp-service-account
securityContext:
fsGroup: 123456
initContainers:
...
服务帐户设置:
~ % kubectl get serviceaccounts -n dev
NAME SECRETS AGE
default 1 2y1d
myapp-service-account 1 7d2h
..
~ % kubectl get serviceaccounts/myapp-service-account -n dev -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account_id>:role/<aws_role_to_assume>
..
但我的应用程序似乎没有承担正确的角色:
2022-06-21 17:50:25.284 警告 [my-app,,] 1 --- [ main] s.AwsSecretsManagerPropertySourceLocator :无法从 /secret/my-app_dev 加载 AWS 密钥。用户:arn:aws:sts::
:假定角色/ 是 无权对资源执行:secretsmanager:GetSecretValue:/secret/my-app_dev,因为没有基于身份的策略允许执行 Secretsmanager:GetSecretValue 操作(服务:AWSSecretsManager;状态代码:400;错误代码:AccessDeniedException;请求 ID:1111111-2222 -33333-444444;代理:空)
在上面,我认为添加
serviceAccountName: myapp-service-account
将允许应用程序以某种方式获取新的 ServiceAccount,从而承担不同的角色。我在这里配置错误了什么?
编辑
环境变量:
~ % kubectl exec my-app-pod-1234-abcd -n dev -- env
...
JAVA_OPTS=
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_ROLE_ARN=arn:aws:iam::<aws_account_id>:role/<aws_role_to_assume>
...
您应该将角色分配给命名空间中的默认服务帐户: