ECS任务中调用AWS OpenSearch Serverless报403错误(Java客户端)
AWS OpenSearch Serverless ECS任务角色403 Forbidden问题排查与解决
问题背景
本地环境中,通过Java OpenSearchClient连接AWS OpenSearch Serverless集合可正常执行索引写入与查询,代码如下:
this.client = new OpenSearchClient( new AwsSdk2Transport( httpClient, collection, // serverless collection endpoint "aoss", // signing service name Region.US_WEST_2, // signing service region AwsSdk2TransportOptions.builder().build()));
本地使用.aws目录凭证或配置用户密钥均可正常调用,但部署到ECS任务后,使用指定的IAM角色develop-ecs-task-role调用时返回403 Forbidden。已配置OpenSearch数据访问控制策略,将该角色加入Principal,权限覆盖集合及索引的读写操作:
[ { "Rules": [ { "Resource": [ "collection/demo-test" ], "Permission": [ "aoss:CreateCollectionItems", "aoss:DeleteCollectionItems", "aoss:UpdateCollectionItems", "aoss:DescribeCollectionItems" ], "ResourceType": "collection" }, { "Resource": [ "index/demo-test/demo", "index/demo-test/develop" ], "Permission": [ "aoss:CreateIndex", "aoss:DeleteIndex", "aoss:UpdateIndex", "aoss:DescribeIndex", "aoss:ReadDocument", "aoss:WriteDocument" ], "ResourceType": "index" } ], "Principal": [ "arn:aws:iam::924347859631:user/someuser", "arn:aws:iam::924347859631:role/develop-ecs-task-role" ], "Description": "Easy data policy" } ]
使用someuser凭证可正常操作,但ECS任务角色触发403。
排查与解决步骤
1. 验证ECS任务角色的信任关系
确保任务角色的信任策略允许ECS服务扮演该角色,否则任务无法获取有效凭证:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2. 为任务角色添加IAM层面的OpenSearch Serverless权限
OpenSearch数据访问策略之外,任务角色需要IAM权限允许与OpenSearch Serverless交互,添加以下权限(可根据需求细化):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "aoss:APIAccessAll", "aoss:DescribeCollection" ], "Resource": "arn:aws:aoss:us-west-2:924347859631:collection/demo-test" } ] }
aoss:APIAccessAll是基础API访问权限,也可替换为具体操作权限如aoss:ReadDocument、aoss:WriteDocument等。
3. 确认ECS任务的凭证获取状态
在ECS任务中临时添加日志,打印当前使用的AWS凭证ARN,验证是否正确获取到develop-ecs-task-role的临时凭证(生产环境需移除该日志):
DefaultCredentialsProvider credentialsProvider = DefaultCredentialsProvider.create(); AwsCredentials credentials = credentialsProvider.resolveCredentials(); System.out.println("Current credential ARN: " + ((AwsSessionCredentials) credentials).getSourceArn());
4. 检查数据访问策略的正确性与生效延迟
- 确认策略中的资源路径(集合、索引名称)无拼写错误,与实际资源完全匹配。
- 数据访问策略可能存在1-5分钟的生效延迟,配置完成后等待一段时间再测试。
5. 验证Java客户端的签名配置
确保AwsSdk2Transport的服务名称"aoss"和区域Region.US_WEST_2与集合所在区域一致,客户端使用默认凭证链(ECS环境会自动加载任务角色凭证,无需手动配置密钥)。
内容的提问来源于stack exchange,提问作者Guillermo Gefaell
相关产品推荐
相关产品推荐

