配置Thanos Sidecar向跨AWS账号S3写入遇权限拒绝问题咨询
跨AWS账号配置Thanos Sidecar写入S3存储桶的解决方案
可行性确认
完全可以实现跨AWS账号将Thanos Sidecar的监控数据写入目标账号的S3存储桶,核心是构建正确的跨账号IAM权限信任链,结合EKS的IRSA(IAM Roles for Service Accounts)实现Pod级别的权限控制。你遇到的Access-denied错误,90%以上是跨账号权限配置不完整导致的。
核心配置步骤
1. 目标账号(S3存储桶所在账号)配置桶策略
在目标账号的S3存储桶上添加桶策略,允许源EKS账号的IAM角色执行Thanos所需的S3操作。示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[源EKS账号ID]:role/[源账号中给Thanos用的IAM角色名]" }, "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:GetObjectVersion", "s3:DeleteObjectVersion" ], "Resource": [ "arn:aws:s3:::[目标存储桶名]", "arn:aws:s3:::[目标存储桶名]/*" ] } ] }
2. 源账号(EKS所在账号)配置IAM角色与IRSA
(1)创建IAM角色,赋予S3访问权限
创建一个IAM角色,权限策略需要包含对目标S3桶的操作权限,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:GetObjectVersion", "s3:DeleteObjectVersion" ], "Resource": [ "arn:aws:s3:::[目标存储桶名]", "arn:aws:s3:::[目标存储桶名]/*" ] } ] }
(2)配置角色信任策略,允许EKS ServiceAccount Assume该角色
修改上述IAM角色的信任关系,允许源EKS集群中Thanos Sidecar对应的ServiceAccount来扮演这个角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::[源EKS账号ID]:oidc-provider/[EKS集群OIDC端点]" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "[EKS集群OIDC端点]:sub": "system:serviceaccount:[Prometheus所在命名空间]:[Thanos Sidecar对应的ServiceAccount名]" } } } ] }
(3)绑定ServiceAccount与IAM角色
在EKS中,给Thanos Sidecar对应的ServiceAccount添加注解,关联上述IAM角色:
apiVersion: v1 kind: ServiceAccount metadata: name: thanos-sidecar namespace: monitoring annotations: eks.amazonaws.com/role-arn: arn:aws:iam::[源EKS账号ID]:role/[源账号中创建的IAM角色名]
3. 配置Prometheus Operator的Thanos Sidecar参数
通过Helm values.yaml配置Prometheus Operator,指定Thanos Sidecar的S3存储配置,指向目标账号的存储桶:
prometheus: thanosSidecar: enabled: true config: storage: type: S3 config: bucket: "[目标存储桶名]" endpoint: "s3.[目标存储桶区域].amazonaws.com" region: "[目标存储桶区域]" # 无需配置access_key和secret_key,IRSA会自动获取权限
常见排错要点
- 检查账号ID、角色ARN、存储桶名是否完全匹配,拼写错误是常见原因
- 验证源账号IAM角色的信任策略是否正确关联了EKS的OIDC提供商和对应的ServiceAccount
- 确认目标S3桶策略中的Principal是否为源账号的IAM角色ARN,而非用户ARN
- 使用
aws sts assume-role在本地模拟源角色访问目标桶,验证权限是否正常 - 查看Thanos Sidecar的Pod日志,确认错误细节(比如是列表桶权限不足还是写入权限不足)
内容的提问来源于stack exchange,提问作者Amit Raj
相关产品推荐
相关产品推荐

