概要
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の設定はこちら
SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=http://elasticsearch:9200
ELASTICSEARCH_HOSTのエンドポイントだけ変更してあげればいいんじゃん!
と
Elasticsearch ServiceとEC2をつないでみる。
※Elasticsearch Serviceマネジメントコンソール画面
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 Serviceが連動しない!
.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
調べて見ると、タイムアウトでこのエラーメッセージがでるからタイムアウトの時間を長くしてみてと書いてある
しかし、テストレコードは1レコードのみ。
タイムアウトになるはずもない。
相変わらずcurlは通る。
ローカル環境も問題なく動いている。
謎が深まり時間だけが過ぎていく、、、。
立ちはだかっていたのはport番号
思い当たる節もなく、PCとにらめっこ。
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;
}
あれ?
port番号書いてないと勝手に9200番につなぐようにしている?
いやいや、、、、
流石にhttps
ってついてたら443に繋ぐでしょ、、、、。
と追ってみるもそんな処理なし。
つまり、
SCOUT_DRIVER=elasticsearch
ELASTICSEARCH_HOST=エンドポイントのURL:443
とポート番号を記載する必要があるみたいです!
些細な設定ファイルで完全に嵌ってしまいました。
やっぱりちゃんとソースコードを追わないと行けないですね!