EC2에서 laravel5.8 및 Amazon Elasticsearch Service를 사용할 때 드뎌

개요



AWS에서 EC2 및 Elasticsearch Service
을 연결하려고 생각하면 의외로 끼워 버린 이야기입니다.

상당히 ec2상에 elasticsearch를 도입하여 이용하고 있는 분은 많지만, Elasticsearch Service를 세워 연결하는 기사는 별로 없다,,,.

AWS EC2에 ElasticSearch 설치
AWS에서 두려워하지 않는 EC2 + Amazon Elasticsearch Service로 빠졌습니다.

다소 인터넷으로 굴러가고 있습니다만, 지금을 설레는 라라벨 를 이용한 기사가 없었기 때문에 쓰고 있는 대로.

이용환경



인프라편


  • 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 경영 콘솔 화면


    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는 통과한다.
    로컬 환경도 문제없이 움직이고 있다.
    수수께끼가 깊어져 시간만이 지나가는,,,.

    서있는 것은 포트 번호입니다.



    마음에 드는 절도 없고, 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
    

    그리고 포트 번호를 기재해야하는 것 같습니다!

    사소한 설정 파일로 완전히 끼워 버렸습니다.
    역시 제대로 소스 코드를 쫓지 않으면 갈 수 없네요!

    좋은 웹페이지 즐겨찾기