1円/時のVPS「DigitalOcean」をコマンドで操作する方法


digital_ocean_image

1時間0.007ドル(約0.8円)で使える非常に安価なレンタルサーバ「DigitalOcean」をコマンドから操作する方法を紹介する。

DigitalOceanをコマンドで操作できる「tugboat」

tugboatは、Ruby製のDigitalOceanをコマンドで扱うためのツールだ。DigitalOceanはドロップレット(サーバインスタンス)の操作をREST APIで行うことができ、同ツールはこれを利用してドロップレットの作成などをコマンドラインで行う。

APIトークンを取得する

tugboatを使う前に、DigitalOceanの管理画面からAPIトークンを取得する必要がある。トークンの取得方法は次の通り。

{{% steps %}}

APIページを開く

Digital Oceanの管理画面にログインしたのち、APIページページを開き、「Generate new token」ボタンを押す。

1.jpg

トークンを生成する

「Token Name」には「tugboat」などわかりやすい名前を入力する。「Select Scopes」の「Write」にチェックが入っていることを確認し、「Generate Token」を押してトークンを生成する。

2.jpg

トークンを控える

トークンの生成が完了すると、トークンが画面に表示される。トークンは一度しか表示されないので、今のうちに控えておく。

3.jpg

{{% /steps %}}

SSHキーを登録する

次に、tugboatで作ったドロップレットにSSHでログインできるよう、あらかじめ自分のSSH公開鍵を管理画面から登録しておく。

{{% steps %}}

公開鍵を登録する

Security」の「Add SSH Key」を開き、「Name」と「Public SSH key」を入力する。「Name」は管理上、分かりやすい名前にする。「Public SSH Key」はid_rsa.pubなどの中身をそのままコピペする。入力した「Create SSH Key」を押して終わる。

4.jpg

SSHキーのフィンガープリントを控える

公開鍵の登録が終わると、「SSH Keys」にSSHキーのフィンガープリントが表示される。後で、tugboatの設定で使うので控えておく。

5.jpg

{{% /steps %}}

tugboatのインストール

tugboatはgemでインストールする。

gem install tugboat

tugboatの設定

tugboat authorizeコマンドを実行すると、設定ウィザードが始まる。ほとんどデフォルト値で構わないが、下では設定しておくべき項目のみ抜粋する。

% tugboat authorize
Note: You can get your Access Token from https://cloud.digitalocean.com/settings/tokens/new

Enter your access token: ここにトークン貼り付け
...
Enter your default region (optional, defaults to nyc1): sgp1 # シンガポールを指定
...
Enter your default ssh key IDs (optional, defaults to none, comma separated string): ed:8d:36:66:... ここにSSHキーのIDを貼り付け
...
Authentication with DigitalOcean was successful.

ウィザードが完了すると、~/.tagboatに設定が保存される。

% cat ~/.tugboat
---
---
authentication:
access_token: トークン
ssh:
ssh_user: root
ssh_key_path: "~/.ssh/id_rsa"
ssh_port: '22'
defaults:
region: sgp1
image: ubuntu-14-04-x64
size: 512mb
ssh_key: ed:8d:36:66:....
private_networking: 'false'
backups_enabled: 'false'

tugboatの使い方

tugboatの基本的な使い方を紹介する。

まず、ドロップレットを作成する方法。tugboat create [好きなドロップレット名]でドロップレットを作成することができる。

% tugboat create test
Queueing creation of droplet 'test'...Droplet created!

作ったドロップレットの一覧を見る。

% tugboat droplets
test (ip: 128.199.169.218, status: active, region: sgp1, id: 8993546)

作ったドロップレットを削除する。

% tugboat destroy test
Droplet fuzzy name provided. Finding droplet ID...done, 8993546 (test)
Warning! Potentially destructive action. Please confirm [y/n]: y
Queuing destroy for 8993546 (test)...Deletion Successful!

イメージを指定してドロップレットを作成する。Digital OceanはデフォルトでDocker入りのイメージを提供しているので、イメージを指定すればすぐに使うことができる。

% tugboat create --image=docker mydocker
Queueing creation of droplet 'mydocker'...Droplet created!

ドロップレットが起動するまで待つこともできる。

% tugboat wait mydocker
Droplet fuzzy name provided. Finding droplet ID...done, 8993795 (mydocker)
Waiting for droplet to become active..........

ドロップレット名でSSH接続することも可能。これが一番便利な機能かもしれない。

% tugboat ssh mydocker
Droplet fuzzy name provided. Finding droplet ID...done, 8993795 (mydocker)
Executing SSH on Droplet (mydocker)...
Attempting SSH: root@128.199.116.248
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-68-generic x86_64)

以上がtugboatの基本的な使い方。

簡単なプロビジョニングをする

tugboatを使うといとも簡単にドロップレットを作ることができるが、tugboat自体にはプロビジョニングの機能がない。一方で、Digital Oceanでは、ユーザデータ(User Data)というYAMLで簡単なプロビジョニングを行える仕組みを提供している。

tugboatでは、createコマンドのオプションで、このユーザデータのYAMLファイルを渡すことができる。この機能を活用して簡単なプロビジョニングを行ってみる。

下のコードは、Digital Oceanのユーザデータの定義だ。これを、cloud-config.ymlなど好きな名前で保存して準備しておく。ちなみに、このユーザデータでやっていることは、ユーザの追加とSSHのセキュリティを高めるための設定、そして、簡易的なファイアウォールの設定だ。

#cloud-config
users:
- name: suin
ssh-authorized-keys:
- ssh-rsa AAAAB3Nz...[略]...VEAiQMtTQ== suin@SuinMacbook.local
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
shell: /bin/bash
runcmd:
# SSHD config
- sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
- sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
- sed -i -e '/^#PasswordAuthentication/s/^.*$/PasswordAuthentication no/' /etc/ssh/sshd_config
- service ssh restart
# firewall
- ufw enable
- ufw allow 4444
- ufw allow http
- ufw allow https
- ufw reload

このファイル名をtugboatの--user-dataオプションに渡すと、ドロップレットを作成するときに実行してくれる。

tugboat create --user-data=cloud-config.yml userdata-test

ユーザデータでSSHのポートを4444に変更したのと、rootでのログインを封じたので、tugboatのsshコマンドではポート番号とユーザ名を明示的に渡して、SSH接続する。

tugboat ssh -p 4444 -u suin userdata-test

rootではログインできなくなったことも確認する。

% tugboat ssh -p 4444 -u root userdata-test
Droplet fuzzy name provided. Finding droplet ID...done, 8994269 (userdata-test)
Executing SSH on Droplet (userdata-test)...
Attempting SSH: root@128.199.109.111
Permission denied (publickey).

まとめ

tugboatを使うと、Digital Oceanのドロップレットの管理がとても容易になる。

DigitalOcean: https://www.digitalocean.com/?refcode=05858f2fb943
tugboat: https://github.com/pearkes/tugboat