当在EC2上使用laravel5.8和Amazon Elasticsearch Service时,遇到了困难

概述

想要将AWS的EC2和Elasticsearch Service连接起来,但却不料陷入了困境的故事。

很多人在EC2上安装和使用Elasticsearch,但是很少有关于建立Elasticsearch服务并连接的文章。

我在AWS EC2上安装了ElasticSearch。
在AWS上使用EC2和Amazon Elasticsearch Service一起创建时遇到了一些问题。

由于网络上没有关于当前流行的Laravel的文章,所以我写了这篇文章。

在中文中利用环境。

基礎設施章节

    • EC2(centOS7)

 

    elasticsearch Service

行动环境

    • laravel5.8(php7.2)

 

    • elasticsearch Service 6.7

 

    • mysql8.0

 

    nginx1.17

本地开发环境

本地开发环境使用Docker搭建Elasticsearch容器进行开发。由于使用Laravel框架,因此顺便使用Scout工具。

这里是关于本地.env配置的设置。

SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=http://elasticsearch:9200

只要改变ELASTICSEARCH_HOST的终端,就可以了!

尝试将Elasticsearch Service与EC2连接起来。

スクリーンショット 2019-09-15 18.19.33.png

当我在ec2上使用curl进行调用时,得到了正常的响应!

[centos@ip-***-**-**-* ****]$ curl https://エンドポイント.es.amazonaws.com
{
  "name" : "WNwU_Bn",
  "cluster_name" : "*********:********",
  "cluster_uuid" : "*****************",
  "version" : {
    "number" : "6.7.0",
    "build_flavor" : "oss",
    "build_type" : "zip",
    "build_hash" : "b8dfb4c",
    "build_date" : "2019-05-22T06:01:36.852084Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

互相联系的意思是

SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=http://elasticsearch:9200

把 を 解释成母语的中文

SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=エンドポイントのURL

只要修改.env文件,应该就可以了!

Laravel和Elasticsearch服务无法连接!

即使我修改了.env文件,php artisan migrate:refresh –seed仍然无法通过!虽然RDS连接正常,但是似乎无法成功进行填充测试数据。

Artisan::call('scout:import', ["model" => User::class]);

出现错误的地方。

Elasticsearch\Common\Exceptions\NoNodesAvailableException  : No alive nodes found in your cluster

当我尝试调查时,发现在超时情况下会出现此错误消息,建议将超时时间延长并尝试。

然而,测试记录只有一条。
不应该发生超时。
curl仍然能够正常通行。
本地环境也没有问题。
谜团变得更加深奥,只有时间在流逝…

站在那里的是端口号。

毫无头绪地盯着电脑屏幕,追踪vendor以下的源代码时,发现了一个奇怪的描述。

    /**
     * @throws InvalidArgumentException
     */
    private function extractURIParts(string $host): array
    {
        $parts = parse_url($host);

        if ($parts === false) {
            throw new InvalidArgumentException("Could not parse URI");
        }

        if (isset($parts['port']) !== true) {
            $parts['port'] = 9200;
        }

        return $parts;
    }

那个?
如果没有写端口号,会自动连接到9200号端口?
哎呀哎呀。。。

如果真的有使用HTTPS的话,那肯定是连接到443端口了吧、、、、。

试着追踪,但没有这样的处理。

总而言之,

SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=エンドポイントのURL:443

似乎需要写下主机和端口号!

被一些微小的配置文件弄得彻底迷茫了。果然还是要好好追踪源代码才行呀!

广告
将在 10 秒后关闭
bannerAds