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에 대한 읽기 액세스 권한을 가지고 있어야 합니다.
사전 조건
Athena 콘솔 또는 AWS Serverless Application Repository를 사용하여 AWS 계정에 커넥터를 배포합니다. 자세한 내용은 데이터 소스 커넥터 배포 또는 AWS Serverless Application Repository을 사용하여 데이터 소스 커넥터 배포을 참조하세요.
용어
다음 용어는 OpenSearch 커넥터와 관련이 있습니다.
-
도메인 - 이 커넥터가 OpenSearch 인스턴스의 엔드포인트와 연결하는 이름입니다. 도메인은 데이터베이스 이름으로도 사용됩니다. Amazon OpenSearch Service 내에 정의된 OpenSearch 인스턴스의 경우 도메인은 자동 검색 가능합니다. 다른 인스턴스의 경우 도메인 이름과 엔드포인트 간의 매핑을 제공해야 합니다.
-
인덱스 - OpenSearch 인스턴스에 정의된 데이터베이스 테이블입니다.
-
매핑 - 인덱스가 데이터베이스 테이블인 경우 매핑은 해당 스키마(즉, 해당 필드 및 속성의 정의)입니다.
이 커넥터는 OpenSearch 인스턴스와 AWS Glue Data Catalog에서 메타데이터 검색을 모두 지원합니다. 커넥터가 OpenSearch 도메인 및 인덱스 이름과 일치하는 AWS Glue 데이터베이스 및 테이블을 찾으면 커넥터가 스키마 정의에 이들을 사용하려고 시도합니다. OpenSearch 인덱스에 있는 모든 필드의 상위 세트가 되도록 AWS Glue 테이블을 생성하는 것이 좋습니다.
-
문서 – 데이터베이스 테이블 내의 레코드입니다.
-
데이터 스트림 - 여러 백업 인덱스로 구성된 시간 기반 데이터입니다. 자세한 내용은 OpenSearch 설명서의 Data streams
및 Amazon 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_mapping –
auto_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
여기서 street
는 address
구조 내부의 중첩 필드임).
다음 예제는 movies
테이블에 actor
및 genre
목록을 정의합니다.
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
로 변환할 때 나노초는 가장 가까운 밀리초로 반올림됩니다.date
및date_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
binary
는Base64
를 사용하여 인코딩된 바이너리 값의 문자열 표현이며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 커넥터에서 패스스루 쿼리를 사용하려면 다음 구문을 사용합니다.
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''}}}}" ))
추가 리소스
-
Amazon Athena OpenSearch 커넥터를 사용하여 단일 쿼리로 Amazon OpenSearch Service와 Amazon S3에서 데이터를 쿼리하는 방법에 대한 문서는 AWS 빅 데이터 블로그의 Query data in Amazon OpenSearch Service using SQL from Amazon Athena
를 참조하세요. 이 커넥터에 대한 추가 정보를 알아보려면 GitHub.com의 해당 사이트
를 참조하세요.