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


はじめに

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

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

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

AMIなど

使用したAMIはami-fde8199b になります。
ちなみにRegionはap-northeast-1です。
Upgrade前のredashのバージョンは、v2.0.0です。

最新AMIへのリンクはこちら

導入

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 ***とあるように、コンソール等から再起動します。

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のバージョンを最新にする

こちらの方法そのままの通りに実行してみます。

cd /opt/redash/current
sudo bin/upgrade

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

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します

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とシークレットアクセスキーが付与されるので、控えておきます。
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://

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

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_TLSREDASH_MAIL_USE_SSLはdefaultでfalseとなっているものの、空文字列を指定していると"502 Bad gateway"で接続できなくなります。
ただ単にfalseとしたい場合は行自体削除しておくか、コメントアウトしておきましょう。

/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なので、変更することをおすすめします

/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