Amazon Athena OpenSearch 커넥터 - Amazon Athena

Amazon Athena OpenSearch 커넥터

OpenSearch Service

Amazon Athena OpenSearch 커넥터를 통해 Amazon Athena는 OpenSearch 인스턴스와 통신할 수 있고, 이로써 SQL을 사용하여 데이터를 쿼리할 수 있습니다.

참고

알려진 문제로 인해 OpenSearch 커넥터는 VPC에서 사용할 수 없습니다.

계정에서 Lake Formation을 활성화한 경우 AWS Serverless Application Repository에 배포한 Athena 페더레이션형 Lambda 커넥터의 IAM 역할은 Lake Formation에서 AWS Glue Data Catalog에 대한 읽기 액세스 권한을 가지고 있어야 합니다.

사전 조건

용어

다음 용어는 OpenSearch 커넥터와 관련이 있습니다.

  • 도메인 - 이 커넥터가 OpenSearch 인스턴스의 엔드포인트와 연결하는 이름입니다. 도메인은 데이터베이스 이름으로도 사용됩니다. Amazon OpenSearch Service 내에 정의된 OpenSearch 인스턴스의 경우 도메인은 자동 검색 가능합니다. 다른 인스턴스의 경우 도메인 이름과 엔드포인트 간의 매핑을 제공해야 합니다.

  • 인덱스 - OpenSearch 인스턴스에 정의된 데이터베이스 테이블입니다.

  • 매핑 - 인덱스가 데이터베이스 테이블인 경우 매핑은 해당 스키마(즉, 해당 필드 및 속성의 정의)입니다.

    이 커넥터는 OpenSearch 인스턴스와 AWS Glue Data Catalog에서 메타데이터 검색을 모두 지원합니다. 커넥터가 OpenSearch 도메인 및 인덱스 이름과 일치하는 AWS Glue 데이터베이스 및 테이블을 찾으면 커넥터가 스키마 정의에 이들을 사용하려고 시도합니다. OpenSearch 인덱스에 있는 모든 필드의 상위 세트가 되도록 AWS Glue 테이블을 생성하는 것이 좋습니다.

  • 문서 – 데이터베이스 테이블 내의 레코드입니다.

  • 데이터 스트림 - 여러 백업 인덱스로 구성된 시간 기반 데이터입니다. 자세한 내용은 OpenSearch 설명서의 Data streamsAmazon OpenSearch Service 개발자 안내서데이터 스트림 시작하기를 참조하세요.

    참고

    데이터 스트림 인덱스는 OpenSearch에 의해 내부적으로 생성 및 관리되므로 커넥터는 사용 가능한 첫 번째 인덱스에서 스키마 매핑을 선택합니다. 이러한 이유로 AWS Glue 테이블을 보충 메타데이터 소스로 설정하는 것이 좋습니다. 자세한 내용은 AWS Glue에서 데이터베이스 및 테이블 설정 단원을 참조하십시오.

파라미터

이 섹션의 Lambda 환경 변수를 사용하여 OpenSearch 커넥터를 구성합니다.

  • spill_bucket – Lambda 함수 제한을 초과하는 데이터에 대한 Amazon S3 버킷을 지정합니다.

  • spill_prefix – (선택 사항) 기본값은 athena-federation-spill이라는 지정된 spill_bucket의 하위 폴더입니다. 미리 정해진 일 수 또는 시간보다 오래된 유출을 삭제하려면 이 위치에서 Amazon S3 스토리지 수명 주기를 구성하는 것이 좋습니다.

  • spill_put_request_headers – (선택 사항) 유출에 사용되는 Amazon S3 putObject 요청에 대한 요청 헤더 및 값의 JSON 인코딩 맵입니다(예: {"x-amz-server-side-encryption" : "AES256"}). 다른 가능한 헤더를 알아보려면 Amazon Simple Storage Service API Reference(Amazon Simple Storage Service API 참조)의 PutObject를 참조하세요.

  • kms_key_id – (선택 사항) 기본적으로 Amazon S3로 유출된 모든 데이터는 AES-GCM 인증 암호화 모드와 임의로 생성된 키를 사용하여 암호화됩니다. Lambda 함수가 a7e63k4b-8loc-40db-a2a1-4d0en2cd8331과 같이 KMS에서 생성된 더 강력한 암호화 키를 사용하도록 하려면 KMS 키 ID를 지정합니다.

  • disable_spill_encryption – (선택 사항) True로 설정하면 유출 암호화가 비활성화됩니다. S3로 유출되는 데이터가 AES-GCM을 사용하여 암호화되도록 기본값은 False입니다(임의로 생성된 키 또는 KMS를 사용하여 키 생성). 유출 암호화를 비활성화하면 특히 유출 위치가 서버 측 암호화를 사용하는 경우 성능이 향상될 수 있습니다.

  • disable_glue – (선택 사항) true로 설정된 경우 커넥터는 AWS Glue에서 보충 메타데이터 검색을 시도하지 않습니다.

  • query_timeout_cluster – 병렬 스캔 생성에 사용되는 클러스터 상태 쿼리의 제한 시간(초)입니다.

  • query_timeout_search – 인덱스에서 문서를 검색하는 데 사용되는 검색 쿼리의 제한 시간(초)입니다.

  • auto_discover_endpoint – 부울입니다. 기본값은 true입니다. Amazon OpenSearch Service를 사용하고 이 파라미터를 true로 설정하면 커넥터가 OpenSearch Service에서 적절한 설명 또는 나열 API 작업을 호출하여 도메인과 엔드포인트를 자동으로 검색할 수 있습니다. 다른 유형의 OpenSearch 인스턴스(예: 자체 호스팅)의 경우 domain_mapping 변수에 연결된 도메인 엔드포인트를 지정해야 합니다. auto_discover_endpoint=true인 경우 커넥터는 AWS 자격 증명을 사용하여 OpenSearch Service에 인증합니다. 그렇지 않으면 커넥터가 domain_mapping 변수를 통해 AWS Secrets Manager에서 사용자 이름 및 암호 자격 증명을 검색합니다.

  • domain_mappingauto_discover_endpoint가 false로 설정되고 도메인 이름과 관련 엔드포인트 간의 매핑을 정의하는 경우에만 사용됩니다. domain_mapping 변수는 다음 형식으로 여러 OpenSearch 엔드포인트를 수용할 수 있습니다.

    domain1=endpoint1,domain2=endpoint2,domain3=endpoint3,...

    OpenSearch 엔드포인트에 대한 인증을 위해 커넥터는 ${SecretName}: 형식을 사용하여 삽입된 대체 문자열을 지원하며, 여기에는 AWS Secrets Manager에서 검색한 사용자 이름과 암호가 포함됩니다. 표현식 끝에 있는 콜론(:)은 엔드포인트의 나머지 부분과의 구분자 역할을 합니다.

    중요

    보안 모범 사례로, 환경 변수 또는 연결 문자열에서 하드 코딩된 보안 인증은 사용하지 않습니다. 하드 코딩된 보안 암호를 AWS Secrets Manager로 이동하는 방법에 대한 자세한 내용은 AWS Secrets Manager 사용 설명서하드 코딩된 보안 암호를 AWS Secrets Manager로 이동을 참조하세요.

    다음 예제에서는 opensearch-creds 보안 암호를 사용합니다.

    movies=https://${opensearch-creds}:search-movies-ne...qu---us-east-1---es.amazonaws.com

    런타임 시 ${opensearch-creds}는 다음 예제와 같이 사용자 이름과 암호로 렌더링됩니다.

    movies=https://myusername@mypassword:search-movies-ne...qu---us-east-1---es.amazonaws.com

    domain_mapping 파라미터에서 각 도메인-엔드포인트 페어는 다른 보안 암호를 사용할 수 있습니다. 보안 암호 자체는 user_name@password 형식으로 지정해야 합니다. 암호에 @ 기호가 포함될 수 있지만 첫 번째 @user_name과의 구분자 역할을 합니다.

    쉼표(,)와 등호(=)가 이 커넥터에서 도메인-엔드포인트 페어의 구분자로 사용된다는 점도 중요합니다. 따라서 저장된 보안 암호 내의 어디에도 쉼표(,)와 등호(=)를 사용하면 안 됩니다.

AWS Glue에서 데이터베이스 및 테이블 설정

커넥터는 AWS Glue 또는 OpenSearch를 사용하여 메타데이터 정보를 가져옵니다. AWS Glue 테이블을 보충 메타데이터 정의 소스로 설정할 수 있습니다. 이 기능을 활성화하려면 보충하려는 소스의 도메인 및 인덱스와 일치하는 AWS Glue 데이터베이스 및 테이블을 정의합니다. 커넥터는 지정된 인덱스에 대한 매핑을 검색하여 OpenSearch 인스턴스에 저장된 메타데이터 정의를 활용할 수도 있습니다.

OpenSearch에서 배열에 대한 메타데이터 정의

OpenSearch에는 전용 배열 데이터 형식이 없습니다. 데이터 형식이 같으면 모든 필드에 0개 이상의 값이 포함될 수 있습니다. OpenSearch를 메타데이터 정의 소스로 사용하려면 목록 또는 배열로 간주될 필드에 대해 Athena와 함께 사용되는 모든 인덱스에 대해 _meta 속성을 정의해야 합니다. 이 단계를 완료하지 못하면 쿼리는 목록 필드의 첫 번째 요소만 반환합니다. _meta 속성을 지정할 때 필드 이름은 중첩 JSON 구조에 대해 정규화되어야 합니다(예: address.street 여기서 streetaddress 구조 내부의 중첩 필드임).

다음 예제는 movies 테이블에 actorgenre 목록을 정의합니다.

PUT movies/_mapping { "_meta": { "actor": "list", "genre": "list" } }

데이터 타입

OpenSearch 커넥터는 AWS Glue 또는 OpenSearch 인스턴스에서 메타데이터 정의를 추출할 수 있습니다. 커넥터는 다음 표의 매핑을 사용하여 정의를 Apache Arrow 데이터 형식으로 변환합니다. 여기에는 다음 섹션에 언급된 사항이 포함됩니다.

OpenSearch Apache Arrow AWS Glue
text, keyword, binary VARCHAR 문자열
bigint BIGINT bigint
scaled_float BIGINT SCALED_FLOAT(...)
정수 INT int
bigint SMALLINT smallint
바이트 TINYINT tinyint
double FLOAT8 double
float, half_float FLOAT4 float
boolean BIT boolean
date, date_nanos DATEMILLI 타임스탬프
JSON 구조 STRUCT STRUCT
_meta(자세한 내용을 알아보려면 OpenSearch에서 배열에 대한 메타데이터 정의 섹션 참조) LIST ARRAY

데이터 형식에 대한 참고 사항

  • 현재 커넥터는 앞의 표에 나열된 OpenSearch 및 AWS Glue 데이터 형식만 지원합니다.

  • scaled_float는 고정 이중 스케일링 팩터로 조정된 부동 소수점 숫자이며 Apache Arrow에서 BIGINT로 표시됩니다. 예를 들어, 스케일링 팩터가 100인 0.756은 76으로 반올림됩니다.

  • AWS Glue에서 scaled_float를 정의하려면 array 열 유형을 선택하고 SCALED_FLOAT(scaling_factor) 형식을 사용하여 필드를 선언해야 합니다.

    다음 예제는 유효합니다.

    SCALED_FLOAT(10.51) SCALED_FLOAT(100) SCALED_FLOAT(100.0)

    다음 예제는 유효하지 않습니다.

    SCALED_FLOAT(10.) SCALED_FLOAT(.5)
  • date_nanos에서 DATEMILLI로 변환할 때 나노초는 가장 가까운 밀리초로 반올림됩니다. datedate_nanos에 대한 유효한 값에는 다음 형식이 포함되지만 이에 국한되지 않습니다.

    "2020-05-18T10:15:30.123456789" "2020-05-15T06:50:01.123Z" "2020-05-15T06:49:30.123-05:00" 1589525370001 (epoch milliseconds)
  • OpenSearch binaryBase64를 사용하여 인코딩된 바이너리 값의 문자열 표현이며 VARCHAR로 변환됩니다.

SQL 쿼리 실행

다음은 이 커넥터에서 사용할 수 있는 DDL 쿼리의 예제입니다. 예제에서 function_name은 Lambda 함수의 이름에 해당하고, domain은 쿼리하려는 도메인의 이름이고, index는 인덱스의 이름입니다.

SHOW DATABASES in `lambda:function_name`
SHOW TABLES in `lambda:function_name`.domain
DESCRIBE `lambda:function_name`.domain.index

성능

Athena OpenSearch 커넥터는 샤드 기반 병렬 스캔을 지원합니다. 커넥터는 OpenSearch 인스턴스에서 검색된 클러스터 상태 정보를 사용하여 문서 검색 쿼리에 대한 여러 요청을 생성합니다. 요청은 각 샤드에 대해 분할되고 동시에 실행됩니다.

또한 커넥터는 문서 검색 쿼리의 일부로 조건자를 푸시다운합니다. 다음 예제 쿼리 및 조건자는 커넥터가 조건자 푸시다운을 사용하는 방법을 보여줍니다.

Query

SELECT * FROM "lambda:elasticsearch".movies.movies WHERE year >= 1955 AND year <= 1962 OR year = 1996

조건자

(_exists_:year) AND year:([1955 TO 1962] OR 1996)

패스스루 쿼리

OpenSearch 커넥터는 패스스루 쿼리를 지원하고 Query DSL 언어를 사용합니다. Query DSL을 사용한 쿼리에 대한 자세한 내용은 Elasticsearch 설명서의 Query DSL 또는 OpenSearch 설명서의 Query DSL을 참조하세요.

OpenSearch 커넥터에서 패스스루 쿼리를 사용하려면 다음 구문을 사용합니다.

SELECT * FROM TABLE( system.query( schema => 'schema_name', index => 'index_name', query => "{query_string}" ))

다음 OpenSearch 예제 패스스루 쿼리는 default 스키마의 employee 인덱스에서 활성 고용 상태인 직원을 필터링합니다.

SELECT * FROM TABLE( system.query( schema => 'default', index => 'employee', query => "{ ''bool'':{''filter'':{''term'':{''status'': ''active''}}}}" ))

추가 리소스