[Lambda] Opensearch security_exception 오류 해결법
배경
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 확인
위 링크에 나와있듯이, Opensearch에서 세분화된 액세스 제어를 사용할 때는 Opensearch 보안 설정에서 Lambda 함수에 사용하는 Role을 연결해야한다.
하지만, VPC에 구축된 Opensearch는 GUI로 들어가질 못하니.. CLI로 할 수 밖에 없다
두 번째 방법 찾기
그래서 찾은게 Opensearch를 CLI 형태로 보내는 거 !
https://opensearch.org/docs/latest/security/access-control/api/#get-role-mapping
근데 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만 유효하고 관리자 권한을 가진 유저는 사용할 수 없게 되는 것이다.