AWS＋ELB＋EC2でRe:dash環境構築した時のまとめ


## はじめに

Re:dashを利用したいという社内ニーズに応えるために環境構築したのですが

- AWS環境をバリバリいじるのは今回が実は初めて
- 先代が構築した構成をベースに作業

という状況で作業をしてて少しハマったこともあって自分用にメモとしてまとめました。

要点だけ先に書くと、ELBのヘルスチェックの設定が正しくなかったためなので、似た構成でハマった方がいたらそこを確認してみるのが良いのかと思います。

## やりたいこと

当面の目標として以下を考えて作業しました

- Re:dashが稼働してるサーバーにインターネットからアクセス
  - ひとまずBasic認証を設定
    - [公式ドキュメント](http://docs.redash.io/en/latest/setup.html#users-google-authentication-setup)にConfigure the domain(s) you want to allow to use with Google Appsという記載あったので近いうちにそっちの設定に変更するかも
- 本番稼働してるRDS（MySQL）のリードレプリカを設定しRe:dashはそっちを参照する

絵にするとこんな↓感じ
![ 2016-07-11 9.58.41.png](https://qiita-image-store.s3.amazonaws.com/0/10187/741f799a-8488-c021-8a9c-760a83447682.png)


## 比較的順調にいった作業

以下項目は比較的順調にいきました

- RDS（MySQL）のリードレプリカ設定
  - ポチッとするだけなのでこれは問題ない
- EC2 インスタンスを立ち上げる
  - - [公式ドキュメントのcreate-an-instance](http://docs.redash.io/en/latest/setup.html#create-an-instance)に記載のあった[ami-78967519](https://console.aws.amazon.com/ec2/home?region=ap-northeast-1#LaunchInstanceWizard:ami=ami-78967519)のAMIを利用してEC2 インスタンスを立ち上げるだけなのでこれも問題なし
- 構成上必須かどうか迷ったけどELB配下に上記EC2インスタンスを配置
- [クラスメソッドさんのページで紹介されてる](http://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/)Route53のALIASレコードを利用して Re:dashが稼働してるサイトへの名前解決出来るように設定

## ハマったこと


- Route53の設定が終わり、手元の環境でnslookupで名前解決出来ることは確認できたにもかかわらず、該当のサイトにアクセスしても、何も表示されませんでした・・・
- ELBの設定不備があったのでそれを解消→その後Basic認証の設定を行う→再度アクセスできなくなる

ということが生じてハマりました

## 該当のサイトにアクセスしても、何も表示されなかった件について

以下の様なことを順番に確認していきました

### そもそもnginx稼働してるのか？

AMIをベースに作業していたので、そもそもnginx稼働してるのかを該当ホストにsshした上で確認しました

```sh
sudo service nginx status
nginx is running
```

sshした状態でローカルホストの80番ポートに対して

```
telnet 127.0.0.1 80
```

とかした後にGET コマンド発行したらnginxからのレスポンスはありました。

### ELBの設定を再度確認

ここは既存環境を参考に新規にELBを立てたのでもしかしたらELB側の設定に不備があったのかと思い改めて確認しました。

AWSのマネージメントコンソールでロードバランサー→インスタンスタブと選択して状態を確認したらエラーっぽいアイコンが表示されておりマウスカーソルを合わせると

> Instance has failed at least the UnhealthyThreshold number of health checks consecutively

という表示になってました

### ヘルスチェックの設定に不備があった

ここあまり深く考えず作業してたのですが、冷静に考えるとヘルスチェックの設定大事ですよね・・・

というのもELBはロードバランサー機能なんでその配下のサーバーが稼働してるかどうかを確認して処理を振り分けるのでその確認のためにヘルスチェックの設定が必要ですからね

当初ここをルート（/）へのアクセスで設定していたのですが、Re:dashの場合にトップページとなるのは

/login

なのでそちらをヘルスチェック先として設定

こうすることで、先程までアクセスできなかったページに無事アクセス出来るようになりました！

## Basic認証設定した後に再度アクセスできなくなる

ひとまず該当ページにアクセス出来るようになったので、[Nginx で Basic 認証](http://qiita.com/kotarella1110/items/be76b17cdbe61ff7b5ca)を参考にBasic認証の設定をしました。

### .htpasswd ファイルの作成

```sh
sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd xxxxx
New password: password
Re-type new password: password
Adding password for user username
```

### .htpasswd ファイルを読み込むための設定変更

Re:dashが利用できるインスタンスのnginxの設定はsites-available/redashを修正すればOKのようだったので

```
sudo vi /etc/nginx/sites-available/redash
```

として、以下のようにしました


```conf
upstream rd_servers {
  server 127.0.0.1:5000;
}

server {

  server_tokens off;

  listen 80 default;

  access_log /var/log/nginx/rd.access.log;

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location / {
    # ここから追加箇所
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    # ここまで追加箇所
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://rd_servers;
  }
}
```

Basic認証のログインIDとパスワードを入力した後に、何故か画面が何も表示されなくなりました。

### Basic認証の設定をしたことで先ほど設定したヘルスチェックではエラーになる

Apacheでの話ですが、知り合いの @ysKey2 さんが[ELB x EC2のステージング環境でのApacheでBasic認証をかける場合](http://qiita.com/ysKey2/items/c9f98a3c5d6f2a9cc801)というのを書かれてました。

これを読んで

「あーそっか、Basic認証設定したから、ELBのヘルスチェック出来るlocationを何らかの形で設定しないといけないのか」

ということに気づきました。


### Basic認証不要なlocationを手軽に設定するためにempty_gifモジュールを活用する

なにか手軽な方法がないかと思ってたら、[ELBなどでhealth checkをする際に使える便利なempty_gif（Nginx）](http://qiita.com/yumiyon/items/5cd2c6b4c696355926dc)というのを見つけました。

設定ファイルの変更だけで済むので


```sh
sudo vi /etc/nginx/sites-available/redash
```

として、

```conf
  location / {
    # 途中省略
    proxy_pass       http://rd_servers;
  }
  location = /healthcheck.html {
    empty_gif;
    break;
  }
```

という形に変更。そしてnginxを再起動したら、無事に設定反映されました！