对于遇到此问题的其他人,以下是我在遇到类似问题时学到的一些东西:
EC2 的角色 ARN 可以与您希望该角色拥有的权限一起添加到您的 Elasticsearch 域的访问策略中。例如。对于以“aws-ec2”角色运行的 EC2 需要向 ES 发出 HTTP GET 请求的权限,您可以在 ES 域访问策略中包含以下内容:
{
"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>/*"
}
]
}
在您的账户中使用角色“aws-ec2”运行的 EC2 实例发出的任何请求都可以访问 elasticsearch。
请注意,如果您在获取凭据时遇到问题,请尝试以下操作:
AWS.config.getCredentials(function(err) {
if (err) console.log(err.stack);
// credentials not loaded
else {
// credentials are loaded and can be accessed using
AWS.config.credentials.accessKeyId, AWS.config.credentials.secretAccessKeyId etc.
}
});
这通常会像魔术一样提取凭据,我有一个关于它如何工作的理论(tl:dr;我认为它通过向固定 IP 发出请求来从 EC2 实例元数据中提取它们)但它未经证实,所以我在我知道更多之前不会让自己难堪。请注意,即使您的环境或共享凭据文件中没有存储凭据,这也应该有效。