bbuljj

AWS ElasticSearch Service(ES) 를 Public Access가 아닌 VPC로 Access를 하는 방법에 대해서 포스팅하겠습니다.


* 구축한 환경은 아래와 같습니다.

 1. ec2 - Ubuntu

 2. MacOS 

 3. ElasticSearch Service


* 구축전 ec2 와 Elastic Search Service 가 생성되어 있어야 합니다.



* Step 

1. Ec2생성 시 적용한 pem 키를 .ssh 에 저장합니다. (optional)

$ mv my.pem .ssh/

2. Local에 ".ssh" config 에 Host를 estunnel 을 추가합니다.

Host estunnel
HostName 1.1.1.1 # ec2 public ip 주소
User ec-user # ec2 계정
IdentitiesOnly yes
IdentityFile ~/.ssh/my.pem
LocalForward 9200 vpc-test-v7asdfasdffddfdsfp22ry6qm2zn3u.ap-northeast-x.es.amazonaws.com:443 # Elasticsearch vpc endpoint 


3. 보안그룹(security group)을 설정해줍니다.


유형 

프로토콜 

포트  

Source 

SSH 

TCP 

22 

개인 아이피  

HTTPS 

TCP 

443 

Security Group ID (ex: sg-~~~) 

CUSTOM  

TCP 

9200 

개인 아이디 



4. 개인 터미널에서 아래의 명렁을 수행합니다.


ssh estunnel -N

 * 만약 위의 명령이 실행했을 때 Permission Error 가 발생하면 ec2에 Local Public key를 등록하지 않아 실행이 되지 않을 가능성이 큽니다. 

2017/07/21 - [Etc../AWS] - [EC2] EC2 다른 계정생성 후 접속방법 에서 Public key 입력 부분을 참고하시면 됩니다.

5. 위의 명령이 실행된 상태에서 브라우저를 실행하여 https://localhost:9200 에 접속하면 아래와 같은 결과가 출력됩니다.

{
  "name" : "xxxxxx",
  "cluster_name" : "123323213:test",
  "cluster_uuid" : "xxxxxxxxxx",
  "version" : {
    "number" : "6.x.x",
    "build_flavor" : "xxx",
    "build_type" : "zip",
    "build_hash" : "xxxx",
    "build_date" : "2018-08-01T07:23:36.254471Z",
    "build_snapshot" : false,
    "lucene_version" : "x.x.x",
    "minimum_wire_compatibility_version" : "x.x.0",
    "minimum_index_compatibility_version" : "x.x.0"
  },
  "tagline" : "You Know, for Search"
}



* Kibana 의 접속 URL은 https://localhost:9200/_plugin/kibana/app/kibana


'Etc.. > AWS' 카테고리의 다른 글

ElasticSearchService vpcs Access  (0) 2018.10.19
[EC2] EC2 다른 계정생성 후 접속방법  (0) 2017.07.21

Comment +0

Elastic Search를 사용해 인덱스 생성 / Mapping / 조회 / 삭제 방법에 대해 알아보겠습니다.


* Enviroment

 - Python 3.6

 - Django 1.11

 - Auth : AWS4Auth

 - index : text_index

 - doc : _doc


* 이 포스트에서 편의를 위해 ElasticSearch Service를 "ES"로 부르도록 하겠습니다. 


1. ES 접속 

credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, 'region', 'service')
es = Elasticsearch(hosts=[{'host': settings.ES_HOST, 'port': 443}],
           http_auth=awsauth,
            use_ssl=True,
            verify_certs=True,
            connection_class=RequestsHttpConnection)


2. 인덱스 생성을 위한 Document / Mapping 설정

document = {
	"mappings": {
	    "_doc": {
	        "properties": {
	            "type": {
	                "type": "keyword"
	            },
	            "id": {
	                "type": "integer"
	            },
	            "title": {
	                "type": "text",
	                "analyzer": "whitespace",
	            },
	            "contents": {
	                "type": "text"
	            },
	            "created_at": {
	                "type": "date"
	            }
            }
        }
    }
}	

 - Type을 정의한 이유는 데이터들의 출처를 구분하기 위함. (example: 게시글, 쇼핑, 등..)


3. 인덱스 생성

es.indices.create(index="test_index", body=document)


4. 데이터 인덱싱 

es.index(index="test_index", doc_type="_doc", body=body)


5. 데이터 조회


 - REST API

GET test_index/_doc/_search

GET index_name/doc_name/_search

아래의 쿼리는 title이 "검색어"이고, type이 "post"인 데이터를 조회하는 쿼리입니다. 

{
  "from": 0,
  "size": 5,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "match": {
                  "title": "검색어"
                }
              }
            ]
          }
        }
      ],
      "filter": [
        {
          "term": {
            "type": "post"
          }
        }
      
      ]
    }
  },
  "sort": [
    "_score"
  ]
}

여러개의 필터를 사용할 경우 terms 사용


"terms": {
  "member_type": [
   "doctor",
     "all"
    ]
}

 - Python

es.search(index="test_index", doc_type="_doc", body=body)


데이터의 포맷은 아래와 같이 Json으로 응답이 옵니다.

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 7,
    "max_score": 2,
    "hits": [
      {
        "_index": "test_index",
        "_type": "_doc",
        "_id": "X14VQmYBDFDy57OpEriV",
        "_score": 2,
        "_source": {
          
        }
      }
    ]
  }
}

- took : 걸린시간

- timeout : 타임아웃 여부

- _shards : 샤딩관련 내용

- hits : 응답 데이터 정보 (* 검색결과 데이터는 hits > hits > _source 안에 데이터가 있습니다.)



6. 데이터 삭제

es.delete(index="test_index", doc_type="_doc", id="X14VQmYBDFDy57OpEriV"))


Comment +0

1. config 파일을 ~/.ssh경로에 생성

vi ~/.ssh/config

2. 아래의 코드를 입력하면 끝~!

ServerAliveInterval 60
ServerAliveCountMax 30 


'OS > Linux' 카테고리의 다른 글

ssh 접속 끊김 현상 방지하는 방법  (0) 2017.08.10
[Linux] vi & vim 색상설정  (0) 2017.07.17
[Linux] && , || , ;  (0) 2016.10.16
[Linux] /dev/null 2>&1 ??  (0) 2016.10.07
[Linux] alias 설정  (0) 2016.09.21
[Linux] error: no such partition  (0) 2014.09.14

Comment +0