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

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対応が望まれます。