フェイス・ソリューション・テクノロジーズ株式会社 IS 本部 OS ユニットの Saki@猫好き です。AWS 活用していますか?
今日は、AWS CloudFormation を利用して、Amazon Athena Prepared Statement を管理する方法について書いてみたいと思います。
はじめに
Amazon Athena Prepared Statement とは?
Athena のパラメータ化されたクエリを使用して、実行時に同じクエリを異なるパラメータ値で再実行し、SQL インジェクション攻撃を防ぐことができます。Athena では、パラメータ化されたクエリは、任意の DML クエリまたは SQL プリペアドステートメントの実行パラメータの形式をとることができます。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/querying-with-prepared-statements.html
たとえば・・・
定期的に実行したいクエリがあるとします。SQL ステートメントの Where 句に「いつから」「いつまで」をパラメータとして渡すことで、クエリを実行することができるようになります。
PREPARE ステートメントを利用してクエリを作成
PREPARE my_test FROM
SELECT *
FROM my_table
WHERE date_from_to BETWEEN ? AND ?
作成した PREPARE ステートメントを利用
EXECUTE my_test USING '2023-01-01','2023-01-10'
Amazon Athena Prepared Statement の管理方法
Amazon Athena コンソールを利用
わかりやすいし簡単です。クエリを保存しておくことで、クエリの管理もできます。しかし、クエリの数が増えてくると、修正等の際に「保存したクエリ」タブでは手間がかかるようになります。
また、クエリを保存しなかった場合、Amazon Athena コンソールから登録されている Prepared Statement を確認する方法がありません。
AWS CLI を利用
aws athena create-prepared-statement
--statement-name my_test
--query-statement "SELECT * FROM my_table WHERE date_from_to BETWEEN ? AND ?"
--work-group primary
クエリが長くなったときに見にくいです。
AWS CLI では、list-prepared-statements と get-prepared-statement を利用することで、登録されている Prepared Statement を確認することができます。
AWS CloudFormation を利用
今回の本題。
過去、私は、コンソールでクエリを書いて、確認のために AWS CLI を利用する方法をとってきました。しかし、必要なときに必要なタイミングでクエリを確認したり修正したりするには、少々手間がかかります。
現在は、AWS CloudFormation を利用して、Code として管理しています。
CFn で Prepared Statement を書いてみた
結論
AWSTemplateFormatVersion: 2010-09-09
Description: myTest
Parameters:
###########################################################################
# Input Parameters
###########################################################################
ProjectName:
Description: Project name.
Type: String
ConstraintDescription: Please enter the project name.
###########################################################################
# Resources セクション
###########################################################################
Resources:
###########################################################################
# Athena Prepared作成
###########################################################################
myTest:
Type: AWS::Athena::PreparedStatement
Properties:
QueryStatement: !Sub |
SELECT *
FROM ${ProjectName}_table
WHERE date_from_to BETWEEN ? AND ?
StatementName: !Sub "${ProjectName}_my_test"
WorkGroup: "primary"
解説
複数の案件(プロジェクト)で、同じクエリを用いてデータ分析を行うことを想定しています。
そのため、案件(プロジェクト)ごとに、【案件(プロジェクト)名】_table というテーブルを用意しています。これを Athena コンソールや AWS CLI で行う場合、案件(プロジェクト)ごとに Prepared Statement を用意する必要があり、多変手間がかかります。
利用する際には、Athena コンソールや AWS CLI から EXECUTE しても良いですし、Lambda と Event Bridge を組み合わせて定期的に走らせることも可能です。(私は、Lambda と Event Bridge の組み合わせも CFn 化して利用しています。その話はいずれどこかで・・・)
最後に
今回は、CloudFormation で Athena Prepared Statement を管理する方法について書いてみました。
調査内容が増えたときに Prepared Statement を増やすとか、調査内容に修正が加わったときに Prepared Statement を修正するとか、コード化されたメリットを活用することで作業が効率化できています。
あまり情報がないので、需要があるのかないのか不安ではありますが、きっとやりたいと思っている人はいらっしゃるはず。ということで、どなたかの参考になれば幸いです。
引き続き、よろしくお願いいたします!
コメント