使用node.js连接到aws弹性搜索aws sdk

时间:2019-05-24 07:21:15

标签: amazon-iam aws-sdk-nodejs aws-elasticsearch

将aws弹性搜索与nodejs一起使用的最佳方法是什么?我正在使用aws ecs ec2实例来运行我的docker容器,并且正在使用IAM角色从node.js访问其他AWS资源,例如S3存储桶和dynamodb。

我们也可以使用相同的过程访问aws弹性搜索端点吗?

我添加了具有现有角色的内联策略,并添加了弹性搜索端点arn。但是nodejs sdk无法连接到ES。当将aws键和id作为环境变量添加到任务定义中时,它开始工作。但是我不需要使用该方法,因为它将与其他aws资源冲突。 (看起来开发人员团队已经配置了程序,以便它寻找环境)

2 个答案:

答案 0 :(得分:0)

这当然不是最好的方法,但是您也可以使用基于ip的限制。我们目前正在使用它,并且效果很好。只需在ec2实例上设置弹性IP(如果尚未设置),然后在访问策略中设置IP地址,如下所示:

"Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "XXX.XXX.XXX.XXX",
          ]
        }
      }

答案 1 :(得分:0)

对于其他绊脚石的人来说,这是我被困在类似东西上时学到的一些东西:

可以在您的Elasticsearch域的访问策略中添加

EC2的角色ARN以及您希望角色具有的权限。例如。对于运行角色“ aws-ec2”的EC2,需要向ES发出HTTP GET请求的权限,您可以在ES域访问策略中包含以下内容:

"3"

您的帐户中运行角色为“ aws-ec2”的EC2实例发出的任何请求都可以访问elasticsearch。

请注意,如果您在获取凭据时遇到困难,请尝试以下操作:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<ACCOUNT_ID>:role/aws-ec2",
        ]
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:<REGION>:<ACCOUNT_ID>:domain/<DOMAIN_NAME>/*"
    }
  ]
}

这通常会像魔术般拉动凭证,我有一个关于凭证如何工作的理论(tl:dr;我认为它是通过向固定IP发出请求将凭证从EC2实例元数据中抽取的),但未经证实,所以我在我了解更多之前,不会让自己感到尴尬。请注意,即使您的环境或共享凭据文件中没有存储凭据,这也应该起作用。