我试图将所有AWS调用签名到ElasticSearch但是响应始终是;
User: anonymous is not authorized to perform: es:ESHttpGet on resource:
我尝试了多个密钥对和IAM用户。
我们PHP中的调用是使用官方elasticsearch-php client进行的,所有请求都是使用here找到的连接符进行签名的。
下面显示的是我们如何构建ElasticSearch客户端并应用签名中间件;
$credentials = new Credentials('<KEY>', '<SECRET>');
$signature = new SignatureV4('es', 'eu-central-1');
$middleware = new AwsSignatureMiddleware($credentials, $signature);
$defaultHandler = ESClientBuilder::defaultHandler();
$awsHandler = $middleware($defaultHandler);
$clientBuilder = ESClientBuilder::create();
$clientBuilder
->setHandler($awsHandler)
->setHosts(['<URL>']);
$this->_client = $clientBuilder->build();
作为参考,我们尝试访问的弹性搜索实例附带的策略是;
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<IAM_USER>"
},
"Action": "es:*",
"Resource": "<RESOURCE>/*"
}
]
}
其他信息;
答案 0 :(得分:1)
如果没有完全了解特定请求的内容,很难回答任何具体内容,但这里有一些关于从哪里开始搜索解决方案的建议。
答案 1 :(得分:1)
当我遇到类似问题时,这对我有所帮助:
要解决此问题,请检查以下内容:
确认您使用的是支持凭据签名的客户端,以及您的请求是否正确签名。 AWS使用签名版本4签名过程向AWS请求添加身份验证信息;来自与Signature Version 4不兼容的客户端的请求将被拒绝,并显示“匿名未授权”错误。有关对Elasticsearch的格式良好的请求的示例,请参阅Signing an Amazon Elasticsearch Service Search Request.
验证访问策略中指定的用户和资源是否具有指定的正确Amazon资源名称(ARN)。有关ARN的一般信息,请参阅Amazon资源名称(ARN)和AWS服务命名空间。
确保访问策略中指定的IP地址使用CIDR表示法。在根据策略指定的IP地址检查IP地址时,访问策略使用CIDR表示法。
验证访问策略中指定的IP地址是否与您用于访问Elasticsearch集群的IP地址相匹配。自最初配置访问策略以来,您的IP可能已更改。您可以在http://checkip.amazonaws.com/确定任何实例的面向公众的IP地址。
查看Troubleshoot IAM Policies以获取其他问题排查信息。
有关详细信息,请查看this ...