我的应用程序出现此问题。 我的应用程序部署到Heroku服务器,我正在使用部署在AWS上的Elasticsearch。 当我尝试访问本地访问Elasticsearch - 在aws域上 - 每个工作。 但是,当我尝试访问我的Heroku域(都来自邮递员)时,我收到503错误消息:
2017-12-21T13:36:52.982331+00:00 app[web.1]: statusCode: 403,
2017-12-21T13:36:52.982332+00:00 app[web.1]: response: '{"Message":"User: anonymous is not authorized to perform: es:ESHttpPost on resource: houngrymonkey"}',
我的访问政策是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:eu-central-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "[heroku static ip]"
}
}
}
]
}
谁能告诉我这里的问题是什么? 谢谢!
答案 0 :(得分:1)
我在ES和lambda遇到过同样的问题,这不完全是你的情况,但也许它会有所帮助。我实际上是做了什么来解决这个问题
1)在lambda(Node.js v6.10
)中我添加了以下代码:
var creds = new AWS.EnvironmentCredentials('AWS');
....
// inside "post to ES"-method
var signer = new AWS.Signers.V4(req, 'es');
signer.addAuthorization(creds, new Date());
....
// post request to ES goes here
使用这些行我的异常改变了
"User: anonymous..."
至
"User: arn:aws:sts::xxxx:assumed-role/yyyy/zzzzz"
情况确实如此。
2)我已按以下方式更新了ES政策
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:sts::xxxx:assumed-role/yyyy/zzzzz" (which was in exception)
},
"Action": "es:*",
"Resource": "arn:aws:es:[region]:[account-id]:domain/[es-domain]/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:[region]:[account-id]:domain/[es-domain]/*"
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"1.2.3.4/32",
....
]
}
}
}
]
}
希望这会有所帮助。
答案 1 :(得分:0)
here中描述了标题中提到的错误的更多解决方案:
如果您使用的客户端不支持请求签名(例如浏览器),请考虑以下事项:
注意:如果收到授权错误,请检查您使用的是公共IP地址还是私有IP地址。基于IP的访问策略无法应用于驻留在虚拟私有云(VPC)中的Amazon ES域。这是因为安全组已经实施了基于IP的访问策略。对于公共访问,基于IP的策略仍然可用。有关更多信息,请参阅关于VPC域上的访问策略。
如果您使用的是支持请求签名的客户端,请检查以下内容:
请确保您的请求已正确签名。 AWS使用Signature Version 4签名过程将身份验证信息添加到AWS请求。与“签名版本4”不兼容的客户端发出的请求将被拒绝,并显示“用户:未经授权的匿名用户”错误。有关正确签名到Amazon ES的请求的示例,请参阅发出和签名Amazon ES请求。
验证访问策略中是否指定了正确的Amazon资源名称(ARN)。
如果您的Amazon ES域位于VPC内,请配置带或不带代理服务器的开放访问策略。然后,使用安全组控制访问。有关更多信息,请参阅关于VPC域上的访问策略。