the*_*ver 5 amazon-web-services node.js elasticsearch aws-sdk aws-lambda
我的任务是对弹性搜索 api 进行 POST api 调用,
我以前没有对 AWS 服务进行 api 调用的任何经验。
所以,我试过这个 -
axios.post('https://search-test-search-fqa4l6ubylznt7is4d5yxlmbxy.us-west-2.es.amazonaws.com/klove-ddb/recipe/_search')
.then(res => res.data)
.then(res => console.log(res));
Run Code Online (Sandbox Code Playgroud)
但我收到了 {"Message":"User:anonymous is notauthorized to perform: es:ESHttpPost"}
我还检查了一些 IAM 角色并将 AWSESFullAccess 策略添加到我的配置文件中。
我仍然无法解决任何问题。
请帮我。
您看到错误的原因User: anonymous is not authorized to perform: es:ESHttpPost
是您在没有让 ElasticSearch 知道您是谁的情况下请求数据 - 这就是它显示“匿名”的原因。
有几种身份验证方法,最简单的方法是使用elasticsearch 库。使用此库,您将向库提供一组凭证(访问密钥、秘密密钥)给 IAM 角色/用户。它将使用它来创建签名请求。签名的请求将让 AWS 知道谁实际发出了请求,因此它不会以匿名的形式接收,而是以您自己的形式接收。
另一种使其工作的方法是将您的访问策略调整为基于 IP:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"AAA.BBB.CCC.DDD"
]
}
},
"Resource": "YOUR_ELASTICSEARCH_CLUSTER_ARN"
}
]
}
Run Code Online (Sandbox Code Playgroud)
此特定政策将对任何拥有您在此处提供的 ip(range) 的人开放。不过,它会让您免去签署请求的麻烦。
一个帮助设置elasticsearch-js
AWS ES 的库就是这个
一个工作示例如下:
const AWS = require('aws-sdk')
const elasticsearch = require('elasticsearch')
const awsHttpClient = require('http-aws-es')
let client = elasticsearch.Client({
host: '<YOUR_ES_CLUSTER_ID>.<YOUR_ES_REGION>.es.amazonaws.com',
connectionClass: awsHttpClient,
amazonES: {
region: '<YOUR_ES_REGION>',
credentials: new AWS.Credentials('<YOUR_ACCESS_KEY>', '<YOUR_SECRET_KEY>')
}
});
client.search({
index: 'twitter',
type: 'tweets',
body: {
query: {
match: {
body: 'elasticsearch'
}
}
}
})
.then(res => console.log(res));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9288 次 |
最近记录: |