제퍼넷 로고

Amazon Athena 매개변수화된 쿼리를 사용하여 재사용성 및 보안 개선

시간

아마존 아테나 데이터를 쉽게 분석할 수 있는 서버리스 대화형 쿼리 서비스입니다. 아마존 단순 스토리지 서비스 (Amazon S3) 표준 SQL을 사용하는 경우에만 쿼리로 스캔한 데이터 양에 대한 비용 지불. SQL을 사용하여 매일 비즈니스를 분석하는 경우 동일한 쿼리를 반복적으로 실행하거나 약간의 조정으로 유사한 쿼리를 실행하고 있는 자신을 발견할 수 있습니다. Athena 매개변수화된 쿼리를 사용하면 다음을 수행할 수 있습니다. 진술을 준비하다 런타임에 제공하는 다른 인수 값으로 재사용할 수 있습니다. Athena 매개변수화된 쿼리는 또한 SQL 주입 공격에 대한 보안 계층을 제공하고 쿼리 문자열을 마스킹합니다. AWS 클라우드 트레일 민감한 데이터가 있는 워크로드용.

이 게시물은 Athena에서 매개변수화된 쿼리를 생성하고 실행하는 방법을 보여줍니다. 이 게시물은 Athena 매개변수화된 쿼리가 SQL 주입으로부터 보호하는 방법의 예를 제공하고 마스킹된 쿼리 문자열이 있는 CloudTrail 이벤트를 보여줍니다. 마지막으로 포스트에서는 Athena 준비된 명세서 관리와 관련된 기능을 검토합니다. 따라하고 싶다면 이 게시물에서 샘플 데이터 세트로 구성 요소를 설정하는 단계를 제공합니다. 또는 자체 데이터세트를 사용할 수 있습니다.

재사용 성

Athena 준비 문을 사용하면 Athena 작업 그룹 내에서 쿼리를 실행하고 재사용할 수 있습니다. 코드에서 쿼리를 분리하여 준비된 명령문과 애플리케이션을 서로 독립적으로 업데이트할 수 있습니다. 데이터 레이크에 스키마 업데이트가 있는 경우 쿼리 업데이트가 필요할 수 있습니다. 여러 애플리케이션이 동일한 Athena 작업 그룹을 공유하고 유사한 쿼리를 사용하는 경우 각 애플리케이션이 자체 소스 코드에서 유사한 쿼리를 조정할 필요 없이 여러 사용 사례를 제공하도록 새 쿼리를 생성하거나 기존 쿼리를 업데이트할 수 있습니다. 매개변수화된 쿼리는 현재 SELECT, INSERT IGNORE INTO, CTAS 및 UNLOAD 문에 대해 지원됩니다. 최신 목록은 의 고려 사항 및 제한 사항을 참조하십시오. 준비된 명령문으로 쿼리하기.

보안

Athena에서 준비한 문은 SQL 주입에 대한 보호 계층을 제공합니다. 애플리케이션 인터페이스 뒤에서 Athena를 사용하는 경우 자유 텍스트 입력은 본질적으로 SQL 주입 위협 벡터를 제공하며, 이를 완화하지 않으면 데이터 유출이 발생할 수 있습니다. 매개변수화된 쿼리가 실행되면 Athena는 인수를 실행 가능한 명령이나 SQL 연산자와 같은 SQL 조각이 아닌 리터럴 값으로 해석합니다.

아테나를 사용할 때, CloudTrail은 모든 Athena API 호출을 캡처합니다. AWS 사용자, 역할 또는 AWS 서비스가 수행한 작업의 기록을 제공하는 감사 이벤트로. 개인 식별 정보(PII)와 같은 민감한 데이터가 데이터 레이크에 있는 고객은 규정 준수를 위해 CloudTrail 이벤트 기록에 쿼리 문자열을 원하지 않는다고 말했습니다. 매개변수화된 쿼리를 실행할 때 쿼리 문자열은 다음으로 마스킹됩니다. HIDDEN_DUE_TO_SECURITY_REASONS CloudTrail 이벤트에서 보호된 데이터를 로그 스트림에 표시하지 않도록 합니다.

솔루션 개요

이 게시물은 public을 사용하는 단계를 문서화합니다. Amazon.com 고객 리뷰 데이터 세트; 그러나 유사한 단계에 따라 고유한 데이터 세트를 사용할 수 있습니다.

예제 쿼리는 다른 고객이 가장 유용하다고 투표한 제품의 별 4개(별점 5개 중) 리뷰를 찾는 것입니다. 쿼리 이면의 의도는 건설적인 제품 피드백을 나타내는 쿼리 결과를 찾는 것입니다. 의도는 피드백을 검증하고 제품 로드맵에 통합된 유용한 피드백을 얻는 것입니다. 이 사용 사례에 사용된 제품은 Amazon Smile eGift Card입니다.

사전 조건

전제 조건으로 SQL 구문에 대한 기본 이해와 다음 AWS 서비스에 대한 기본 이해가 필요합니다.

이 게시물은 다음을 가지고 있다고 가정합니다.

  • 생성된 CloudTrail 추적 – 지침은 다음을 참조하십시오. 트레일 생성.
  • 생성된 S3 버킷 – 지침은 다음을 참조하십시오. 버킷 만들기.

예시 데이터세트에 대한 리소스 배포

예제 데이터 세트를 사용하는 경우 이 섹션의 단계를 따르세요. 데이터는 AWS 관리형 AWS 계정의 S3 버킷에 있습니다. 시작하려면 Athena 및 AWS Glue 리소스를 생성해야 합니다.

이 게시물은 AWS 계정에 다음 리소스를 배포하는 CloudFormation 템플릿을 제공합니다.

  • 아테나워크그룹 - Athena 작업 그룹 데이터세트 및 준비된 명령문에 대해 콘솔에서 이 작업 그룹의 이름은 PreparedStatementsWG.
  • 접착제 데이터베이스 – 테이블 메타데이터용 AWS Glue 데이터 카탈로그의 데이터베이스. 데이터베이스의 이름은 athena_prepared_statements.
  • GlueTableAmazon리뷰 – 데이터 카탈로그의 Amazon.com 고객 리뷰가 있는 외부 테이블.

다음 다이어그램은 쿼리가 실행될 때 리소스가 상호 작용하는 방식을 보여줍니다.
고객의 AWS 계정과 AWS 관리형 AWS 계정을 나타내는 다이어그램. 고객 계정에는 지역 상자가 있습니다. 이 지역에는 3단계를 수행하는 Amazon Athena 작업 그룹이 있습니다. 첫 번째 단계에서 작업 그룹은 default라는 AWS Glue 데이터 카탈로그의 메타데이터에 액세스합니다. 카탈로그에는 속성과 S3 버킷 위치가 있는 amazon_reviews_parquet이라는 AWS Glue 테이블에 대한 점선이 있습니다. 작업 그룹의 두 번째 단계는 S3 버킷의 데이터를 쿼리합니다. S3 버킷은 AWS 관리형 AWS 계정에 있습니다. 버킷은 Amazon 고객 리뷰 데이터 세트용입니다. 세 번째 단계에서 작업 그룹은 쿼리 결과를 고객 AWS 계정의 Amazon S3 버킷에 저장합니다. 그러면 Athena 작업 그룹에 대한 읽기 액세스 권한이 있는 사용자가 쿼리 결과를 읽을 수 있습니다.

CloudFormation 템플릿을 배포하려면 다음 단계를 따르세요.

  1. 이 게시물로 이동 GitHub 저장소.
  2. 저장소 복제 또는 CloudFormation 템플릿 복사 athena-prepared-statements.yaml.
  3. AWS CloudFormation 콘솔에서 스택 생성.< /리>
  4. 선택 템플릿 파일 업로드 선택하고 파일 선택.
  5. 가이드라가 athena-prepared-statements.yaml다음을 선택 다음 보기.
  6. 스택 세부 사항 지정 페이지, 스택 이름 입력 athena-prepared-statements-blog.
  7. 럭셔리 S3QueryResults버킷 이름, S3 버킷 이름을 입력합니다.
  8. 만약 네가 떠난다면 AthenaWorkGroup 이름 기본적으로 Athena 작업 그룹의 이름은 PreparedStatementsWG. 값을 변경하는 경우 Athena 작업 그룹 이름은 AWS 리전에서 고유해야 합니다.
  9. 왼쪽 메뉴에서 다음 보기.
  10. 스택 옵션 구성 페이지에서 선택 다음 보기.
  11. 검토 페이지에서 선택 스택 생성.

스크립트를 실행하고 변경하는 데 XNUMX분이 채 걸리지 않습니다. CREATE_COMPLETE 상태. 동일한 AWS 계정 및 리전에 스택을 두 번 배포하는 경우 AWS Glue 데이터베이스, 테이블 또는 Athena 작업 그룹이 이미 존재할 수 있으며 리소스가 이미 다른 템플릿에 있음을 나타내는 메시지와 함께 프로세스가 실패합니다.

CloudFormation 템플릿 배포를 위한 최소 권한 권한 부여를 위해 다음을 생성할 수 있습니다. AWS CloudFormation 서비스 역할 다음 IAM 정책 작업으로. 이렇게 하려면 생성해야 합니다. IAM 정책IAM 역할, 스택 옵션을 구성할 때 이 역할을 선택합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateDatabase" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements" ] }, { "Effect": "Allow", "Action": [ "glue:DeleteDatabase" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements", "arn:${Partition}:glue:${Region}:${Account}:table/athena_prepared_statements/*", "arn:${Partition}:glue:${Region}:${Account}:userDefinedFunction/athena_prepared_statements/*" ] }, { "Effect": "Allow", "Action": [ "glue:CreateTable" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements", "arn:${Partition}:glue:${Region}:${Account}:table/athena_prepared_statements/amazon_reviews_parquet" ] }, { "Effect": "Allow", "Action": [ "glue:DeleteTable" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements", "arn:${Partition}:glue:${Region}:${Account}:table/athena_prepared_statements/amazon_reviews_parquet" ] }, { "Effect": "Allow", "Action": [ "athena:CreateWorkGroup", "athena:DeleteWorkGroup", "athena:GetWorkGroup" ], "Resource": "arn:${Partition}:athena:${Region}:${Account}:workgroup/PreparedStatementsWG" } ]
}

CloudFormation 템플릿을 실행하고 따라가는 IAM 보안 주체에 대한 권한 부여를 위해 이 게시물은 다음 AWS 관리형 정책과 아래 고객 관리형 정책으로 테스트되었습니다.

AWS 관리형 정책:

  • AmazonAthena전체 액세스
  • AWSCloudTrailReadOnly액세스
  • AWSCloudFormation전체 액세스

고객 관리 정책:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewS3BucketsWithoutErrors", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "*" ] }, { "Sid": "InteractWithMyBucketAndDataSetBucket", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::${my-bucket-name}*", "arn:aws:s3:::amazon-reviews-pds*" ] }, { "Sid": "UploadCloudFormationTemplate", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::cf-template*" }, { "Sid": "CleanUpResults", "Effect": "Allow", "Action": [ "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::${my-bucket-name}/results*" ] }, { "Sid": "ListRolesForCloudFormationDeployment", "Effect": "Allow", "Action": [ "iam:ListRoles" ], "Resource": [ "*" ] }, { "Sid": "IAMRoleForCloudFormationDeployment", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:${Partition}:iam::${Account}:role/${role-name}" ], "Condition": { "StringEquals": { "iam:PassedToService": "cloudformation.amazonaws.com" } } } ]
}

예시 데이터세트 분할

CloudFormation 템플릿은 Amazon.com의 130억 XNUMX천만 개 이상의 고객 리뷰 데이터 세트를 가리키는 외부 테이블을 생성했습니다. 데이터 분할 각 쿼리에서 스캔하는 데이터의 양을 제한하여 쿼리 성능을 개선하고 비용을 절감합니다. 이 데이터 세트의 외부 테이블에는 Hive 호환 파티션이 있습니다. MSCK REPAIR TABLE SQL 문은 S3 버킷의 접두사 경로를 스캔하고 파티션 메타데이터로 Data Catalog의 메타데이터를 업데이트합니다. 데이터세트에 액세스하려면 외부 테이블의 파티션을 업데이트해야 합니다.

CloudFormation 템플릿을 배포한 후 다음 단계를 완료하십시오.

  1. Athena 콘솔에서 쿼리 편집기 탐색 창에서
  2. 럭셔리 데이터 소스, 입력 AwsDataCatalog.
  3. 럭셔리 데이터베이스, 입력 athena_prepared_statements.
  4. 작업 그룹 드롭 다운 메뉴에서 준비된 진술WG.
  5. 왼쪽 메뉴에서 인정 확인.
  6. 쿼리 편집기 창에서 외부 테이블에 대해 다음 SQL 문을 실행합니다.
MSCK REPAIR TABLE athena_prepared_statements.amazon_reviews_parquet;

이 쿼리는 다음에서 테스트할 때 실행하는 데 약 15초가 걸립니다. us-east-1.

  1. 다음 쿼리를 실행하여 사용 가능한 파티션을 나열합니다. 예제 데이터세트에는 다음을 기반으로 하는 파티션이 있습니다. product_category.
SHOW PARTITIONS athena_prepared_statements.amazon_reviews_parquet;
  1. SELECT 문을 실행하여 테이블에서 사용 가능한 데이터 샘플을 출력합니다.
SELECT * FROM athena_prepared_statements.amazon_reviews_parquet limit 10;

준비된 문 만들기

Athena 매개변수화된 쿼리를 사용하려면 먼저 PREPARE SQL 문을 실행하고 물음표로 표시된 위치 매개변수를 지정합니다. Athena에서 준비한 명령문은 지정한 이름으로 저장됩니다.

Athena 쿼리 편집기에서 다음 PREPARE 문을 실행합니다. 이 예제 쿼리는 product_helpful_reviews, 지정된 제품 ID에 대한 세 가지 매개변수, 리뷰어가 제공한 별점, 다른 Amazon.com 고객이 리뷰에 제공한 최소 도움 투표 수를 고객 리뷰에 제공합니다.

PREPARE product_helpful_reviews FROM
SELECT product_id, product_title, star_rating, helpful_votes, review_headline, review_body
FROM amazon_reviews_parquet WHERE product_id = ? AND star_rating = ? AND helpful_votes > ?
ORDER BY helpful_votes DESC
LIMIT 10;

CreatePreparedStatement API 또는 SDK를 사용할 수도 있습니다. 예를 들어 AWS CLI에서 준비된 명령문을 생성하려면 다음 명령을 실행합니다.

aws athena create-prepared-statement --statement-name "product_helpful_reviews" --query-statement "SELECT product_id, product_title, star_rating, helpful_votes, review_headline, review_body FROM amazon_reviews_parquet WHERE product_id = ? AND star_rating = ? AND helpful_votes > ? ORDER BY helpful_votes DESC LIMIT 10;" --work-group PreparedStatementsWG --region region

준비된 문 생성에 대한 자세한 내용은 SQL 문을 참조하십시오. 준비된 명령문으로 쿼리하기.

매개변수화된 쿼리 실행

EXECUTE SQL 문 및 USING 절을 사용하여 준비된 문에 대해 매개변수화된 쿼리를 실행할 수 있습니다. USING 절은 준비된 문의 매개변수에 대한 인수 값을 지정합니다.

Athena 쿼리 편집기에서 다음 EXECUTE 문을 실행합니다. 이전 섹션에서 생성된 준비된 명령문은 최소 4개의 유용한 투표가 포함된 Amazon Smile eGift Card 제품 ID에 대한 별 10개 리뷰를 출력하는 매개변수와 함께 실행됩니다.

EXECUTE product_helpful_reviews USING 'BT00DDVMVQ', 4, 10;

메시지를 받으면 PreparedStatement product_helpful_reviews was not found in workGroup primary, 선택했는지 확인하십시오 PreparedStatementsWG 작업 그룹.

매개변수화된 쿼리 실행에 대한 자세한 내용은 SQL 문을 참조하십시오. 준비된 명령문으로 쿼리하기.

매개변수화된 쿼리를 사용하여 CloudTrail 이벤트의 쿼리 문자열 데이터 마스킹

매개변수화된 쿼리를 사용하여 CloudTrail 이벤트에 표시되는 쿼리 문자열에서 민감한 데이터를 수정할 수 있습니다. 예를 들어, PII가 매개변수로 포함된 열이 있을 수 있으며 이를 로그에 표시하지 않을 수 있습니다. Athena는 EXECUTE 문에 대한 CloudTrail 이벤트의 쿼리 문자열을 자동으로 마스킹하여 쿼리 문자열을 값으로 바꿉니다. HIDDEN_DUE_TO_SECURITY_REASONS. 이렇게 하면 로그 스트림에 보호된 데이터가 표시되는 것을 방지할 수 있습니다.

쿼리에 대한 CloudTrail 이벤트에 액세스하려면 다음 단계를 완료하십시오.

  1. 로 이동 이벤트 이력 CloudTrail 콘솔의 페이지입니다.
  2. 드롭 다운 메뉴에서 이벤트 이름.
  3. 에 대한 검색 StartQueryExecution 이벤트.

매개변수화된 쿼리에 대한 CloudTrail 이벤트 레코드에는 다음이 포함됩니다. queryString 값이 수정됨 HIDDEN_DUE_TO_SECURITY_REASONS. 쿼리 문자열은 Athena 작업 그룹의 쿼리 기록에서 볼 수 있습니다. 작업 그룹 설정에서 Athena, AWS Glue 데이터 카탈로그 및 Amazon S3 쿼리 출력 위치에 대한 최소 권한 IAM 정책을 사용하여 액세스를 제어할 수 있습니다. 최근 쿼리 보기에 대한 자세한 내용은 다음을 참조하세요. 최근 쿼리 보기. IAM 정책에 대한 자세한 내용은 다음을 참조하십시오. AWS 서비스에 대한 작업, 리소스 및 조건 키.

SQL 주입을 위한 보호 계층

이 섹션에서는 SQL 주입 공격의 예와 준비된 명령문이 동일한 공격으로부터 어떻게 보호할 수 있는지 보여줍니다. Athena 콘솔을 사용하여 StartQueryExecution 명명된 테이블에 대한 API users 세 줄로.

SQL 삽입은 명령문을 변경하고 데이터 세트의 테이블에서 데이터를 추출하라는 요청에 악성 SQL 코드를 삽입하려는 시도입니다. Athena 매개 변수화된 쿼리가 없으면 데이터 세트를 직접 쿼리하거나 SQL 쿼리에 사용자 입력을 추가하고 사용자가 SQL 조각을 추가할 수 있는 경우 데이터 세트는 결과 세트에 무단 데이터를 반환하는 SQL 주입 공격에 취약할 수 있습니다.

이 게시물은 악의적인 방식으로 SQL 조각을 삽입하는 예를 보여줍니다. 예에서 항상 true를 반환하는 OR 조건(예: OR 1=1)는 WHERE 절에 추가됩니다. 동일한 예제 쿼리가 Athena 매개 변수화된 쿼리와 함께 표시되며 매개 변수 값이 정수여야 하지만 "OR" 문자가 포함되어 있기 때문에 잘못된 매개 변수 값이 포함되어 쿼리가 실패합니다. 매개변수가 문자열 열을 기반으로 하는 경우 위치 인수가 리터럴 매개변수 값으로 해석되기 때문에 동일한 SQL 주입 시도로 쿼리가 결과를 반환하지 않을 것입니다.

Athena는 다중 문 SQL 주입 공격에 대한 추가 방어 계층을 제공합니다. 실행 가능한 명령(예: DROP)으로 SQL 주입을 수행하려고 하면 Athena에서 오류를 제공하는 쿼리가 실패함 Only one sql statement is allowed, Athena는 SQL 문 제출당 하나의 실행 가능한 명령만 수락하기 때문입니다.

Athena에서 준비한 문은 SQL 주입 공격에 대한 보호 계층을 제공하지만 다른 예방 조치는 추가 방어 계층을 제공합니다. Athena에서 준비한 진술은 심층 방어 전략의 일부가 될 수 있습니다. 보안 계층에 대한 자세한 내용은 다음을 참조하십시오. 아마존 아테나 보안.

SQL 인젝션 예제

예제에서 SELECT 쿼리의 의도된 사용은 작은 값 집합을 수신하는 것입니다. 그러나 공격자는 입력을 조작하여 악성 SQL 코드를 추가할 수 있습니다. 예를 들어 공격자는 다음 값을 입력할 수 있습니다. 1 OR 1=1, WHERE 절에 true 조건을 추가하고 테이블의 모든 레코드를 반환합니다.

SELECT * FROM users WHERE id = 1 OR 1=1;

공격자는 악성 SQL 코드를 추가하여 모든 행을 검색할 수 있습니다. users 다음 스크린샷과 같이 표입니다.
Athena 그래픽 사용자 인터페이스의 이미지. 쿼리 SELECT * FROM 사용자 WHERE id = 1 OR 1=1; 실행되었습니다. id가 3, 1, 2인 테이블의 모든 3명의 사용자가 테이블의 모든 열과 함께 반환되었습니다.

준비된 명령문으로 SQL 주입 시도

이전 예제와 동일한 쿼리로 준비된 명령문을 생성하면 실행 가능한 명령이 매개변수 값에 대한 리터럴 인수로 전달됩니다. 사용자가 추가 SQL을 전달하려고 하면 WHERE 절이 정수 값을 예상하는 ID를 기반으로 하기 때문에 구문 오류가 발생합니다.

  1. 동일한 쿼리를 사용하여 준비된 명령문을 작성하십시오. users 표:
PREPARE get_user FROM SELECT * FROM users WHERE id = ?
  1. 매개변수를 올바른 값으로 설정합니다.
EXECUTE get_user USING 1

다음 스크린샷과 같이 예상 결과가 반환됩니다.

EXECUTE get_user USING 1 쿼리를 실행하는 Athena의 그래픽 사용자 인터페이스. ID가 1인 사용자만 반환됩니다.

  1. 이제 악성 값을 전달하려고 합니다.
EXECUTE get_user USING 1 OR 1=1

이 준비된 명령문을 실행하면 정수 값이 필요하지만 잘못된 정수 값을 받기 때문에 구문 오류가 발생합니다. 1 OR 1=1. 쿼리 및 구문 오류는 다음 스크린샷에 나와 있습니다.

EXECUTE get_user USING 1 OR 1=1을 쿼리하는 Athena의 그래픽 사용자 인터페이스. 오류가 있습니다. 오류는 "SYNTAX_ERROR: 라인 1:24: 논리 표현식의 왼쪽은 부울(실제: 정수)로 평가되어야 합니다. 이 쿼리는 쿼리에 의해 한정되지 않는 한 "기본" 데이터베이스에 대해 실행되었습니다. 법정."

준비된 문장으로 작업하기

이 섹션에서는 준비된 명령문으로 더 쉽게 작업할 수 있도록 하는 관리 기능에 대해 설명합니다.

내 AWS 계정에 준비된 모든 명세서 나열

Athena 작업 그룹에서 준비된 모든 명령문을 나열하려면 AWS 명령 줄 인터페이스 (AWS CLI)에서 다음 명령을 실행할 수 있습니다.

aws athena list-prepared-statements --work-group workgroup_name --region region_name

위의 예를 따르면 명령은 다음 응답을 반환합니다.

{ "PreparedStatements": [ { "StatementName": "product_helpful_reviews", "LastModifiedTime": "2022-01-14T15:33:07.935000+00:00" } ]
}

AWS 계정에서 사용 가능한 모든 준비된 명령문을 나열하려면 AWS API를 사용할 수 있습니다. 이 게시물은 다음을 사용하여 샘플 스크립트를 제공합니다. Python 용 AWS SDK (Boto3) 계정의 모든 리전을 순환하고 Athena 작업 그룹별로 준비된 설명을 제공합니다.

Python 스크립트를 실행할 AWS 자격 증명이 있는지 확인하십시오. 자세한 내용은 다음을 참조하십시오. 신임장.

클론 GitHub 레포 또는 Python 스크립트를 복사하십시오. list-prepared-statements.py 리포지토리에서 스크립트를 실행합니다.

python3 list-prepared-statements.py

교체 <my-profile-name> 메시지가 표시될 때 AWS 프로필 이름을 사용하거나 기본 로컬 자격 증명을 사용하려면 비워 둡니다.

Enter the AWS CLI profile name or leave blank if using instance profile: <my-profile-name>

다음 텍스트는 스크립트의 출력입니다. 따라하면 응답은 product_helpful_reviews 준비된 성명서.

eu-north-1:
ap-south-1:
eu-west-3:
eu-west-2:
eu-west-1:
ap-northeast-3:
ap-northeast-2:
ap-northeast-1:
sa-east-1:
ca-central-1:
ap-southeast-1:
ap-southeast-2:
eu-central-1:
us-east-1: athena-v2-wg: my_select PreparedStatementsWG: get_user PreparedStatementsWG: get_contacts_by_company PreparedStatementsWG: product_helpful_reviews PreparedStatementsWG: count_stars PreparedStatementsWG: helpful_reviews PreparedStatementsWG: get_product_info PreparedStatementsWG: check_avg_stars_of_category PreparedStatementsWG: my_select_v1 PreparedStatementsWG: my_select_v2
us-east-2:
us-west-1:
us-west-2:

준비된 명령문 업데이트

준비된 명령문을 업데이트하기 위한 몇 가지 옵션이 있습니다. 쿼리 성능을 최적화하거나 선택한 값을 변경하거나 기타 여러 가지 이유로 이 작업을 수행할 수 있습니다.

  1. Athena 쿼리 편집기의 변경 사항으로 PREPARE 문을 다시 실행하거나 StartQueryExecution API.
  2. 사용 UpdatePreparedStatement AWS CLI 또는 SDK를 통한 API.

이 API를 사용하여 준비된 명령문에 설명을 추가하거나 쿼리를 업데이트할 수 있습니다. 이 방법을 통해 쿼리 명령문을 업데이트하려면 명령문 이름, 작업 그룹 이름, 업데이트된 쿼리 명령문 및 선택적으로 새 설명을 제공해야 합니다. 에 대한 자세한 내용은 UpdatePreparedStatement API, 참조 업데이트-준비-문.

쿼리 버전을 출시할 수 있습니다. 사용자에 대한 이전 버전과의 호환성을 유지하기 위해 다른 이름으로 준비된 새 명령문을 만들 수 있습니다. 예를 들어, 준비된 명령문은 이름에 버전 번호를 가질 수 있습니다(예: my_select_v1my_select_v2). 필요한 경우 준비된 명령문에 의존하는 팀에 변경 사항을 알리고 나중에 이전 준비된 명령문 버전의 할당을 해제할 수 있습니다.

준비된 명령문 삭제

준비된 명령문을 삭제하려면 다음 쿼리 구문을 사용할 수 있습니다. StartQueryExecution API 또는 Athena 쿼리 편집기 내에서:

DEALLOCATE PREPARE product_helpful_reviews

당신은 또한 DeletePreparedStatement API 또는 SDK. 예를 들어 AWS CLI에서 준비된 명령문을 삭제하려면 다음 명령을 실행합니다.

aws athena delete-prepared-statement --statement-name product_helpful_reviews --work-group PreparedStatementsWG --region region

정리

이 게시물을 따르면 비용이 발생할 수 있는 여러 구성 요소를 만들었습니다. 향후 요금이 청구되지 않도록 하려면 다음 단계에 따라 리소스를 제거하십시오.

  1. S3 버킷의 결과 접두사 삭제 작업 그룹에서 쿼리를 실행한 후 생성됩니다.

기본 템플릿을 사용하면 이름이 <S3QueryResultsBucketName>/athena-results. 이 단계에서 주의하십시오. 당신이 아니라면 S3 버킷에서 버전 관리 사용, S3 객체 삭제는 취소할 수 없습니다.

  1. PreparedStatementsWG에서 Athena 준비된 문 삭제

다음 단계를 수행할 수 있습니다. 준비된 명령문 삭제 DEALLOCATE PREPARE 문 또는 delete-prepared-statement 생성한 각 준비된 문에 대한 API입니다.

  1. CloudFormation 스택을 제거하려면 AWS CloudFormation 콘솔에서 스택을 선택하고 다음을 선택합니다. ., 확인합니다.

결론

Athena 매개변수화된 쿼리를 사용하면 Athena 작업 그룹 내에 공통 쿼리를 저장하는 방법을 제공하여 쿼리에서 코드 기반을 쉽게 분리할 수 있습니다. 이 게시물은 Athena 매개변수화된 쿼리가 코드 재사용성과 데이터 레이크 보안을 향상시키는 방법에 대한 정보를 제공했습니다. 지금 샘플 데이터 레이크를 설정하고 매개변수화된 쿼리를 사용하는 방법을 보여주었습니다. 또한 매개변수화된 쿼리가 제공하는 보호 기능의 예와 자세한 추가 관리 기능도 제공했습니다.

다음을 통해 Athena에서 준비한 진술을 시작할 수 있습니다. 아테나 콘솔Walk Through California 프로그램, AWS CLI, 또는 AWS SDK. Athena에 대한 자세한 내용은 다음을 참조하십시오. Amazon Athena 사용 설명서.

이 게시물을 읽어 주셔서 감사합니다! Athena 매개변수화된 쿼리에 대해 질문이 있는 경우 주저하지 말고 댓글 섹션에 댓글을 남겨주세요.


저자에 관하여

블레이즈 스테파니아크 공공 부문, 연방 금융 및 의료 기관과 협력하는 AWS의 수석 솔루션 설계자입니다. Blayze는 피츠버그에 기반을 두고 있습니다. 그는 복잡한 상황을 실용적이고 실행 가능한 것으로 분해하는 데 열정적입니다. 관심 분야는 인공 지능, 분산 시스템 및 Excel 공식 체조입니다. Blayze는 펜실베니아의 Clarion University에서 회계 학사 및 정보 시스템 학사 학위를 받았습니다. 여가 시간에는 Blayze가 Star Wars 오디오북을 듣고 강아지를 웃게 만들려고 하고 아마도 벙어리로 말하는 것을 볼 수 있습니다.

다니엘 타타르킨 연방 금융 기관을 지원하는 AWS(Amazon Web Services)의 솔루션 설계자입니다. 그는 빅 데이터 분석과 서버리스 기술에 열정적입니다. 직장 밖에서 그는 개인 금융, 커피에 대해 배우고 재미로 새로운 프로그래밍 언어를 시도하는 것을 즐깁니다.

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?