Elastic Search와 Lambda 연동 권한

업데이트:

외부에서의 ES 접근을 제한하기 위해 사용하는 방법이 Access Policy 이다.

특정 IP에서만 ES에 접근하여 데이터를 읽고 추가할 수 있도록 하거나, 특정 Lambda에서만 사용가능하게 하여서 제3자가 ES에 접근하지 못하도록 할 수 있다.

이때 Access Policy 를 사용하는데 Lambda는 IP로 accees 를 Allow 할 수 없다.

그래서 람다 함수에서 request 에 auth를 넣어 날려줘야한다.

Layer에 AWS4Auth를 설치하여 - pip3 install request-aws4auth -t .

레이어에 추가하고 AWS4Auth 를 import 하여 credebtial 을 추가해야된다.

from requests_aws4auth import AWS4Auth
# 중중
region = "ap-northeast-2"
service = "es"
ELB_URL = "https://THISISYOURESDOMAIN.ap-northeast-2.es.amazonaws.com/test/_search"
PARAMS = {'q': 'office:*', 'sort':'times:desc', 'size': 60}

credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

# 중략

r = requests.get(url=ELB_URL, auth=awsauth,  params = PARAMS)
data = r.json()
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:sts::12345:assumed-role/get-Reservation-role/Office-get-Office",
          "arn:aws:iam::12345:user/Admin"
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-2:12345:domain/my-elastic/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-2:12345:domain/my-first-elastic/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "1.2.3.4"
        }
      }
    }
  ]
}

[참조 링크] (https://docs.aws.amazon.com/ko_kr/elasticsearch-service/latest/developerguide/es-request-signing.html)

댓글남기기