在处理EC2时无法进行ping测试的故事
首先 ,
本文是 Elastic Stack 圣诞月历的第20天的文章。
虽然我是 Elasticsearch 的初学者,但由于空余时间,我决定投稿。
首先,我先道个歉。
起初,我原计划撰写一篇关于Elasticsearch的故障排除文章,
但在修改过程中,发现与Elasticsearch的关系不够密切,变成了一篇无关的文章。
真的对那些期待有关Elasticsearch的内容的读者们,非常抱歉。
(文章的后半部分还是包括与Elasticsearch相关的内容。)
考虑到在最后时刻放弃发文也可能造成困扰,所以我还是决定发表出来。
本文概述:如何在EC2中进行ping测试。
发生的问题
以下是具有以下两个要点的 EC2 实例。(AMI 使用 Amazon Linux 2)
另外,如果您在实例上运行以下命令来安装 Apache,您还可以在浏览器中访问 Apache 的初始页面。
$ sudo yum -y install httpd
$ sudo systemctl start httpd.service
原因和解决方案
ping使用的不是TCP/IP协议,而是ICMP协议。
因此,要进行ping通信,需要在EC2安全组设置中允许ICMP协议。
请注意,HTTP、SSH、POP3、FTP等常见协议都是基于TCP/IP协议,所以曾以为只要打开TCP端口就可以了。
補充:有关Elasticsearch故障排除的讨论
「虽然这是 Elastic Stack 的 Advent Calendar,但却不是关于 Elasticsearch 的主题!」可能会被人生气,所以在这篇文章中也会提及导致我撰写这篇文章的 Elasticsearch 故障。这是一个相当初学者级的设置错误。
发生的问题的内容
我个人进行学习,搭建了一个EC2实例,并在上面安装了Apache和Elasticseach。
在安全组中,我已经打开了HTTP(80)和Elasticsearch(9200、9300)的端口,
但从本地PC上只能通过HTTP请求,无法使用Elasticsearch的API(无法访问Elasticsearch的API)。
我所期望的事情
从本地电脑使用Elasticsearch的REST API发送搜索查询,并能接收到搜索结果。
$ curl -XGET 'http://<パブリックIPアドレス>:9200/my_index/my_index/1'
{"_index":"my_index","_type":"my_index","_id":"1","_version":2,"_seq_no":1,"_primary_term":1,"found":true,"_source":
{
user_name : "John Smith",
date : "2017-10-15T15:09:45",
message : "Hello Elasticsearch world."
}
实际情况
调用 API 时会出现 Connection refused。
$ curl -XGET 'http://<パブリックIPアドレス>:9200/my_index/my_index/1'
curl: (7) Failed to connect to <パブリックIPアドレス> port 9200: Connection refused
确认一件事情
HTTP访问没有问题的样子(Apache正在运行)→ 安全组设置看起来没有错误。
$ curl <パブリックIPアドレス>:80
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd%22%3E
...(以下略)
※ブラウザからもapacheの画面は表示される。
http://<パブリックIPアドレス>/
确认的事情2
哇!为什么无法 Ping 通?那为什么 HTTP 可以通呢?
$ ping <パブリックIPアドレス>
Request timeout for icmp_seq 0
...(以下略)
确认事项3
本地电脑的防火墙设置已更改为开放状态,但没有变化。
确认了四件事
从实例的shell上已经确认Elasticsearch服务已启动。
$ sudo lsof -i -n -P
java 3203 elasticsearch 189u IPv6 21148 0t0 TCP [::1]:9300 (LISTEN)
java 3203 elasticsearch 190u IPv6 21155 0t0 TCP 127.0.0.1:9300 (LISTEN)
java 3203 elasticsearch 191u IPv6 21196 0t0 TCP 127.0.0.1:9200 (LISTEN)
java 3203 elasticsearch 198u IPv6 21195 0t0 TCP [::1]:9200 (LISTEN)
确认了五件事。 le wǔ shì)
在实例上调用 Elasticsearch 的 API时,期望的响应能够正常显示。
→仅限于本地PC无法调用API。
原因和解决方法
我最初认为上述问题是由于 EC2 配置错误导致的。
但是经过一段时间的调查,我发现这个问题是由两个问题的结合导致的。
ICMP 不通的点
正如本文所述,就像 ICMP 协议一样,它已经被安全组配置屏蔽了。
无法从本地机器调用Elasticsearch API
根据上述文档,Elasticsearch默认关闭了来自互联网的API访问。通过修改network.host参数,可以实现通过互联网进行访问。
通过以下命令操作和编辑yml文件,使得可以在本地电脑上从API中操作实例。
$ sudo systemctl stop elasticsearch.service
$ sudo vim /etc/elasticsearch/elasticsearch.yml
ここで、network.host: 0.0.0.0 に変更
$ sudo systemctl start elasticsearch.service
以下是对以上文本的中文翻译:
对于 Elasticsearch 专家来说,这可能是再基础不过的设置,但对于初学者的我来说,这是一个相当困扰的问题。(整个星期天都花在解决这个问题上了)
希望对其他学习者有所帮助,我将把解决方法留在这里作为备忘录。
我深刻意识到自己需要更加熟练地进行故障排除…我会努力的。
注意事项
- 本記事では、EC2のセキュリティーグループやnetwork.hostのソースを0.0.0.0/0で設定していますが、 実際には適切な IP 制限をかけてセキュリティーを担保しましょう。