Amazon Athena CloudFormationでSaved Queries(NamedQuery)にクエリーを登録してみる

2017.10.06

Amazon Athena初のCloudFormation対応ということで、Saved Queries(NamedQuery)にクエリーを登録を試してみました。Athenaはよく使うクエリーを事前に登録できる機能があり、そのクエリーのことをNamedQueryと呼びます。

クエリーの登録

構文

AWS CloudFormationテンプレートでこのエンティティを宣言するには、次の構文を使用します。

  • JSON
{
"Type" : "AWS::Athena::NamedQuery",
"Properties" : {
"Description" : String,
"QueryString" : String,
"Database" : String,
"Name" : String
}
}
  • YAML
Type: "AWS::Athena::NamedQuery"
Properties:
Description: String
QueryString: String
Database: String
Name: String

CloudFormationテンプレートの用意

今回は誰でも環境を再現できるように、全てのAWSユーザーにサンプルとして登録されているsampledbのelb_logsテーブルに対するクエリーを登録してみます。エスケープ文字などの考慮はしたくないので、CloudFormationテンプレートはYAMLで作成しました。

なお、登録するクエリーServerResponsesはELB毎かつレスポンスコード毎のカウント数を表示するクエリーです。

Resources:
AthenaNamedQuery:
Type: AWS::Athena::NamedQuery
Properties:
Database: "sampledb"
Description: "A query that selects responses aggregated data"
Name: "ServerResponses"
QueryString: >
SELECT elbname, backendresponsecode, count(*) AS num
FROM elb_logs
GROUP BY 2,1
ORDER BY 2,1

スタックの作成

テンプレートファイル(ServerResponses.template)を Amazon S3 にアップロードして、スタックを作成します。

20171006-amazon-athena-cfn-namedquery-create-stack-1

スタックの名前はServerResponsesと設定しました。オプションは設定不要です。設定した内容は以下のとおりです。

20171006-amazon-athena-cfn-namedquery-create-stack-3-1

1分以内に登録完了です。

20171006-amazon-athena-cfn-namedquery-create-stack-4

確認

Athenaコンソールの Saved Queries の先頭に追加されていることが確認できます。

20171006-amazon-athena-cfn-namedquery-list

AWSCLIからも以下のように確認できます。

$ aws athena list-named-queries
{
"NamedQueryIds": [
"4f0c46de-e80e-462d-a83f-d2ba77f6a0e5",
"749f4ca9-92b2-4eed-9c71-3b2bfc6b4e75",
"fb829aa7-fc70-4f60-9831-230aefa09b87",
"5616ea97-1350-4a98-973b-71aa6802001a",
"35985ded-7546-4dc5-8bc8-75cb4c829f2b",
"ed65168c-a79c-47ec-a61a-70932ba30eb0",
"4d2e5479-46ac-451f-ac62-3179fe344533",
"115890c1-6002-44b8-9f98-ecab0515ba4d"
]
}
$ aws athena get-named-query --named-query-id 4f0c46de-e80e-462d-a83f-d2ba77f6a0e5
{
"NamedQuery": {
"Database": "sampledb",
"QueryString": "SELECT elbname, backendresponsecode, count(*) AS num FROM elb_logs GROUP BY 2,1 ORDER BY 2,1\n",
"Name": "ServerResponses",
"NamedQueryId": "4f0c46de-e80e-462d-a83f-d2ba77f6a0e5",
"Description": "A query that selects responses aggregated data"
}
}

最後に

SavedQueriesは、よく使うクエリーや雛形を事前に登録しておき、簡単に呼び出すことができます。これを一括で登録・更新・削除、またコード管理できるのは有効です。 他にもAPIが提供されているので順次CloudFormation対応が望まれます。