LoginSignup
5
3

More than 3 years have passed since last update.

EC2上のlaravel5.8とAmazon Elasticsearch Serviceを利用するときにド嵌った

Last updated at Posted at 2019-09-15

概要

AWSでEC2とElasticsearch Service
をつなげようと思ったら意外と嵌ってしまった話です。

結構ec2上にelasticsearchを導入して利用している方は多いけど、Elasticsearch Serviceを立ててつなげる記事はあまりない、、、。

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の設定はこちら

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

ELASTICSEARCH_HOSTのエンドポイントだけ変更してあげればいいんじゃん!

Elasticsearch ServiceとEC2をつないでみる。

※Elasticsearch Serviceマネジメントコンソール画面
スクリーンショット 2019-09-15 18.19.33.png

ec2からcurlで叩いたら正常に動いている反応がある!

ec2
[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"
}

つながっているということは

.env(ローカル)
SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=http://elasticsearch:9200

.env(EC2)
SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=エンドポイントのURL

に.envを書き換えれば行けるはず!

laravelとElasticsearch Serviceが連動しない!

.envファイルを書き換えても一向に
php artisan migrate:refresh --seed
が通らない!
RDSともつないでいてそちらは正常に動いているのですが、
テストデータを入れているシーディングがどうも通らない。

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

エラーがでる箇所。

エラーメッセージ
Elasticsearch\Common\Exceptions\NoNodesAvailableException  : No alive nodes found in your cluster

調べて見ると、タイムアウトでこのエラーメッセージがでるからタイムアウトの時間を長くしてみてと書いてある

しかし、テストレコードは1レコードのみ。
タイムアウトになるはずもない。
相変わらずcurlは通る。
ローカル環境も問題なく動いている。
謎が深まり時間だけが過ぎていく、、、。

立ちはだかっていたのはport番号

思い当たる節もなく、PCとにらめっこ。
vendor以下のソースコードをひたすら追っていると変な記述が。

ClientBuilder.php
    /**
     * @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;
    }

あれ?
port番号書いてないと勝手に9200番につなぐようにしている?
いやいや、、、、

流石にhttpsってついてたら443に繋ぐでしょ、、、、。

と追ってみるもそんな処理なし。

つまり、

.env(EC2)
SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=エンドポイントのURL:443

とポート番号を記載する必要があるみたいです!

些細な設定ファイルで完全に嵌ってしまいました。
やっぱりちゃんとソースコードを追わないと行けないですね!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3