Elasticsearch S3快照仓库无法访问S3桶:Access Denied问题求助
1. 修复S3桶策略中的ARN格式错误
你的S3桶策略中Principal的ARN存在格式错误:
"AWS": "arn:aws:iam::<account-id>role/elastic-dev"
缺少了<account-id>和role之间的冒号,正确的ARN应该是:
"AWS": "arn:aws:iam::<account-id>:role/elastic-dev"
这个格式错误会导致桶策略无法正确识别目标IAM角色,直接引发Access Denied。
2. 验证Java版本兼容性
Elasticsearch 7.17.x官方仅支持Java 8和Java 11,你当前使用的Java 20超出兼容范围,可能导致AWS SDK与ES插件之间出现兼容性问题,进而影响STS凭证获取或S3请求签名。建议切换到Java 11(推荐)或Java 8。
3. 确认服务账号的IAM角色关联配置
确保Elasticsearch的服务账号(elasticsearch-data、elasticsearch-master)已正确添加标注,键名必须是eks.amazonaws.com/role-arn,值为你的IAM角色ARN:
apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/elastic-dev name: elasticsearch-data namespace: default
添加后需要重启Elasticsearch Pod,让新的身份凭证生效。
4. 验证IAM角色的权限策略
除了桶策略,确保elastic-dev IAM角色本身附加了包含S3权限的策略(桶策略是资源授权,角色策略是身份授权,两者配合生效),示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:PutObject", "s3:DeleteObject", "s3:ListBucketMultipartUploads", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::elastic-storage-backup-dev", "arn:aws:s3:::elastic-storage-backup-dev/*" ] } ] }
5. 检查Elasticsearch节点的凭证获取能力
在Elasticsearch主节点Pod中执行以下命令,验证是否能正确获取IAM角色凭证:
aws sts get-caller-identity
如果返回的Arn不是arn:aws:iam::<account-id>:role/elastic-dev,说明服务账号与IAM角色的关联未生效,需要检查OIDC提供商配置、信任关系中的sub值是否与服务账号完全匹配。
6. 调整S3仓库配置(可选)
在创建S3仓库时,显式指定IAM角色ARN,帮助ES插件明确使用的身份:
curl -X PUT "http://localhost:9200/_snapshot/elasticsearch-data-backup" -H 'Content-Type: application/json' -u 'user:password' -k -d' { "type": "s3", "settings": { "bucket": "elastic-storage-backup-dev", "endpoint": "s3.eu-west-3.amazonaws.com", "protocol": "https", "compress": true, "chunk_size": "100mb", "server_side_encryption": true, "role_arn": "arn:aws:iam::<account-id>:role/elastic-dev" } }'
7. 确认插件安装完整性
确保所有Elasticsearch节点(主节点+数据节点)都安装了repository-s3插件,执行以下命令检查:
curl -X GET "http://localhost:9200/_cat/plugins?v" -u 'user:password' -k
如果有节点未安装插件,会导致仓库验证失败。
内容的提问来源于stack exchange,提问作者Y.hadj.younes

