问题 使用Apache HttpComponents Client签署AWS HTTP请求


我正在尝试向HTTP发出HTTP请求 AWS Elasticsearch 受IAM访问策略保护的域。我需要 标志 这些请求由AWS授权。 我在用着 笑话,反过来使用 Apache HttpComponents客户端

这似乎是一个常见的用例,我想知道是否有某种类型的库,我可以在Apache HttpComponents客户端上使用它来签署所有请求。


4763
2017-11-17 14:59


起源



答案:


我想我找到了! :)

这个项目似乎完全符合我的要求: AWS签名请求拦截, 被形容为 “请求用于签署AWS请求的Apache Client的拦截器。最初是为了使用Jest客户端支持AWS的Elasticsearch Service而创建的。”

编辑:我 分叉项目 为了满足我的需求(Java 7,临时STS凭证),它运行良好。

以下是使用示例(此处没有STS临时凭证):

String region = "us-east-1";
String service = "es";
String url = "???"; // put the AWS ElasticSearch endpoint here

DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, region, service, () -> new LocalDateTime(DateTimeZone.UTC));

JestClientFactory factory = new JestClientFactory() {
    @Override
    protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
        builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
        return builder;
    }
};
factory.setHttpClientConfig(new HttpClientConfig.Builder(url)
        .multiThreaded(true)
        .build());
JestClient client = factory.getObject();

12
2017-11-17 17:08



是的,它也适合我:) - panipsilos
嗨Eric我正在关注您提供的github链接。我们正面临着禁止的错误。另一个问题是在普通的jest客户端我们传递弹性搜索端点。但在这里,我们只传递服务名称和地区。您能否提供示例代码或指导来解决我们的问题。 - Mohan Shanmugam
嗨@MohanShanmugam。禁止的错误可能是由于访问策略配置错误或凭据错误造成的。我在答案中添加了一个用法示例。希望这可以帮助。 - Eric Citaire
嗨Eric感谢您的回复。我们使用jestclient创建索引,在此索引创建和删除索引中放置映射和插入记录都正常工作。放置映射和插入记录显示禁止错误。当我通过所有社区成员的讨论时,看起来很奇怪。我们使用的是jest 2.0.0和AWS Es 2.3。你有任何线索为什么把映射和插入记录不起作用。 - Mohan Shanmugam
我们正在从AWS lambda运行此程序。 lambda角色具有Es完全权限。我们在弹性搜索策略中使用了此角色ARN。 - Mohan Shanmugam


答案:


我想我找到了! :)

这个项目似乎完全符合我的要求: AWS签名请求拦截, 被形容为 “请求用于签署AWS请求的Apache Client的拦截器。最初是为了使用Jest客户端支持AWS的Elasticsearch Service而创建的。”

编辑:我 分叉项目 为了满足我的需求(Java 7,临时STS凭证),它运行良好。

以下是使用示例(此处没有STS临时凭证):

String region = "us-east-1";
String service = "es";
String url = "???"; // put the AWS ElasticSearch endpoint here

DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, region, service, () -> new LocalDateTime(DateTimeZone.UTC));

JestClientFactory factory = new JestClientFactory() {
    @Override
    protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
        builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
        return builder;
    }
};
factory.setHttpClientConfig(new HttpClientConfig.Builder(url)
        .multiThreaded(true)
        .build());
JestClient client = factory.getObject();

12
2017-11-17 17:08



是的,它也适合我:) - panipsilos
嗨Eric我正在关注您提供的github链接。我们正面临着禁止的错误。另一个问题是在普通的jest客户端我们传递弹性搜索端点。但在这里,我们只传递服务名称和地区。您能否提供示例代码或指导来解决我们的问题。 - Mohan Shanmugam
嗨@MohanShanmugam。禁止的错误可能是由于访问策略配置错误或凭据错误造成的。我在答案中添加了一个用法示例。希望这可以帮助。 - Eric Citaire
嗨Eric感谢您的回复。我们使用jestclient创建索引,在此索引创建和删除索引中放置映射和插入记录都正常工作。放置映射和插入记录显示禁止错误。当我通过所有社区成员的讨论时,看起来很奇怪。我们使用的是jest 2.0.0和AWS Es 2.3。你有任何线索为什么把映射和插入记录不起作用。 - Mohan Shanmugam
我们正在从AWS lambda运行此程序。 lambda角色具有Es完全权限。我们在弹性搜索策略中使用了此角色ARN。 - Mohan Shanmugam


这在Async请求的情况下不起作用。

更新:

忽略我以前的评论。它也在为异步请求添加拦截器之后工作:

final AWSSigningRequestInterceptor requestInterceptor = new AWSSigningRequestInterceptor(awsSigner);
            factory = new JestClientFactory() {
                @Override
                protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
                    builder.addInterceptorLast(requestInterceptor);
                    return builder;
                }
                @Override
                protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
                    builder.addInterceptorLast(requestInterceptor);
                    return builder;
                }
            };

2
2018-04-21 19:06