Logstash推送数据至AWS Elasticsearch遇403错误,持续重试连接问题排查
解决Logstash推送AWS Elasticsearch出现403错误的方案
结合你的日志和配置文件来看,403错误主要出在AWS ES的连接权限或配置参数上,我整理了几个必须排查和修正的关键点:
1. 修正AWS Region配置错误
你配置里写的region => "us-east-1b"是AWS可用区(AZ),不是合法的区域ID,正确的区域应该是us-east-1。Amazon ES插件需要正确的区域来生成请求签名,错误的区域会直接导致签名验证失败,返回403。
修改后的配置片段:
output{ amazon_es { # 保留其他配置不变 region => "us-east-1" # 保留其他配置不变 } }
2. 修正Amazon ES插件的Hosts与路径配置
你的hosts参数写法不符合插件要求:
hosts只需要填写ES域名(不带https://前缀和额外路径),比如["my-dom.co"]- 日志里显示健康检查请求到了
https://my-dom.co:8001/scans/,这里的/scans路径是错误的——AWS ES的默认endpoint没有额外路径,若scans是你要写入的索引名,应该通过index参数指定,而非放在hosts里。
修正后的output配置:
output{ amazon_es { hosts => ["my-dom.co"] port => 8001 ssl => true region => "us-east-1" index => "snapshot-%{+YYYY.MM.dd}" } }
3. 确认AWS凭证的有效性与配置方式
你提到已导出AWS密钥,需要确保:
- 导出的是
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量,且Logstash进程能读取到(可在启动Logstash前执行echo $AWS_ACCESS_KEY_ID验证) - 若环境变量未生效,可临时在配置里显式指定(生产环境建议用IAM角色或环境变量,避免硬编码密钥):
output{ amazon_es { # 保留其他配置不变 access_key_id => "你的AWS访问密钥ID" secret_access_key => "你的AWS秘密访问密钥" # 保留其他配置不变 } }
4. 检查IAM权限与ES域访问策略
IAM实体权限
确保你的AWS凭证对应的IAM用户/角色拥有访问Amazon ES的权限,至少需要以下基础权限(可按需调整):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpPut", "es:ESHttpPost", "es:ESHttpGet", "es:ESHttpHead" ], "Resource": "arn:aws:es:us-east-1:你的AWS账号ID:domain/你的ES域名/*" } ] }
ES域访问策略
在AWS控制台的Elasticsearch服务中,检查你的域的访问策略,确保允许上述IAM用户/角色访问。示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:user/你的IAM用户名" }, "Action": "es:*", "Resource": "arn:aws:es:us-east-1:你的AWS账号ID:domain/你的ES域名/*" } ] }
5. 修正Input路径的潜在问题
虽然这不是403的直接原因,但你的Input路径~/home/ubuntu/json_try/json_try.json存在逻辑错误:~代表当前用户的主目录(比如ubuntu用户的主目录是/home/ubuntu),所以这个路径实际会解析为/home/ubuntu/home/ubuntu/json_try/json_try.json,大概率不存在。建议修改为:
input { file{ type => "json" path => "/home/ubuntu/json_try/json_try.json" start_position => "beginning" sincedb_path => "/dev/null" } }
完成以上配置修正后,重启Logstash,应该就能正常连接AWS ES并推送文档了。
内容的提问来源于stack exchange,提问作者Roy Levy
相关产品推荐
相关产品推荐

