DigitalOceanにRedashを立てる

開発環境が欲しい。

いや、AWSとかGCPに立てれば一発なんですけど、

Setting up a Redash instance · Redash Help Center

なんとなくDigitalOcean推しなのでDigitalOceanでやってみます。

doctlをインストール

doctlはDigitalOceanのコマンドラインツールです。

もちろんRからも使えるんですけど、SSHしていろいろいじりたいので結局コマンドラインツールが便利だったりします。

インストール方法はいろいろありますが、PATHを通すとかいろいろ考えるとgo get github.com/digitalocean/doctl/cmd/doctlが一番楽かもしれません。

が、私は手元のBash on Windowsにバイナリを持ってきました。

# ダウンロードして展開
wget -qO- https://github.com/digitalocean/doctl/releases/download/v1.7.0/doctl-1.7.0-linux-amd64.tar.gz  | tar xz

# ハッシュ値が一致するのを確認
sha256sum ./doctl
wget -qO- https://github.com/digitalocean/doctl/releases/download/v1.7.0/doctl-1.7.0-linux-amd64.sha256

# パスが通っているところに移動
sudo mv ./doctl /usr/local/bin

認証

https://cloud.digitalocean.com/settings/api/tokens からAPIトークンを生成したら、doctl auth initを実行してそのトークンをコピペします。

$ doctl auth init
DigitalOcean access token:

終わったら、ちゃんとセットアップできているか、試しにrate limit APIでも叩いてみましょう。

$ doctl account ratelimit
Limit    Remaining    Reset
5000     4998         2017-10-12 21:54:54 +0900 DST

SSH鍵を登録

あとでインスタンスSSHするために適当に鍵を生成します。

ssh-keygen -f ~/.ssh/testkey

doctlがデフォルトで使う鍵は.config/doctl/config.yamlに設定されています。以下の行に~/.ssh/testkeyを指定しましょう。

compute.ssh.ssh-key-path: /home/user1/.ssh/id_rsa

次に、この公開鍵をDigitalOceanに登録します。SSH鍵の操作にはdoctl compute ssh-keyを使います。登録はimportです。

doctl compute ssh-key import "test key" --public-key-file ~/.ssh/testkey.pub

こんな感じの結果が表示されると思います。このIDはDropletをつくるときに指定するので覚えておきましょう。

ID          Name        FingerPrint
12345678    test key    aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa

Dropletを作成

Dropletというのは仮想サーバのインスタンスです。Dropletを操作するにはdoctl compute dropletの各コマンドを使います。例えば、Dropletの一覧を表示するにはlistです。

$ doctl compute droplet list
ID    Name    Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image    Status    Tags

オプションを探す

Dropletを作成するにはcreateですが、ここにはいろいろ指定しなくてはいけないオプションがあります。

$ doctl compute droplet create --help 2>&1| grep required
      --image string                Droplet image (required)
      --region string               Droplet region (required)
      --size string                 Droplet size (required)

ここに指定できるオプションは、例えばインスタンスタイプであればdoctl compute size list、リージョンはdoctl compute region listで調べられます。

$ doctl compute size list
Slug       Memory    VCPUs    Disk    Price Monthly    Price Hourly
512mb      512       1        20      5.00             0.007440
1gb        1024      1        30      10.00            0.014880
2gb        2048      2        40      20.00            0.029760
c-2        3072      2        20      40.00            0.060000
4gb        4096      2        60      40.00            0.059520
c-4        6144      4        20      80.00            0.119000
8gb        8192      4        80      80.00            0.119050
c-8        12288     8        20      160.00           0.238000
16gb       16384     8        160     160.00           0.238100
m-16gb     16384     2        30      120.00           0.178570
c-16       24576     16       20      320.00           0.476000
32gb       32768     12       320     320.00           0.476190
m-32gb     32768     4        90      240.00           0.357140
48gb       49152     16       480     480.00           0.714290
c-32       49152     32       20      640.00           0.952000
m-64gb     65536     8        200     480.00           0.714290
64gb       65536     20       640     640.00           0.952380
m-128gb    131072    16       340     960.00           1.428570
m-224gb    229376    32       500     1680.00          2.500000
$ doctl compute region list
Slug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

イメージはちょっとややこしくて、デフォルトだとプライベートイメージ?が表示されるので、--publicを指定しないといけないみたいです。

$ doctl compute image list --public | head
ID          Name                                          Type        Distribution    Slug                    Public    Min Disk
28480378    1548.1.0 (beta)                               snapshot    CoreOS          coreos-beta             true      20
13764801    Elixir on 14.04                               snapshot    Ubuntu                                  true      30
14782899    6.7 x32                                       snapshot    CentOS          centos-6-5-x32          true      20
14782952    6.7 x64                                       snapshot    CentOS          centos-6-5-x64          true      20
16071652    cloudbench-ycsb-on-1404.030216-1              snapshot    Ubuntu                                  true      60
16071743    cloudbench-hibench-on-1404.030216-1           snapshot    Ubuntu                                  true      60
16082940    cloudbench-nullworkload-on-1404.030316-6      snapshot    Ubuntu                                  true      20
16376426    Cassandra on 14.04                            snapshot    Ubuntu          cassandra               true      30
16623283    7.10 x32                                      snapshot    Debian                                  true      20

今回はDockerが使いたいので、dockerが使えそうなやつを探してみましょう。

$ doctl compute image list --public | grep -i docker
23219707    Docker 17.03.0-ce on 14.04                    snapshot    Ubuntu          docker                  true      20
27493072    Docker 17.05.0-ce on 16.04                    snapshot    Ubuntu          docker-16-04            true      20

今回はdocker-16-04にします。

作成

シンガポールリージョンで4GBのインスタンスdockertestという名前で作るには、こうです。

doctl compute droplet create dockertest --image docker-16-04 --region sgp1 --size 4gb --ssh-keys 12345678

こんな感じのレスポンスが返ってくれば成功です。

ID          Name          Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                                Status    Tags
66666666    dockertest                                                  4096      2        60      sgp1      Ubuntu Docker 17.05.0-ce on 16.04    new

少し準備に時間がかかるので、ステータスがactiveになるまで待ちましょう。

$ doctl compute droplet list -o json | jq '.[] | select(.name == "dockertest") | .status '
"active"

インスタンスSSH

doctl compute sshSSHできます。

doctl compute ssh dockertest

ここから先はインスタンス上で作業しましょう。

RedashをDocker composeで立ち上げる

パッケージアップデートとかufwをかけるとかそういうのがもろもろ終わったら、Redashのアーカイブをダウンロードしてきましょう。Docker compose用のファイルがあるのでそれを使います。

wget -qO - https://github.com/getredash/redash/archive/v2.0.0.tar.gz | tar xzf -
cd redash-2.0.0
docker-compose -f docker-compose.production.yml run --rm server create_db
docker-compose -f docker-compose.production.yml up -d

あと、だいたいはブラウザからで設定できるんですけど、データソース用にtestというデータベースを作っておきます。PostgreSQLにはユーザ名もパスワードもpostgresで入れます。

root@dockertest:~/redash-2.0.0# docker exec -it redash200_postgres_1 psql --password -U postgres -c "CREATE DATABASE test;"
Password for user postgres:
CREATE DATABASE

ブラウザでアクセス

http://<DropletのIP>にアクセスすると、ログイン画面が見えるはずです。ここに適当に埋めてログインします。

f:id:yutannihilation:20171012230936p:plain:w450

ログインできたら、右上のこのアイコンをクリックしてデータソースを追加しましょう。

f:id:yutannihilation:20171012231200p:plain

ホストは、127.0.0.1ではなくpostgresです。ユーザ名、パスワードもpostgresです。

f:id:yutannihilation:20171012231300p:plain

これで「Test Connection」が成功したらOK。

次回

RからRedashを使うパッケージ作っているので、それが完成したらブログに書きます。DBI難しい...