お題
- Arukasはエンドポイント以外のグローバルIP/ポートは変わっちゃうことがあるよ
- グローバルIP/ポートが変わったらすぐわかるように外形監視しておくよ
- 監視はさくらのクラウドのシンプル監視を使えば無料だよ
- Terraformを使えばArukas/シンプル監視を紐付けてコマンド一発で構築できるよ
概要
Arukasはさくらインターネットが提供するDockerコンテナのホスティングサービスです。
現状β版で、無料で使えます。
手軽にコンテナを起動しておける便利な環境なのですが、
一定期間でコンテナが再起動される = (エンドポイント以外の)グローバルIP/ポート番号が変化する
という仕様になっています。(参考:Arukas:サービス仕様)
そこでグローバルIP/ポートが変わったら気づけるように、さくらのクラウドのシンプル監視を用いて監視し、変更があったらメール or Slackへ通知が来るようにしてみます。
また、単純に監視設定するだけでは、変化がある度にシンプル監視の対象グローバルIP/ポート番号を変更しないといけません。
これはちょっと面倒なため、Terraformを用いることでコマンド一発で設定できるようにしてみます。
なお、さくらのクラウドのシンプル監視は、対象がさくらインターネットの提供するグローバルIP、かつ監視対象をIPアドレスで指定すれば無料で使えちゃいます。嬉しいですね
構築
準備
以下が必要です。
-
Terraform
のインストール -
Terraform for さくらのクラウド
のインストール + APIキーの発行 -
Terraform for Arukas
のインストール + APIキーの発行
下記ページを参考に準備してください。
Terraform for さくらのクラウドのインストール
Terraform for Arukasのインストール
APIキーを取得したら以下コマンドで環境変数に設定しておいてください。
# さくらのクラウド APIキー
$ export SAKURACLOUD_ACCESS_TOKEN=[取得したAPIキー]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[取得したAPIシークレット]
# Arukas APIキー
$ export ARUKAS_JSON_API_TOKEN=[取得したAPIキー]
$ export ARUKAS_JSON_API_SECRET=[取得したAPIシークレット]
定義ファイル作成
今回は例としてArukasでNginxコンテナを立ち上げ、80番ポートをEXPOSEします。
シンプル監視にてArukasが割り当てたグローバルIP/ポートの監視を行います。
通知はメールで行います。
以下のようなファイルを作成します。
# Arukasコンテナ定義
resource "arukas_container" "ct" {
name = "arukas-with-simple-monitor"
image = "nginx:latest"
ports = {
protocol = "tcp"
# 80番ポートをEXPOSE
number = "80"
}
}
# さくらのクラウド シンプル監視定義
resource "sakuracloud_simple_monitor" "demo_monitor" {
# 監視対象IPアドレス:arukas側の情報を参照
target = "${arukas_container.ct.port_mappings.0.ipaddress}"
health_check = {
# tcpで指定ポートを監視
protocol = "tcp"
# 監視対象ポート番号:arukas側の情報を参照
port = "${arukas_container.ct.port_mappings.0.service_port}"
}
# Eメールでの通知有効化
notify_email_enabled = true
# Slack通知を行う場合は以下2つのパラメータを設定すればOK
# notify_slack_enabled = true
# notify_slack_webhook = "https://hooks.slack.com/services/xxxxx"
}
各定義の詳細は以下のリファレンスを参照ください。
コンテナ起動 & 監視登録
以下コマンドを実行してArukasでのコンテナ起動とシンプル監視の登録を行います。
$ terraform apply
出来ましたね?コントロールパネルなどから確認してみてください。
コンテナを再起動させてみる & 監視再登録
Arukasのコントロールパネルからコンテナを再起動させてみましょう。
グローバルIP/ポート番号が変更され、シンプル監視でエラー検知されると思います。
、、、通知メール(or Slackへの通知)が届きましたか?
このままだと次回コンテナが再起動されたことを検知できないため、以下コマンドでシンプル監視を再登録しておきましょう。
# 再実行
$ terraform apply
これでコンテナ再起動で割り当てられた新しいグローバルIP/ポート番号への監視が行われます。
以降は通知が来たら都度terraform apply
を実行するようにしてあげればOKです。
まとめ
ArukasでIP/ポートが変わったら通知が来るようにできました。
例えばArukasで複数のポートをEXPOSEしている場合、エンドポイントが割り当てられるのは
最初のポートだけなため、2番目以降のポートは動的にポート番号が変わってしまう可能性があります。
こんな場合に今回の方法は有効だと思います。
また、今回使ったTerraform
なら複数のサービスにまたがったインフラ構成でも
作成/管理しやすいのでオススメです。是非使ってみてください。
ボツネタ:現行Terraformバージョンでは使えない書き方
本当は以下のように書きたいんですが、、、現状できません。
count
に対し、他のリソースを参照して値を設定する機能はTerraformに未実装です。
(2016/6/20現在:v0.6.16)
Github:Issue
以下のように書ければtfファイル作成がかなり楽になるのですが、、残念です。
resource "sakuracloud_simple_monitor" "demo_monitor" {
# arukas側で公開したポート数分の監視設定を作成する
count = "${length(arukas_container.ct.port_mappings)}"
# 監視対象IPアドレス,arukas側の情報を参照
target = "${arukas_container.ct.port_mappings.*.ipaddress[count.index]}"
health_check = {
protocol = "tcp"
# 監視対象ポート番号,arukas側の情報を参照
port = "${arukas_container.ct.port_mappings.*.service_port[count.index]}"
}
notify_email_enabled = true
}