EC2のRedashからAmazon Athenaを使うときに詰まったこととか

#はじめに
AWSのEC2で環境構築を行い、RedashからAthenaを使用する際の初期設定周りの話です。
また、Athenaそのものの設定方法やS3へのログの保存方法は記載していません。

大したことは書いていません。強いて言えば、以下くらいでしょうか。他の記事や公式でも同じようなことが言われているかと思います。

- インスタンスサイズは`t2.small`以上
- ユーザー名に注意。`ec2-user`ではなく`ubuntu`
- Redash Staging Pathのバケットにアクセスできるようにポリシーを設定しておくこと

##AMIなど
使用したAMIは[ami-fde8199b](https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#LaunchInstanceWizard:ami=ami-fde8199b) になります。
ちなみにRegionは`ap-northeast-1`です。
Upgrade前のredashのバージョンは、`v2.0.0`です。

最新AMIへのリンクは[こちら](https://redash.io/help-onpremise/setup/setting-up-redash-instance.html#aws)

#導入

##EC2の作成
作成はマネジメントコンソールから行います。
上記リンクからAMIのページへジャンプし、AWSにログインすれば"ステップ2のインスタンスタイプの選択"が表示されているかと思います。

インスタンスタイプ: t2.small
Public DNS: 自動割り当て
Security Group: インバウンドで22, 80, 443のPortを開けておく（左からSSH、HTTP、HTTPS）。念のため、自分のIPからしかアクセスできない、などにしておいたほうが良いかと思います
IAMロール: Redashには不必要

※VPC関係の設定は割愛します。参考記事があれば追記します。

##インスタンスの起動とSSHログイン
マネジメントコンソールからインスタンスを起動します。
起動できたことを確認できたら、任意のSSHクライアントからSSHログインを行います。
ユーザー名は`ubuntu`なので注意。`ec2-user`ではログインできません。
※pemの設定などは各種クライアントに依存するので、割愛します。

ログイン後、下記の表示がでるかと思います。
`*** System restart required ***`とあるように、コンソール等から再起動します。

```bash
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-1012-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


*** System restart required ***
ubuntu@ip-xx-xx-xx-xx:~$ 
```

##疎通確認
EC2インスタンスのPublic DNSかPublic IPを使って、アクセスします。
アクセスすると、`/setup`にリダイレクトされるので、Adminユーザーを登録できることを確認します。

##upgradeして、Redashのバージョンを最新にする
[こちら](https://redash.io/help-onpremise/maintenance/how-to-upgrade-redash.html)の方法そのままの通りに実行してみます。

```bash
cd /opt/redash/current
sudo bin/upgrade
```

すると、エラーが表示され、最後の行に`AttributeError: 'module' object has no attribute 'SSL_ST_INIT'`というのが出力されているはずです。
そして執筆時点では`3.0.0.b3134`が最新なので以下のようにコマンドを入力しますが、バージョンの部分は適宜読み替えてください。

```bash
cd ../redash.3.0.0.b3134
sudo pip install -r requirements_all_ds.txt
# all_dsのほうだけでいいと思いますが、念のため
sudo pip install -r requirements.txt
```

そこそこ時間がかかります。
また、上記コマンドについては、下記で説明が記載されています。
https://pip.pypa.io/en/stable/user_guide/?highlight=-r#requirements-files

おわったら再度`current`に移動して、`upgrade`します

```bash
cd ../current
sudo bin/upgrade
```

##IAMユーザーの作成
RedashからAthenaやS3にアクセスするためのユーザーを作成します。

1. マネジメントコンソールからIAMのページを開き、ユーザーの追加を選びます。
2. AWSアクセスの種類には、「プログラムによるアクセス」を選択します。
3. 次のステップのアクセス権限では、「既存のポリシーを直接アタッチ」を選択し、「ポリシーの作成」をクリックします。(もちろん、あらかじめ作成しておいてもOKです)
4. JSONのタブをクリックし、下記にあるjsonを貼り付けます。
    - `<redash staging bucket>` は、Redashが実行した結果を出力する場所を指します。このbucketは後ほど使います。
    - `<athenaのtableに使ったbucket>` は、任意です。前述したように、Athenaそのものの設定に関わる部分で、その際に使ったbucketを指定してください。
5. 最後に、ユーザー名等を入力して作成を終えると、アクセスキーIDとシークレットアクセスキーが付与されるので、控えておきます。

```json:IAMポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "athena:StartQueryExecution",
        "athena:GetNamespace",
        "athena:GetQueryResults",
        "athena:GetQueryExecutions",
        "athena:GetCatalogs",
        "athena:ListQueryExecutions",
        "athena:GetNamespaces",
        "athena:GetExecutionEngine",
        "athena:CancelQueryExecution",
        "athena:StopQueryExecution",
        "athena:GetQueryExecution",
        "athena:GetExecutionEngines",
        "athena:GetTables",
        "athena:GetTable",
        "athena:RunQuery",
        "athena:BatchGetQueryExecution"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucketMultipartUploads",
        "s3:AbortMultipartUpload",
        "s3:CreateBucket",
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": [
        "arn:aws:s3:::<redash staging bucket>/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::<athenaのtableに使ったbucket>/*",
        "arn:aws:s3:::<athenaのtableに使ったbucket>/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::<athenaのtableに使ったbucket>",
        "arn:aws:s3:::<athenaのtableに使ったbucket>"
      ]
    }
  ]
}
```

##Data Sourcesの設定

再びRedashにブラウザからアクセスします。
ログインを行った後、画面右上のほうにある[Data Sources]のアイコンをクリックします。ディスクが重なったようなやつですね。
Settingsが開くので、[+ New Data Source]をクリックします。

- Type: Amazon Athena
- Name: 自由に
- Region: S3のRegion（だと思われます）
- Access Key: アクセスキーID
- Secret Key: シークレットアクセスキー
- S3 Staging Path: s3://<redash staging bucket>

ひとまず必要になるのはこのあたり。

Staging Pathについては、たとえばデフォルトで存在する`AmazonAthenaFullAccess`というIAMポリシーを使った場合、Resourceが`"arn:aws:s3:::aws-athena-query-results-*"`で固定されています。
これはマネジメントコンソールからAthenaを使った場合のデフォルトの出力先と同様です。
このバケット名を含むオブジェクトの操作ができないと、RedashからAthenaを扱うことができないようです。
※ちなみに自分はここでハマってしまい、あとで行うTest Connectionが成功しませんでした･･･

そして[Save]を行い、Successと表示されたあと、[Test Connection]を実行し、こちらもSuccessと表示されることを確認します。
されない場合は、IAMポリシーかRedashの設定が間違っています。

ここまで行えれば、あとはQueryを投げたりグラフを作れるようになっているかと思います

#その他
##メールの設定を行う
下記の環境変数を追加で指定すればよいですが、`REDASH_MAIL_USE_TLS`と`REDASH_MAIL_USE_SSL`はdefaultで`false`となっているものの、空文字列を指定していると"502 Bad gateway"で接続できなくなります。
ただ単に`false`としたい場合は行自体削除しておくか、コメントアウトしておきましょう。

```bash:/opt/redash/.env
export REDASH_MAIL_SERVER=""
export REDASH_MAIL_PORT=""
export REDASH_MAIL_USE_TLS=""
export REDASH_MAIL_USE_SSL=""
export REDASH_MAIL_USERNAME=""
export REDASH_MAIL_PASSWORD=""
export REDASH_MAIL_DEFAULT_SENDER=""
export REDASH_HOST="http://ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com"
# もしくは export REDASH_HOST="http://<ipv4 パブリックIP>"
```

変更後は、`sudo service supervisor restart`を実行しておきます。

##日付の表示を変更する
defaultはDD/MM/YYなので、変更することをおすすめします

```bash:/opt/redash/.env
export REDASH_DATE_FORMAT="YYYY/MM/DD"
```
変更後は、`sudo service supervisor restart`を実行しておきます。

##参考URLなど
https://redash.io/help-onpremise/setup/setting-up-redash-instance.html#aws
https://redash.io/help-onpremise/setup/settings-environment-variables.html