본문 바로가기

AWS/PROJECT

[Lambda] Opensearch security_exception 오류 해결법

728x90

배경

VPC의 Private Subnet에 위치한 Lambda 함수가 있다.

Lambda는 Opensearch에서 쿼리하기 위한 용도로 사용되고 있다 !

 

원래 VPC 활성화가 안 되어 있던 람다는 Opensearch에서 잘 쿼리하드만...

VPC 활성화가 되어 Private Subnet에 위치한 Lambda에서 다음과 같은 오류가 발생하는 것을 확인

response:  {'statusCode': 200, 'headers': {'Access-Control-Allow-Origin': '*'}, 'isBase64Encoded': False, 'body': '{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [indices:data/read/search] and User [name=arn:aws:iam::ACCOUNT:role/service-role/LAMBDAROLE, backend_roles=[arn:aws:iam::ACCOUNT:role/service-role/LAMBDAROLE], requestedTenant=null]"},"status":403}'}

 

 

과정

AWS Docs 확인

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/search-example.html#search-example-perms-fgac

 

Tutorial: Creating a search application with Amazon OpenSearch Service - Amazon OpenSearch Service

Tutorial: Creating a search application with Amazon OpenSearch Service A common way to create a search application with Amazon OpenSearch Service is to use web forms to send user queries to a server. Then you can authorize the server to call the OpenSearch

docs.aws.amazon.com

위 링크에 나와있듯이, Opensearch에서 세분화된 액세스 제어를 사용할 때는 Opensearch 보안 설정에서 Lambda 함수에 사용하는 Role을 연결해야한다.

하지만, VPC에 구축된 Opensearch는 GUI로 들어가질 못하니.. CLI로 할 수 밖에 없다

 

 

두 번째 방법 찾기

그래서 찾은게 Opensearch를 CLI 형태로 보내는 거 !

https://opensearch.org/docs/latest/security/access-control/api/#get-role-mapping

 

API

API

opensearch.org

 

 

근데 GET / POST / PUT 이딴 거만 넣으면 누가 아냐고 ^^….!!

그래서 바꾸어서.. 친절한 AWS가 알려준 CURL 명령을 사용하기로 했다.

 

근데 어떻게 쓰는지 몰라서 챗지피티한테 한 번 더 물어봤다.

 

 

챗지피티가 알려준 명령어를 가지고 SageMaker Studio의 터미널에서 때려봤다.

일단 어떤 인덱스가 있는지 확인해보았다.

curl -X GET "https://OPENSEARCHDOMAINNAME.ap-northeast-2.es.amazonaws.com/_cat/indices?v" -u 'USERNAME:PASSWORD'

 

그러면 다음과 같이 출력이 나타난다.

health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .opensearch-observability #############   1   2          0            0       624b           208b
green  open   .plugins-ml-config        #############   1   2          1            0     11.8kb          3.9kb
green  open   .ql-datasources           #############   1   2          0            0       624b           208b
green  open   test                      #############   5   2        718            0     35.4mb         11.8mb
green  open   .opendistro_security      #############   1   2         10            1    178.8kb         54.3kb
green  open   .kibana_1                 #############   1   2          0            0       624b           208b

 

 

 

다음은 Lambda Role을 역할 매핑으로 백엔드 역할에 지정해야한다!

curl -X PUT "https://OPENSEARCHDOMAINNAME.ap-northeast-2.es.amazonaws.com/_plugins/_security/api/rolesmapping/all_access" -u 'USERNAME:PASSWORD' -H 'Content-Type: application/json' -d '{
  "backend_roles" : [ "arn:aws:iam::ACCOUNT:role/service-role/LAMBDAROLE" ],
  "users" : [ "USERNAME" ]
}'

 

잘 실행되었다면 출력은 다음과 같다

{"status":"OK","message":"'all_access' updated."}

 

 

백엔드 역할 매핑할 때는 반드시 users도 같이 넣어줘야한다!

안 그럼 백엔드 역할로 지정한 IAM Role만 유효하고 관리자 권한을 가진 유저는 사용할 수 없게 되는 것이다.

 

728x90