AWS CLIからAthenaのクエリを実行してみた

AWS CLIがAthena対応したので、試してみました。
（いや〜JDBC接続とかめんどかった・・・）

利用環境はMacです

## AWS CLIをバージョンアップ
利用していたAWS CLIのバージョンは1.11.88でした

```
$ aws --version
aws-cli/1.11.88 Python/2.7.10 Darwin/15.6.0 botocore/1.5.51
$ aws help | grep athena

```
もちろんAthenaが入っていないのでバージョンアップします
--ignore-installed sixをつけないとバージョンアップできないのはなんとかならないかな・・・

```
$ sudo pip install --upgrade awscli --ignore-installed six
```

バージョンアップ完了

```
$ aws --version
aws-cli/1.11.89 Python/2.7.10 Darwin/15.6.0 botocore/1.5.52
$ aws help | grep athena
       o athena
```

## ドキュメントを眺める
* [ドキュメント](http://docs.aws.amazon.com/cli/latest/reference/athena/index.html)

### コマンド一覧
* batch-get-named-query
* batch-get-query-execution
* create-named-query
* delete-named-query
* get-named-query
* get-query-execution
* get-query-results
* list-named-queries
* list-query-executions
* start-query-execution
* stop-query-execution

## コマンド実行してみる
本日時点ではAthenaが東京リージョンに来てないので、コマンドに--region us-east-1(バージニアリージョン)を指定。（諸事情でprofileは使わない）
すでに、CloudFrontとCloudTrailのログをAthena上に配置
→[Athenaを使ってAWSのログを集計する](http://qiita.com/kazu23pole/items/57a6b721bb3cdf5e5ef8)

### start-query-execution
クエリを実行するコマンド。
必須パラメータ
--query-string：Stringでクエリを記述。FROM句にDB名は必須。
--result-configuration：結果を出力するS3バケットを指定

```
$ aws --region us-east-1 athena start-query-execution \
    --query-string "SELECT * FROM aws_logs.cloudfront_log limit 10;" \
    --result-configuration OutputLocation=s3://athena-output
{
    "QueryExecutionId": "9d5f2f3a-e80f-4807-ab6c-35139924d374"
}
```


### get-query-results
クエリの実行結果を見る

```
$ aws --region us-east-1 athena get-query-results \
    --query-execution-id 9d5f2f3a-e80f-4807-ab6c-35139924d374
{
    "ResultSet": {
        "Rows": [
            {
                "Data": [
                    {
                        "VarCharValue": "date"
                    }, 
                    {
                        "VarCharValue": "time"
                    }, 
                    {
                        "VarCharValue": "xedgelocation"
                    }, 
                    {
                        "VarCharValue": "scbytes"
                    }, 
                    {
                        "VarCharValue": "cip"
                    }, 
                    {
                        "VarCharValue": "csmethod"
                    }, 
                    {
                        "VarCharValue": "cshost"
                    }, 
                    {
                        "VarCharValue": "csuristem"
                    }, 
                    {
                        "VarCharValue": "scstatus"
                    }, 
                    {
                        "VarCharValue": "csreferer"
                    }, 
                    {
                        "VarCharValue": "csuseragent"
                    }, 
                    {
                        "VarCharValue": "csuriquery"
                    }, 
                    {
                        "VarCharValue": "cscookie"
                    }, 
                    {
                        "VarCharValue": "xedgeresulttype"
                    }, 
                    {
                        "VarCharValue": "xedgerequestid"
                    }, 
                    {
                        "VarCharValue": "xhostheader"
                    }, 
                    {
                        "VarCharValue": "csprotocol"
                    }, 
                    {
                        "VarCharValue": "csbytes"
                    }, 
                    {
                        "VarCharValue": "timetaken"
                    }, 
                    {
                        "VarCharValue": "xforwardedfor"
                    }, 
                    {
                        "VarCharValue": "sslprotocol"
                    }, 
                    {
                        "VarCharValue": "sslcipher"
                    }, 
                    {
                        "VarCharValue": "xedgeresponseresulttype"
                    }, 
                    {
                        "VarCharValue": "csprotocolversion"
                    }
                ]
            }, 
            {
                "Data": [
                    {
                        "VarCharValue": "2017-03-11"
                    }, 
                    {
                        "VarCharValue": "07:09:39"
                    }, 
                    {
                        "VarCharValue": "NRT20"
                    }, 
                    {
                        "VarCharValue": "485"
                    }, 
                    {
                        "VarCharValue": "182.251.62.172"
                    }, 
                    {
                        "VarCharValue": "GET"
                    }, 
                    {
                        "VarCharValue": "d296z2px268if9.cloudfront.net"
                    }, 
                    {
                        "VarCharValue": "/sample"
                    }, 
                    {
                        "VarCharValue": "200"
                    }, 
                    {
                        "VarCharValue": "-"
                    }, 
                    {
                        "VarCharValue": "curl/7.43.0"
                    }, 
                    {
                        "VarCharValue": "-"
                    }, 
                    {
                        "VarCharValue": "-"
                    }, 
                    {
                        "VarCharValue": "Miss"
                    }, 
                    {
                        "VarCharValue": "7_kRmqTCtndlAsdecditmwIL3kPgVKjsqBggBEFSu68_tsTGWAVK-g=="
                    }, 
                    {
                        "VarCharValue": "d296z2px268if9.cloudfront.net"
                    }, 
                    {
                        "VarCharValue": "https"
                    }, 
                    {
                        "VarCharValue": "99"
                    }, 
                    {}, 
                    {
                        "VarCharValue": "-"
                    }, 
                    {
                        "VarCharValue": "TLSv1.2"
                    }, 
                    {
                        "VarCharValue": "ECDHE-RSA-AES128-GCM-SHA256"
                    }, 
                    {
                        "VarCharValue": "Miss"
                    }, 
                    {
                        "VarCharValue": "HTTP/1.1"
                    }
                ]
            }, 
・・・
```

これ使いにくい・・・


### get-query-execution
クエリ実行結果（成功/失敗)等の情報を取得する
start-query-executionで実行した結果を取得
必須パラメータ
--query-execution-id：実行時に表示されるQueryExecutionIdを指定

```
$ aws --region us-east-1 athena get-query-execution \
    --query-execution-id 9d5f2f3a-e80f-4807-ab6c-35139924d374
{
    "QueryExecution": {
        "Status": {
            "SubmissionDateTime": 1495269759.131, 
            "State": "SUCCEEDED", 
            "CompletionDateTime": 1495269762.711
        }, 
        "Query": "SELECT * FROM aws_logs.cloudfront_log limit 10", 
        "Statistics": {
            "DataScannedInBytes": 1454, 
            "EngineExecutionTimeInMillis": 3475
        }, 
        "ResultConfiguration": {
            "OutputLocation": "s3://athena-output/3fbf61dd-866e-4de6-9ba4-56cfdb671964.csv"
        }, 
        "QueryExecutionId": "3fbf61dd-866e-4de6-9ba4-56cfdb671964"
    }
}
```
StatusにSUCCEEDEDと表示されるので成功している
結果は実行時に指定したS3バケット内にCSVで保存される→OutputLocation

## スクリプトを組むならこんな感じ？

```athena-query.sh
#!/bin/bash

OutputBucket=athena-output # 出力バケット
# クエリ実行
queryId=$(aws --region us-east-1 athena start-query-execution \
    --query-string "SELECT * FROM aws_logs.cloudfront_log limit 10;" \
    --result-configuration OutputLocation=s3://$OutputBucket \
    | jq -r '.QueryExecutionId')
# 結果の確認
status=$(aws --region us-east-1 athena get-query-execution \
    --query-execution-id $queryId \
    | jq -r '.QueryExecution.Status.State')

if [ "$status" == "SUCCEEDED" ]; then
    aws s3 cp s3://${OutputBucket}/${queryId}.csv .
else
    echo "Query Error!"
fi

cat ${queryId}.csv
```

## まとめ
* 待望のAthenaがAWS CLIに対応しました。
* BigQueryはbqコマンドで実行できたので、足並み揃い始めた感じでしょうか
* もうすぐ東京リージョンに来そうな感じなので、期待大です（Comming Soonってなってるので、AWS Summit Tokyoで発表！？）
* 出力結果がもっといい感じに見れるといいですね