You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:25:20