본문 바로가기

AWS

AWS - AWS OpenSearchService 구축하고 django에서 연결하기

혼자서 구축하고 연결하느라 엄청난 뻘짓을 하였습니다만 다른 이들은 손쉽게 연결하십사 이렇게 기록을 남깁니다.

 

 

 

AWS OpenSearch 도메인 생성

 

먼저, AWS OpenSearch Service를 이용하기 위해 도메인을 생성해야 합니다. 최소의 비용이 들게끔 설정을 조정한 후에, Django 서버에서 다음과 같은 코드로 OpenSearch와의 연결을 시도했습니다:

 

from elasticsearch import Elasticsearch



es = Elasticsearch(

    ['your-opensearch-endpoint'],

    scheme="https",

    port=443,

)

 

 

그러나, 이렇게 연결을 시도하니 다음과 같은 오류 메시지가 반환되었습니다.

 

 

AuthorizationException(403, '{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet with an explicit deny in a resource-based policy"}')

 

 

이 오류 메시지는 Amazon OpenSearch Service의 리소스 기반 정책에서 'anonymous'라는 사용자가 "es:ESHttpGet"를 수행할 수 없다는 것을 의미합니다.

 

 IAM 설정과 정책 변경

 

이 문제는 AWS의 IAM(Identity and Access Management) 설정에서 발생하는 것으로, IAM 설정을 적절히 변경해야 해결할 수 있습니다. IAM은 AWS에서 제공하는 서비스로, 사용자, 그룹, 역할에 대한 접근을 제어할 수 있습니다. 사용자나 그룹은 IAM 정책을 통해 서로 다른 AWS 서비스에 대한 다양한 권한을 부여받을 수 있습니다.

 

일반적으로, Amazon OpenSearch Service에 대한 액세스를 허용하는 IAM 정책은 다음과 같은 JSON 구조를 가집니다:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "es:*"
      ],
      "Resource": "arn:aws:es:region:account-id:domain/domain-name/*"
    }
  ]
}

 

여기서 `es:*` 모든 Elasticsearch 동작을 허용하며, "Resource" 항목은 해당 권한이 적용되는 Amazon OpenSearch Service 도메인을 지정합니다.

 

따라서, 이 문제를 해결하기 위해 IAM에서 새로운 사용자를 생성하고 이 사용자에게 OpenSearchServiceFullAccess 정책을 부여했습니다. 비밀번호는 최초 생성 시에만 확인 가능하므로, 잘 기억해 두어야 합니다.

 

인증 헤더의 필요성과 AWS4Auth 사용

 

새로운 IAM 사용자를 생성하고 정책을 부여한 후에 다시 연결을 시도했지만, 다음과 같은 새로운 오류가 발생했습니다.

 

AuthorizationException(403, '{"message":"Authorization header requires \'Credential\' parameter. Authorization header requires \'Signature\' parameter. Authorization header requires \'SignedHeaders\' parameter. Authorization header requires existence of either a \'X-Amz-Date\' or a \'Date\' header. Authorization=Basic dGVzdC1kYjpyZWFsbGlmZSExMg=="}')

 

 

이 오류 메시지는 인증 헤더에 필요한 정보가 부족하다는 것을 나타냅니다. 이 문제를 해결하기 위해서는 AWS4Auth를 사용하여 AWS Signature Version 4로 요청을 서명해야 합니다.

 

마스터 사용자 생성과 보안 설정 변경

 

그러나, 이번에는 토큰이 유효하지 않다는 새로운 오류가 발생했습니다. 이 문제를 해결하기 위해 AWS 문서를 참조해보니, Amazon OpenSearch Service에 production을 위해 서명된 요청을 만드는 건 조금 더 복잡한 단계가 필요하다고 합니다.

 

따라서, dev/test용으로 db와 연결되기 위해서는 Amazon OpenSearch Service의 보안구성편집에 들어가 세분화된 엑세스 제어를 활성화 해주고, 마스터 사용자를 생성하여야 합니다.

 

그후, 엑세스 정책을세분화된 엑세스 제어만 사용으로 변경해주면, 마스터 사용자 이름과 비밀번호로 엑세스가 가능해집니다.

 

결론

 

꼬박 하루를 AWS 서버 설정에만 사용했지만, 과정을 통해 IAM, 정책, 보안 구성 AWS 여러 측면에 대해 깊게 연구할 있는 좋은 기회가 되었습니다. 경험을 통해 제가 겪었던 문제를 여러분이 훨씬 쉽게 해결할 있길 바라며, 다음에는 다른 AWS 서비스와의 흥미로운 경험을 공유하도록 하겠습니다.