15分でできるサーバーレス死活監視

Webサービスの死活監視をするためだけに別途サーバーを用意すると、その死活監視用のサーバーが死んでたらどうしようとビクビクして夜も寝られなくなります。そこでサーバーレスにすればその不安もわりと減るよね、という話は色々なところでされているわけですが、それをなるべく簡単に実現しようということで方法をメモがてら記しておきます。

 

今回の構成を端的にまとめると、

  • AWS Lambdaを利用する
  • Lambdaへのデプロイにはchaliceを利用する
  • 監視対象の情報はiniファイルに記述する
  • iniファイルはS3に配置する
  • CloudWatch Eventsによって定期的にLambdaを実行する

という感じです。

  

では早速作業してみましょう。AWSの各種サービスの扱いに慣れていれば15分もかからないと思います。

 

1. 事前準備

% sudo pip install chalice
% cat ~/.aws/config
[default]
region = ap-northeast-1
aws_access_key_id = <YOUR ACCESS KEY>
aws_secret_access_key = <YOUR SECRET KEY>

 

2. プロジェクトの作成/ソース配置/ひとまずデプロイ

% chalice new-project serverless-health-checker
% cd serverless-health-checker/
% ls -a
./  ../  .chalice/  .gitignore  app.py  requirements.txt
% git clone https://github.com/phero/serverless-health-checker-src.git
% ln -sf serverless-health-checker-src/* .
% chalice deploy
Initial creation of lambda function.
Updating IAM policy.

The following actions will be added to the execution policy:

logs:PutLogEvents
logs:CreateLogGroup
logs:CreateLogStream

Would you like to continue? [Y/n]: Y
Creating deployment package.
Lambda deploy done.
API Gateway rest API already found.
Deleting root resource id
Done deleting existing resources.
Deploying to: dev
https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/

この時点で上記末尾のURLにアクセスしてみると何やらごちゃごちゃとエラーが表示されますが、これで正常です。

 

3. AWS Lambdaの設定

3-1. Lambdaの設定画面からserverless-health-checker(いつの間にか作成されているはずです)をクリックします。

f:id:phero:20170125213137p:plain

 

3-2. Codeのタブから環境変数(Environment variables)を入力します。

SLACK_CHANNEL 通知する先のSlackのチャネル名。"#"から始めるのと、事前にチャネルを作成しておくことをお忘れなく。
SLACK_WEBHOOK Slack Incoming WebhookのURL
SLACK_USERNAME 任意の名前でOK
S3_CONFIG_KEY_NAME 今回はconfig.ini決め打ちでOK
S3_CONFIG_BUCKET_NAME 上記のconfig.iniを置くS3のバケット名

f:id:phero:20170125213754p:plain

 3-3. TriggersのタブからAdd triggerをクリックし、

f:id:phero:20170125214009p:plain

3-4. CloudWatch Events - Scheduleを選択し、

f:id:phero:20170125214055p:plain

3-5. 死活監視をする間隔(下図の例では1分毎)を入力し、Submitボタンをクリックします。

f:id:phero:20170125214232p:plain

3-6. 最後にSaveボタンをクリックします。(これ忘れがちなので要注意です)

f:id:phero:20170125233322p:plain

 

4. S3へのiniファイルの配置

以下のような内容でconfig.iniというテキストファイルを作成します。

[DEFAULT]
status = 200
timeout = 5 [My Web Site 1]
url = <監視したいURL> [My Web Site 2]
url = <監視したいURL>

それをS3のバケット(S3_CONFIG_BUCKET_NAMEで指定したバケット)にconfig.iniという名前で配置してください。

 

5. S3へのアクセス権限の設定

5-1. IAMの設定ページからロールを確認すると serverless-health-checker というロールがこれまたいつの間にか作成されているので、それをクリックし、

f:id:phero:20170125215958p:plain

5-2. 「ポリシーをアタッチ」のボタンをクリックし、

f:id:phero:20170125220129p:plain

5-3. AmazonS3ReadOnlyAccessを選択し、画面右下の「ポリシーのアタッチ」ボタンをクリック。

f:id:phero:20170125220256p:plain

 

6. 動作確認

さきほどごちゃごちゃとエラーが表示されていた https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/ のページにもう一度アクセスし、先ほどconfig.iniで指定したサイトのURLなどが表示されていれば作業完了です。

 

ためしにconfig.iniの内容を

[DEFAULT]
status = 200
timeout = 5
[My Web Site 1]
url = <監視したいURL>
timeout = 0.001
[My Web Site 2]
url = <監視したいURL>

などと変更し、わざとタイムアウトするようにしてみると、Slackに

f:id:phero:20170125223418p:plain

のようなメッセージが書き込まれるかと思います。

 

というわけで、サーバーレスの死活監視システムの構築方法でした。chaliceとても使いやすくて良いですね。