签署ElasticSearch AWS调用

时间:2018-03-07 13:02:49

标签: php amazon-web-services elasticsearch laravel-5

我试图将所有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>/*"
    }
  ]
}

其他信息;

  • 我们使用的是Laravel框架,版本5.4.7
  • Elasticsearch客户端版本5.3.2

2 个答案:

答案 0 :(得分:1)

如果没有完全了解特定请求的内容,很难回答任何具体内容,但这里有一些关于从哪里开始搜索解决方案的建议。

  1. 中间件可能存在问题。我发现了另一个,它似乎更清洁,更好的测试。我建议尝试一下 - amazon-es-php
  2. 您的策略/ VPC配置可能存在问题,因此请务必检查this page是否存在可能存在问题的地方
  3. 另一种选择是为您的elasticsearch php客户端启用loggin,以便了解请求的内容。这可以通过将monolog库添加到您的应用程序并创建记录器处理程序来完成。以下是官方elastic search documentation
  4. 的指南

答案 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 ...