Logo Zephyrnet

Cải thiện khả năng tái sử dụng và bảo mật bằng cách sử dụng các truy vấn được tham số hóa của Amazon Athena

Ngày:

amazon Athena là một dịch vụ truy vấn tương tác không máy chủ giúp dễ dàng phân tích dữ liệu trong Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) sử dụng SQL tiêu chuẩn và bạn chỉ thanh toán cho lượng dữ liệu được quét bởi các truy vấn của bạn. Nếu bạn sử dụng SQL để phân tích doanh nghiệp của mình hàng ngày, bạn có thể thấy mình đang chạy lặp lại các truy vấn giống nhau hoặc các truy vấn tương tự với những điều chỉnh nhỏ. Các truy vấn được tham số hóa Athena cho phép bạn chuẩn bị các tuyên bố bạn có thể sử dụng lại với các giá trị đối số khác nhau mà bạn cung cấp tại thời điểm chạy. Các truy vấn được tham số hóa Athena cũng cung cấp một lớp bảo mật chống lại các cuộc tấn công chèn vào SQL và che giấu chuỗi truy vấn trong Đường mòn đám mây AWS cho khối lượng công việc có dữ liệu nhạy cảm.

Bài đăng này hướng dẫn bạn cách tạo và chạy các truy vấn được tham số hóa trong Athena. Bài đăng này cung cấp một ví dụ về cách các truy vấn được tham số hóa Athena bảo vệ khỏi việc đưa vào SQL và hiển thị các sự kiện CloudTrail với chuỗi truy vấn được che giấu. Cuối cùng, bài đăng đánh giá các chức năng liên quan đến việc quản lý các báo cáo chuẩn bị của Athena. Nếu bạn muốn làm theo, bài đăng này cung cấp các bước để thiết lập các thành phần với một tập dữ liệu mẫu; cách khác, bạn có thể sử dụng tập dữ liệu của riêng mình.

Tái sử dụng

Các câu lệnh do Athena chuẩn bị cho phép bạn chạy và sử dụng lại các truy vấn trong nhóm làm việc Athena của bạn. Bằng cách tách các truy vấn khỏi mã, bạn có thể cập nhật các báo cáo đã chuẩn bị và các ứng dụng của mình độc lập với nhau. Nếu một hồ dữ liệu có cập nhật giản đồ, nó có thể yêu cầu cập nhật truy vấn. Nếu nhiều ứng dụng chia sẻ cùng một nhóm làm việc Athena và đang sử dụng các truy vấn tương tự, bạn có thể tạo một truy vấn mới hoặc cập nhật truy vấn hiện có để phục vụ nhiều trường hợp sử dụng mà không cần mỗi ứng dụng phải điều chỉnh các truy vấn tương tự trong mã nguồn của riêng chúng. Các truy vấn tham số hiện được hỗ trợ cho các câu lệnh SELECT, INSERT IGNORE INTO, CTAS và UNLOAD. Để có danh sách mới nhất, hãy tham khảo Cân nhắc và Hạn chế trong Truy vấn với các câu lệnh soạn sẵn.

Bảo mật

Các câu lệnh do Athena chuẩn bị cung cấp một lớp bảo vệ chống lại việc tiêm SQL. Nếu bạn đang sử dụng Athena đằng sau một giao diện ứng dụng, các đầu vào văn bản miễn phí vốn có một vectơ đe dọa tiêm SQL, nếu không được điều chỉnh, có thể dẫn đến việc lọc dữ liệu. Khi truy vấn tham số hóa được chạy, Athena diễn giải các đối số dưới dạng giá trị chữ, không phải là lệnh thực thi cũng như các đoạn SQL như toán tử SQL.

Khi sử dụng Athena, CloudTrail nắm bắt tất cả các lệnh gọi API Athena dưới dạng các sự kiện kiểm tra để cung cấp hồ sơ về các hành động được thực hiện bởi người dùng AWS, vai trò hoặc dịch vụ AWS. Những khách hàng có dữ liệu nhạy cảm trong hồ dữ liệu của họ, chẳng hạn như thông tin nhận dạng cá nhân (PII), đã nói với chúng tôi rằng họ không muốn các chuỗi truy vấn trong lịch sử sự kiện CloudTrail của họ vì lý do tuân thủ. Khi chạy các truy vấn được tham số hóa, chuỗi truy vấn được che bằng HIDDEN_DUE_TO_SECURITY_REASONS trong sự kiện CloudTrail, vì vậy bạn không hiển thị dữ liệu được bảo vệ trong các luồng nhật ký của mình.

Tổng quan về giải pháp

Bài đăng này ghi lại các bước sử dụng công khai Tập dữ liệu đánh giá khách hàng của Amazon.com; tuy nhiên, bạn có thể làm theo các bước tương tự để sử dụng tập dữ liệu của riêng mình.

Truy vấn ví dụ là tìm các bài đánh giá 4 sao (trong số 5 sao) của một sản phẩm được các khách hàng khác bình chọn là hữu ích nhất. Mục đích đằng sau truy vấn là tìm kết quả truy vấn cho biết phản hồi về sản phẩm có tính xây dựng. Mục đích là xác thực phản hồi và nhận phản hồi hữu ích được đưa vào lộ trình sản phẩm. Sản phẩm được sử dụng trong trường hợp sử dụng này là Thẻ Amazon Smile eGift.

Điều kiện tiên quyết

Như một điều kiện tiên quyết, bạn cần có hiểu biết cơ bản về cú pháp SQL, cũng như hiểu biết cơ bản về các dịch vụ AWS sau:

Bài đăng này giả sử bạn có:

  • Một đường mòn CloudTrail đã được tạo - để biết hướng dẫn, hãy tham khảo Tạo đường mòn.
  • Đã tạo nhóm S3 - để biết hướng dẫn, hãy tham khảo Tạo một thùng.

Triển khai tài nguyên cho tập dữ liệu mẫu

Nếu bạn đang sử dụng tập dữ liệu mẫu, hãy làm theo các bước trong phần này. Dữ liệu nằm trong nhóm S3 trong tài khoản AWS do AWS quản lý. Bạn cần tạo tài nguyên Athena và AWS Glue để bắt đầu.

Bài đăng này cung cấp mẫu CloudFormation triển khai các tài nguyên sau trong tài khoản AWS của bạn:

  • AthenaNhóm Làm Việc - An Nhóm làm việc Athena cho tập dữ liệu của bạn và các báo cáo đã chuẩn bị. Trên bảng điều khiển, nhóm làm việc này được đặt tên là PreparedStatementsWG.
  • KeoCơ sở dữ liệu - Cơ sở dữ liệu trong Danh mục dữ liệu keo AWS cho siêu dữ liệu bảng. Cơ sở dữ liệu được đặt tên athena_prepared_statements.
  • KeoBảngAmazonNhận xét - Một bảng bên ngoài với các đánh giá của khách hàng Amazon.com trong Danh mục dữ liệu.

Sơ đồ sau đây cho thấy cách các tài nguyên tương tác khi truy vấn chạy.
Sơ đồ mô tả tài khoản AWS của khách hàng và tài khoản AWS do AWS quản lý. Trong tài khoản khách hàng, có một hộp khu vực. Trong khu vực, có một nhóm làm việc của Amazon Athena đang thực hiện 3 bước. Trong bước đầu tiên, nhóm làm việc truy cập siêu dữ liệu từ Danh mục dữ liệu AWS Glue có tên mặc định. Danh mục có một dòng chấm tới bảng AWS Glue được gọi là amazon_reviews_parquet, có các thuộc tính và vị trí nhóm S3. Bước thứ hai từ nhóm làm việc truy vấn dữ liệu từ nhóm S3. Nhóm S3 nằm trong tài khoản AWS do AWS quản lý. Nhóm này dành cho tập dữ liệu Đánh giá của khách hàng Amazon. Trong bước thứ ba, nhóm làm việc lưu trữ kết quả truy vấn trong nhóm Amazon S3 trong tài khoản AWS của khách hàng. Sau đó, kết quả truy vấn có thể được đọc bởi người dùng có quyền truy cập đọc vào nhóm làm việc Athena.

Để triển khai mẫu CloudFormation, hãy làm theo các bước sau:

  1. Điều hướng đến bài đăng này Kho GitHub.
  2. Sao chép kho lưu trữ hoặc sao chép mẫu CloudFormation athena-prepared-statements.yaml.
  3. Trên bảng điều khiển AWS CloudFormation, hãy chọn Tạo ngăn xếp.</li>
  4. Chọn Tải lên tệp mẫu Và chọn Chọn tập tin.
  5. Tải lên athena-prepared-statements.yaml, sau đó chọn Sau.
  6. trên Chỉ định chi tiết ngăn xếp trang, nhập tên ngăn xếp athena-prepared-statements-blog.
  7. Trong S3QueryResultsBuckName, nhập tên nhóm S3 của bạn.
  8. Nếu bạn đi AthenaTên nhóm làm việc theo mặc định, nhóm làm việc Athena được đặt tên là PreparedStatementsWG. Nếu bạn thay đổi giá trị, tên nhóm làm việc Athena phải là duy nhất trong Vùng AWS của bạn.
  9. Chọn Sau.
  10. trên Cấu hình tùy chọn ngăn xếp trang, chọn Sau.
  11. trên Đánh giá trang, chọn Tạo ngăn xếp.

Tập lệnh mất chưa đầy một phút để chạy và thay đổi thành CREATE_COMPLETE tình trạng. Nếu bạn triển khai ngăn xếp hai lần trong cùng một tài khoản AWS và Vùng, cơ sở dữ liệu AWS Glue, bảng hoặc nhóm làm việc Athena có thể đã tồn tại và quá trình không thành công với thông báo cho biết rằng tài nguyên đã tồn tại trong một mẫu khác.

Để ủy quyền ít đặc quyền nhất cho việc triển khai mẫu CloudFormation, bạn có thể tạo Vai trò dịch vụ AWS CloudFormation với các hành động chính sách IAM sau đây. Để làm điều này, bạn phải tạo một Chính sách IAMVai trò IAMvà chọn vai trò này khi định cấu hình các tùy chọn ngăn xếp.

{ "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" } ]
}

Để ủy quyền cho IAM chính chạy mẫu CloudFormation và sau đó, bài đăng này đã được thử nghiệm với các chính sách được AWS quản lý và chính sách do khách hàng quản lý bên dưới.

Các chính sách được AWS quản lý:

  • AmazonAthenaTruy cập đầy đủ
  • AWSCloudTrailReadOnlyAccess
  • AWSCloudFormationTruy cập đầy đủ

Chính sách do khách hàng quản lý:

{ "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" } } } ]
}

Phân vùng tập dữ liệu mẫu

Mẫu CloudFormation đã tạo một bảng bên ngoài trỏ đến tập dữ liệu hơn 130 triệu đánh giá của khách hàng từ Amazon.com. Dữ liệu phân vùng cải thiện hiệu suất truy vấn và giảm chi phí bằng cách hạn chế số lượng dữ liệu được quét bởi mỗi truy vấn. Bảng bên ngoài cho tập dữ liệu này có các phân vùng tương thích với Hive. Câu lệnh SQL MSCK REPAIR TABLE quét các đường dẫn tiền tố trong nhóm S3 và cập nhật siêu dữ liệu trong Danh mục dữ liệu bằng siêu dữ liệu phân vùng. Để truy cập tập dữ liệu, các phân vùng của bảng bên ngoài phải được cập nhật.

Sau khi bạn triển khai mẫu CloudFormation, hãy hoàn thành các bước sau:

  1. Trên bảng điều khiển Athena, chọn Trình chỉnh sửa truy vấn trong khung điều hướng.
  2. Trong Nguồn dữ liệu, đi vào AwsDataCatalog.
  3. Trong Cơ sở dữ liệu, đi vào athena_prepared_statements.
  4. trên Nhóm làm việc menu thả xuống, chọn Chuẩn bịBáo cáoWG.
  5. Chọn Công nhận xác nhận.
  6. Trong ngăn trình chỉnh sửa truy vấn, hãy chạy câu lệnh SQL sau cho bảng bên ngoài của bạn:
MSCK REPAIR TABLE athena_prepared_statements.amazon_reviews_parquet;

Truy vấn này mất khoảng 15 giây để chạy khi được kiểm tra trong us-east-1.

  1. Chạy truy vấn sau để liệt kê các phân vùng có sẵn. Tập dữ liệu mẫu có các phân vùng dựa trên product_category.
SHOW PARTITIONS athena_prepared_statements.amazon_reviews_parquet;
  1. Chạy câu lệnh SELECT để xuất ra một mẫu dữ liệu có sẵn trong bảng:
SELECT * FROM athena_prepared_statements.amazon_reviews_parquet limit 10;

Tạo báo cáo chuẩn bị

Để sử dụng truy vấn tham số Athena, trước tiên bạn chạy câu lệnh SQL PREPARE và chỉ định các tham số vị trí của bạn, được biểu thị bằng dấu chấm hỏi. Tuyên bố do Athena chuẩn bị được lưu trữ với tên do bạn chỉ định.

Chạy câu lệnh PREPARE sau trong trình soạn thảo truy vấn Athena. Truy vấn ví dụ này, được đặt tên là product_helpful_reviews, cung cấp cho các bài đánh giá của khách hàng với ba thông số cho một ID sản phẩm cụ thể, xếp hạng sao do người đánh giá cung cấp và số phiếu hữu ích tối thiểu được cung cấp cho bài đánh giá bởi các khách hàng Amazon.com khác.

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;

Bạn cũng có thể sử dụng SDK hoặc API CreatePreparedStatement. Ví dụ: để tạo câu lệnh đã chuẩn bị của bạn từ AWS CLI, hãy chạy lệnh sau:

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

Để biết thêm thông tin về cách tạo các câu lệnh chuẩn bị, hãy tham khảo Câu lệnh SQL trong Truy vấn với các câu lệnh soạn sẵn.

Chạy các truy vấn được tham số hóa

Bạn có thể chạy một truy vấn được tham số hóa đối với câu lệnh đã chuẩn bị sẵn với câu lệnh EXECUTE SQL và mệnh đề USING. Mệnh đề USING chỉ định các giá trị đối số cho các tham số của câu lệnh đã chuẩn bị.

Chạy câu lệnh EXECUTE sau trong trình soạn thảo truy vấn Athena. Tuyên bố chuẩn bị được tạo trong phần trước được chạy với các tham số để đưa ra đánh giá 4 sao cho ID sản phẩm Amazon Smile eGift Card với ít nhất 10 phiếu bầu hữu ích.

EXECUTE product_helpful_reviews USING 'BT00DDVMVQ', 4, 10;

Nếu bạn nhận được tin nhắn PreparedStatement product_helpful_reviews was not found in workGroup primary, hãy đảm bảo rằng bạn đã chọn PreparedStatementsWG nhóm làm việc.

Để biết thêm thông tin về cách chạy các truy vấn được tham số hóa, hãy tham khảo Câu lệnh SQL trong Truy vấn với các câu lệnh soạn sẵn.

Mặt nạ dữ liệu chuỗi truy vấn trong các sự kiện CloudTrail bằng cách sử dụng các truy vấn được tham số hóa

Bạn có thể muốn sử dụng các truy vấn được tham số hóa để chỉnh sửa dữ liệu nhạy cảm từ chuỗi truy vấn hiển thị trong các sự kiện CloudTrail. Ví dụ: bạn có thể có các cột chứa PII dưới dạng tham số mà bạn không muốn hiển thị trong nhật ký. Athena tự động che dấu các chuỗi truy vấn từ các sự kiện CloudTrail cho các câu lệnh THỰC HIỆN, thay thế chuỗi truy vấn bằng giá trị HIDDEN_DUE_TO_SECURITY_REASONS. Điều này giúp bạn tránh hiển thị dữ liệu được bảo vệ trong các luồng nhật ký của mình.

Để truy cập sự kiện CloudTrail cho truy vấn, hãy hoàn thành các bước sau:

  1. Điều hướng đến Sự kiện lịch sử trên bảng điều khiển CloudTrail.
  2. Trên menu thả xuống, hãy chọn Tên sự kiện.
  3. Tìm kiếm StartQueryExecution sự kiện.

Bản ghi sự kiện CloudTrail cho các truy vấn được tham số hóa bao gồm queryString giá trị redacted với HIDDEN_DUE_TO_SECURITY_REASONS. Chuỗi truy vấn có thể nhìn thấy trong lịch sử truy vấn của nhóm làm việc Athena. Bạn có thể kiểm soát quyền truy cập bằng cách sử dụng các chính sách IAM ít đặc quyền nhất cho Athena, Danh mục dữ liệu keo AWS và vị trí đầu ra truy vấn Amazon S3 trong cài đặt nhóm làm việc của bạn. Để biết thêm thông tin về việc xem các truy vấn gần đây, hãy tham khảo Xem các truy vấn gần đây. Để biết thêm thông tin về các chính sách IAM, hãy tham khảo Các hành động, tài nguyên và khóa điều kiện cho các dịch vụ AWS.

Lớp bảo vệ cho SQL injection

Trong phần này, bạn sẽ được xem một ví dụ về cuộc tấn công SQL injection và cách các câu lệnh đã chuẩn bị có thể bảo vệ khỏi cuộc tấn công tương tự. Chúng tôi sử dụng bảng điều khiển Athena để gọi StartQueryExecution API chống lại một bảng có tên users với ba hàng.

SQL injection là một nỗ lực để chèn mã SQL độc hại vào các yêu cầu thay đổi câu lệnh và trích xuất dữ liệu từ các bảng của tập dữ liệu của bạn. Không có truy vấn tham số Athena, nếu bạn đang truy vấn trực tiếp tập dữ liệu hoặc nối đầu vào của người dùng vào truy vấn SQL và người dùng có thể nối thêm các đoạn SQL, thì tập dữ liệu có thể dễ bị tấn công SQL injection trả về dữ liệu trái phép trong tập kết quả.

Bài đăng này cho thấy một ví dụ về việc chèn một đoạn SQL theo cách độc hại. Trong ví dụ, điều kiện OR sẽ luôn trả về true (chẳng hạn như OR 1=1) được thêm vào mệnh đề WHERE. Truy vấn ví dụ tương tự được hiển thị với các truy vấn tham số Athena và truy vấn không thành công vì nó chứa giá trị tham số không hợp lệ, vì giá trị tham số được mong đợi là một số nguyên nhưng chứa các ký tự “OR”. Nếu tham số được dựa trên cột Chuỗi, thì cùng một nỗ lực đưa vào SQL sẽ dẫn đến truy vấn không trả về kết quả vì đối số vị trí được hiểu là một giá trị tham số theo nghĩa đen.

Athena cung cấp một lớp bảo vệ bổ sung chống lại các cuộc tấn công chèn SQL nhiều câu lệnh. Cố gắng thực hiện chèn SQL bằng một lệnh thực thi (chẳng hạn như DROP) dẫn đến truy vấn không thành công với Athena cung cấp lỗi Only one sql statement is allowed, bởi vì Athena chỉ chấp nhận một lệnh thực thi cho mỗi lần gửi câu lệnh SQL.

Mặc dù các câu lệnh do Athena chuẩn bị cung cấp một lớp bảo vệ chống lại các cuộc tấn công SQL injection, các biện pháp phòng ngừa khác cung cấp các lớp bảo vệ bổ sung. Các tuyên bố chuẩn bị của Athena có thể là một phần của chiến lược chuyên sâu về phòng thủ của bạn. Để biết thêm thông tin về các lớp bảo mật, hãy tham khảo Bảo mật Amazon Athena.

Ví dụ về SQL injection

Mục đích sử dụng của truy vấn SELECT trong ví dụ là nhận một tập hợp giá trị nhỏ. Tuy nhiên, kẻ tấn công có thể thao túng đầu vào để nối thêm mã SQL độc hại. Ví dụ: kẻ tấn công có thể nhập giá trị 1 OR 1=1, gắn điều kiện đúng vào mệnh đề WHERE và trả về tất cả các bản ghi trong bảng:

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

Bằng cách thêm mã SQL độc hại, kẻ tấn công có thể truy xuất tất cả các hàng của users bảng, như được hiển thị trong ảnh chụp màn hình sau đây.
Hình ảnh của giao diện người dùng đồ họa Athena. Một truy vấn CHỌN * TỪ người dùng WHERE id = 1 HOẶC 1 = 1; đã được chạy. Tất cả 3 người dùng trong bảng, với id 1, 2 và 3, được trả về với tất cả các cột của bảng.

Cố gắng đưa vào SQL với một câu lệnh đã chuẩn bị

Nếu chúng ta tạo các câu lệnh đã chuẩn bị sẵn với cùng một truy vấn từ ví dụ trước, thì lệnh thực thi được truyền dưới dạng đối số chữ cho giá trị của tham số. Nếu người dùng cố gắng chuyển thêm SQL, họ sẽ nhận được lỗi cú pháp vì mệnh đề WHERE dựa trên ID, mệnh đề này mong đợi một giá trị số nguyên.

  1. Tạo một câu lệnh đã chuẩn bị sẵn bằng cách sử dụng cùng một truy vấn với users bàn:
PREPARE get_user FROM SELECT * FROM users WHERE id = ?
  1. Đặt tham số thành giá trị hợp lệ:
EXECUTE get_user USING 1

Kết quả mong đợi trả về, như được hiển thị trong ảnh chụp màn hình sau.

Giao diện đồ họa người dùng của Athena đang chạy truy vấn THỰC HIỆN get_user SỬ DỤNG 1. Chỉ trả về người dùng có id 1.

  1. Bây giờ, hãy cố gắng chuyển một giá trị độc hại:
EXECUTE get_user USING 1 OR 1=1

Việc chạy câu lệnh đã chuẩn bị này sẽ tạo ra lỗi cú pháp, vì một giá trị số nguyên được mong đợi, nhưng nó nhận một giá trị số nguyên không hợp lệ là 1 OR 1=1. Truy vấn và lỗi cú pháp được hiển thị trong ảnh chụp màn hình sau.

Giao diện người dùng đồ họa của truy vấn Athena THỰC HIỆN get_user SỬ DỤNG 1 HOẶC 1 = 1. Có một lỗi. Lỗi cho biết "SYNTAX_ERROR: dòng 1:24: Phía bên trái của biểu thức logic phải đánh giá thành boolean (thực: số nguyên). Truy vấn này chạy dựa trên cơ sở dữ liệu" mặc định ", trừ khi truy vấn đủ điều kiện. Vui lòng đăng thông báo lỗi trong diễn đàn."

Làm việc với các báo cáo đã chuẩn bị

Phần này mô tả các chức năng quản trị để làm việc với các câu lệnh đã chuẩn bị dễ dàng hơn.

Liệt kê tất cả các bản sao kê đã chuẩn bị trong tài khoản AWS của tôi

Liệt kê tất cả các báo cáo đã chuẩn bị sẵn trong nhóm làm việc Athena từ Giao diện dòng lệnh AWS (AWS CLI), bạn có thể chạy lệnh sau:

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

Nếu làm theo ví dụ trên, lệnh sẽ trả về phản hồi sau.

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

Để liệt kê tất cả các báo cáo đã chuẩn bị sẵn có trong tài khoản AWS của bạn, bạn có thể sử dụng các API AWS. Bài đăng này cung cấp một kịch bản mẫu bằng cách sử dụng AWS SDK cho Python (Boto3) để lặp qua tất cả các Khu vực trong tài khoản của bạn và cung cấp các báo cáo đã chuẩn bị cho mỗi nhóm làm việc Athena.

Đảm bảo bạn có thông tin đăng nhập AWS nơi bạn định chạy tập lệnh Python. Để biết thêm thông tin, hãy tham khảo Credentials.

Sao chép Repo GitHub hoặc sao chép tập lệnh Python list-prepared-statements.py từ repo và chạy script:

python3 list-prepared-statements.py

Thay thế <my-profile-name> bằng tên hồ sơ AWS của bạn khi nó nhắc bạn hoặc để trống để sử dụng thông tin đăng nhập cục bộ mặc định.

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

Văn bản sau là đầu ra của tập lệnh. Nếu theo sau, phản hồi chỉ trả về product_helpful_reviews tuyên bố chuẩn bị.

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:

Cập nhật báo cáo đã chuẩn bị

Bạn có một số tùy chọn để cập nhật các báo cáo đã chuẩn bị. Bạn có thể muốn làm điều này để tối ưu hóa hiệu suất truy vấn của mình, thay đổi các giá trị bạn chọn hoặc vì một số lý do khác.

  1. Chạy lại câu lệnh PREPARE với các thay đổi trong trình chỉnh sửa truy vấn Athena hoặc chống lại StartQueryExecution API.
  2. Sử dụng UpdatePreparedStatement API qua AWS CLI hoặc SDK.

Bạn có thể sử dụng API này để thêm mô tả vào các báo cáo đã chuẩn bị của mình hoặc cập nhật các truy vấn của bạn. Để cập nhật câu lệnh truy vấn của bạn thông qua phương pháp này, bạn phải cung cấp tên câu lệnh, tên nhóm làm việc, câu lệnh truy vấn được cập nhật và tùy chọn mô tả mới. Để biết thêm thông tin về UpdatePreparedStatement API, tham khảo cập nhật-chuẩn bị-tuyên bố.

Bạn có thể muốn triển khai các phiên bản truy vấn của mình. Để duy trì khả năng tương thích ngược cho người dùng, bạn có thể tạo một tuyên bố chuẩn bị mới với một tên khác. Ví dụ: câu lệnh đã chuẩn bị có thể có số phiên bản trong tên của nó (chẳng hạn như my_select_v1my_select_v2). Khi cần thiết, bạn có thể thông báo các thay đổi cho các nhóm dựa trên tuyên bố đã chuẩn bị và sau đó sẽ phân bổ các phiên bản tuyên bố đã chuẩn bị cũ.

Xóa các báo cáo đã chuẩn bị

Để xóa một câu lệnh đã chuẩn bị, bạn có thể sử dụng cú pháp truy vấn sau khi chống lại StartQueryExecution API hoặc từ trong trình chỉnh sửa truy vấn Athena:

DEALLOCATE PREPARE product_helpful_reviews

Bạn cũng có thể sử dụng DeletePreparedStatement API hoặc SDK. Ví dụ: để xóa câu lệnh đã chuẩn bị của bạn khỏi AWS CLI, hãy chạy lệnh sau:

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

Làm sạch

Nếu bạn làm theo bài đăng này, bạn đã tạo ra một số thành phần có thể phát sinh chi phí. Để tránh bị tính phí trong tương lai, hãy xóa tài nguyên theo các bước sau:

  1. Xóa tiền tố kết quả của nhóm S3 được tạo sau khi bạn chạy một truy vấn trên nhóm làm việc của mình.

Với mẫu mặc định, nó được đặt tên là <S3QueryResultsBucketName>/athena-results. Hãy thận trọng trong bước này. Trừ khi bạn là sử dụng lập phiên bản trên bộ chứa S3 của bạn, không thể hoàn tác việc xóa các đối tượng S3.

  1. Xóa các câu lệnh do Athena chuẩn bị trong PreparedStatementsWG

Bạn có thể làm theo các bước trong Xóa các báo cáo đã chuẩn bị của bài đăng này bằng cách sử dụng câu lệnh DEALLOCATE PREPARE hoặc delete-prepared-statement API cho mỗi câu lệnh đã chuẩn bị mà bạn đã tạo.

  1. Để xóa ngăn xếp CloudFormation, hãy chọn ngăn xếp trên bảng điều khiển AWS CloudFormation, chọn Xóa bỏ, Và xác nhận.

Kết luận

Các truy vấn được tham số hóa Athena giúp bạn dễ dàng tách cơ sở mã khỏi các truy vấn của mình bằng cách cung cấp một cách để lưu trữ các truy vấn phổ biến trong nhóm làm việc Athena của bạn. Bài đăng này đã cung cấp thông tin về cách các truy vấn được tham số hóa của Athena có thể cải thiện khả năng tái sử dụng mã và bảo mật hồ dữ liệu của bạn. Chúng tôi đã chỉ ra cách bạn có thể thiết lập một hồ dữ liệu mẫu và bắt đầu sử dụng các truy vấn được tham số hóa ngay hôm nay. Chúng tôi cũng cung cấp một ví dụ về các truy vấn được tham số hóa bảo vệ cung cấp và các chức năng quản trị bổ sung chi tiết.

Bạn có thể bắt đầu với các tuyên bố chuẩn bị của Athena thông qua Bảng điều khiển Athena, Các AWSCLI, Hoặc SDK AWS. Để tìm hiểu thêm về Athena, hãy tham khảo Hướng dẫn sử dụng Amazon Athena.

Cảm ơn bạn đã đọc bài viết này! Nếu bạn có thắc mắc về các truy vấn tham số Athena, đừng ngần ngại để lại bình luận trong phần bình luận.


Về các tác giả

Blaze Stefaniak là Kiến trúc sư Giải pháp Cấp cao tại AWS, người làm việc với các tổ chức khu vực công, tài chính liên bang và chăm sóc sức khỏe. Blayze có trụ sở tại Pittsburgh. Anh ấy đam mê phá vỡ các tình huống phức tạp thành một cái gì đó thiết thực và có thể hành động được. Sở thích của anh ấy bao gồm trí tuệ nhân tạo, hệ thống phân tán và thể dục công thức Excel. Blayze có bằng BSBA về Kế toán và BS về Hệ thống Thông tin từ Đại học Clarion của Pennsylvania. Khi rảnh rỗi, bạn có thể thấy Blayze đang nghe sách nói về Chiến tranh giữa các vì sao, cố gắng làm cho những chú chó của anh ấy cười và có thể nói chuyện khi bị câm.

Daniel Tatarkin là Kiến trúc sư Giải pháp tại Amazon Web Services (AWS) hỗ trợ các tổ chức Tài chính Liên bang. Anh ấy đam mê phân tích dữ liệu lớn và công nghệ không máy chủ. Ngoài công việc, anh ấy thích tìm hiểu về tài chính cá nhân, cà phê và thử các ngôn ngữ lập trình mới để giải trí.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?