从 node.js 创建对 AWS ES 实例的有效签名请求
Creating a valid signed request to an AWS ES instance from node.js
我试图在 node.js 中找到一个如何连接到 AWS ES 实例的示例,然后通过一个简单的请求访问 ES 集群。
我正在尝试使用 elasticsearch node package, along with an open source addon called http-aws-es 来执行此操作。
我已将我的 aws ES 访问策略配置为如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:root"
},
"Action": "es:*",
"Resource": "example-domain.us-east-1.es.amazonaws.com:<account-id>:domain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "example-domain.us-east-1.es.amazonaws.com:<account-id>:domain/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "<my-ip>"
}
}
}
]
}
因此,我希望能够从 ip 地址或链接到我的 aws 帐户的 IAM 用户对 es 实例发出放置和获取请求。
我有以下代码在 node.js 中尝试这样做:
var aws_access_key = 'example';
var aws_secret_key = 'key';
var es = require('elasticsearch').Client({
hosts: 'example-domain.us-east-1.es.amazonaws.com',
connectionClass: require('http-aws-es'),
amazonES: {
region: 'us-east-1',
accessKey: aws_access_key,
secretKey: aws_secret_key
}
});
es.ping({
// ping usually has a 3000ms timeout
requestTimeout: Infinity,
// undocumented params are appended to the query string
hello: "elasticsearch!"
}, function (error) {
if (error) {
console.log(error);
console.trace('elasticsearch cluster is down!');
} else {
console.log('All is well');
}
});
当前returns授权错误:
{ [Error: Authorization Exception]
status: 403,
displayName: 'AuthorizationException',
message: 'Authorization Exception' }
我还没有在 node.js 中看到通过使用签名策略来使用 aws ES 实例的工作示例。有人有见解吗?
事实证明,除了一步之外,我几乎所有问题都做对了。
与上述代码中的 aws_access_key
和 aws_secret_key
关联的 IAM 用户必须具有与弹性搜索实例交互的特定权限。所以我登录到 AWS 控制台并将以下策略添加到需要与 elasticsearch 实例交互的 IAM 用户
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1480915344000",
"Effect": "Allow",
"Action": [
"es:*"
],
"Resource": [
"arn:aws:es:us-east-1:<account-id>:domain/*"
]
}
]
}
我试图在 node.js 中找到一个如何连接到 AWS ES 实例的示例,然后通过一个简单的请求访问 ES 集群。
我正在尝试使用 elasticsearch node package, along with an open source addon called http-aws-es 来执行此操作。
我已将我的 aws ES 访问策略配置为如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:root"
},
"Action": "es:*",
"Resource": "example-domain.us-east-1.es.amazonaws.com:<account-id>:domain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "example-domain.us-east-1.es.amazonaws.com:<account-id>:domain/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "<my-ip>"
}
}
}
]
}
因此,我希望能够从 ip 地址或链接到我的 aws 帐户的 IAM 用户对 es 实例发出放置和获取请求。
我有以下代码在 node.js 中尝试这样做:
var aws_access_key = 'example';
var aws_secret_key = 'key';
var es = require('elasticsearch').Client({
hosts: 'example-domain.us-east-1.es.amazonaws.com',
connectionClass: require('http-aws-es'),
amazonES: {
region: 'us-east-1',
accessKey: aws_access_key,
secretKey: aws_secret_key
}
});
es.ping({
// ping usually has a 3000ms timeout
requestTimeout: Infinity,
// undocumented params are appended to the query string
hello: "elasticsearch!"
}, function (error) {
if (error) {
console.log(error);
console.trace('elasticsearch cluster is down!');
} else {
console.log('All is well');
}
});
当前returns授权错误:
{ [Error: Authorization Exception]
status: 403,
displayName: 'AuthorizationException',
message: 'Authorization Exception' }
我还没有在 node.js 中看到通过使用签名策略来使用 aws ES 实例的工作示例。有人有见解吗?
事实证明,除了一步之外,我几乎所有问题都做对了。
与上述代码中的 aws_access_key
和 aws_secret_key
关联的 IAM 用户必须具有与弹性搜索实例交互的特定权限。所以我登录到 AWS 控制台并将以下策略添加到需要与 elasticsearch 实例交互的 IAM 用户
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1480915344000",
"Effect": "Allow",
"Action": [
"es:*"
],
"Resource": [
"arn:aws:es:us-east-1:<account-id>:domain/*"
]
}
]
}