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

# 概要
AWSでEC2と[Elasticsearch Service](https://aws.amazon.com/jp/elasticsearch-service/)
をつなげようと思ったら意外と嵌ってしまった話です。

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

[AWS EC2上にElasticSearchをインストール](https://qiita.com/nbapps_dev/items/4c6e061869f0d63eac45)
[AWSで怯えず作るEC2 + Amazon Elasticsearch Serviceでハマったところ](https://tech.libinc.co.jp/entry/2018/11/02/100751)

多少ネットに転がっているのですが、今をときめく[Laravel](https://laravel.com)を利用した記事がなかったので書いている次第。

# 利用環境

### インフラ編
- EC2(centOS7)
- elasticsearch Service

### 動作環境
- laravel5.8(php7.2)
- elasticsearch Service 6.7
- mysql8.0
- nginx1.17

# ローカル開発環境
ローカル開発環境はdockerを利用してelasticsearchのコンテナを立てて開発をしています。
laravelを使っているので、せっかくなので[scout](https://readouble.com/laravel/5.8/ja/scout.html)を利用。

ローカル上の.envの設定はこちら

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

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

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


※Elasticsearch Serviceマネジメントコンソール画面
<img width="1029" alt="スクリーンショット 2019-09-15 18.19.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497818/428576ee-97e3-850f-0e7a-5157b4d40553.png">

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

```centos: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"
}

```

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

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

を

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

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

# laravelとElasticsearch Serviceが連動しない！
.envファイルを書き換えても一向に
`php artisan migrate:refresh --seed`
が通らない！
[RDS](https://aws.amazon.com/jp/rds/)ともつないでいてそちらは正常に動いているのですが、
テストデータを入れているシーディングがどうも通らない。

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

エラーがでる箇所。

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

調べて見ると、[タイムアウトでこのエラーメッセージがでるからタイムアウトの時間を長くしてみてと書いてある](https://codeday.me/jp/qa/20190415/632912.html)

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

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


```php: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に繋ぐでしょ、、、、。

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

つまり、

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

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

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