在AWS EKS中通过Strimzi KafkaConnect访问S3 Bucket遇403权限错误
问题场景
在AWS EKS环境中通过Strimzi KafkaConnect访问S3 Bucket时,触发以下错误:
Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID:
已关联Strimzi服务账号,但访问S3时请求似乎使用的是节点级服务角色而非指定的IAM角色,需排查问题原因。
已配置的IAM策略
{ "Statement": [ { "Action": [ "s3:PutObject", "s3:ListBucket", "s3:GetObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::MY-Bucket/*", "arn:aws:s3:::MY-Bucket" ] } ], "Version": "2012-10-17" }
IAM角色信任关系
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<my-aws-account>:root" }, "Action": "sts:AssumeRole", "Condition": {} }, { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<my-aws-account>:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/<ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.us-west-2.amazonaws.com/id/<id>:sub": "system:serviceaccount:<namespace>:<KafkaConnect name>-connect", "oidc.eks.us-west-2.amazonaws.com/id/<id>:aud": "sts.amazonaws.com" } } } ] }
Kafka Connect配置
spec: template: serviceAccount: metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<my-aws-account>:role/<My role name>
注:服务账号名称为<KafkaConnect name>-connect,已附加上述注解和IAM角色。
排查步骤
- 验证OIDC提供商匹配度:确认EKS集群的OIDC提供商已正确创建,信任关系中的
FederatedARN需与集群OIDC提供商ARN完全一致,注意<ID>和<id>的大小写(OIDC ID区分大小写)。 - 检查ServiceAccount注解有效性:通过
kubectl describe serviceaccount <KafkaConnect name>-connect -n <namespace>命令,确认服务账号是否存在eks.amazonaws.com/role-arn注解,且ARN中的账号ID、角色名称无拼写错误。 - 核对信任关系Subject字段:确认信任关系中
sub字段格式为system:serviceaccount:<namespace>:<serviceaccount-name>,其中<namespace>和服务账号名称需与实际环境完全匹配。 - 检查Pod身份注入状态:进入Kafka Connect Pod执行
kubectl exec -it <kafka-connect-pod-name> -n <namespace> -- env | grep AWS,查看是否存在AWS_ROLE_ARN和AWS_WEB_IDENTITY_TOKEN_FILE环境变量,若缺失则说明EKS Pod Identity Webhook未正常工作。 - 排查IAM权限边界限制:检查目标IAM角色是否附加了权限边界,权限边界可能覆盖或限制了角色对S3的访问权限。
- 验证S3 Bucket策略:确认S3 Bucket本身无拒绝该IAM角色访问的策略(Bucket策略优先级高于IAM角色策略)。
- 模拟身份测试权限:使用
aws sts assume-role-with-web-identity命令模拟Pod身份获取临时凭证,再用该凭证尝试访问S3,验证权限是否正常。
内容的提问来源于stack exchange,提问作者Gurpreet Singh Sran
相关产品推荐
相关产品推荐

