Stackdriver アラートポリシーを自動でオンオフする

Stackdriver Monitoring は、アプリケーションやインフラの状況をモニタリングでき、あらかじめ指定した条件を満たした場合に通知を行うようなアラート設定を行うことができます。

しかし、定期的に深夜に自動でアプリケーションの再起動を行なっている場合やインスタンスのメンテナンスを行う場合、ポリシーのオン/オフをその都度コンソール上から手動で切り替えるのは少々面倒です。

Stackdriver Monitoring v3 API を使用すれば、このオン/オフ作業を自動化することが可能です。コンソール以外で変更する方法あるの?と疑問に思っている方向けに、本記事では、Stackdriver Monitoring v3 API で提供されるアラートポリシーと通知チャネルの管理機能を使って、コンソール以外のアラートポリシーの設定変更方法をご紹介します。

環境設定

まずはじめに、インスタンスの作成と作成したインスタンスをモニタリングする設定を行います。

1.インスタンスの作成

インスタンスを作成します。
設定自体は下記のような設定にしています。

名前:apps-gcp-stackdriver-test
タイプ:g1-small
ファイアウォール:HTTP/HTTPSトラフィックを許可
リージョン:asia-northeast1
ソーン:asia-northeast1-a
その他はデフォルトのまま

インスタンス作成後、Apache をインストールします。

コード
sudo apt-get update
sudo apt-get install apache2 
sudo /etc/init.d/apache2 start

この状態でインスタンスに設定されている外部IPにアクセスします。
Apache2 のデフォルトページが表示されたら完了です。

2.Stackdriver アカウントの作成

次はStackdriver の設定を行います。
Stackdriver を利用するためには、まずStackdriver アカウントを作成します。
すでに作成済みの場合は、設定不要です。
まだ作成していない場合は、下記を参照して作成してください。

Cloud Console から「モニタリング」を選択。
Stackdriver アカウントがない場合、新しく作成するか、既存のStackdriver アカウントと紐付けるかのメッセージが表示されます。

  1. 「Create a new Stackdriver account」を選択。
  2. 紐付けるプロジェクトを記載し、「Continue」を選択。
  3. 「Add Google Cloud Platform projects to monitor]」ページで、「Continue」を選択。
  4. 「Monitor AWS accounts」ページで、「Skip AWS Setup」を選択。
  5. 「Install the Stackdriver Agents」ページで、「Continue」を選択。
    ※エージェントのインストールは後ほど行います。
  6. 「Get Reports by Email」ページで、「No reports」を選択して 「Continue」を選択。
  7. ページの上部に 「Gathering information..」というメッセージが表示され、数秒後に次のメッセージが表示されます。
  8. 「Launch monitoring」を選択します。
  9. Stackdriver アカウントのダッシュボードが表示されます。

3.Stackdriver Monitoring Agent のインストール

Stackdriver エージェントのインストールを行います。
Console からVMインスタンスへSSH接続。
下記コマンドを実行し、Monitoring エージェントとLogging エージェントをインストール。

コード
Monitoring エージェント
curl -sSO https://dl.google.com/cloudagents/install-monitoring-agent.sh
sudo bash install-monitoring-agent.sh

Logging エージェント
curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
sudo bash install-logging-agent.sh

これでStackdriver アカウントの作成は完了です。

4.Uptime Checkとアラートポリシーの作成

Uptime Checkとアラートポリシーの設定を行います。

Uptime Check

Stackdriver Monitoring コンソールへ移動し、「Create an Uptime Check」を選択。
Title:Test Uptime Check
Check Type:HTTP
Resource Type:インスタンス
Applies To:Single、apps-gcp-stackdriver-test
それ以外はデフォルト設定

Test を選択し、動作確認をします。
正常に動作することを確認できたら「Save」を選択。

アラートポリシー

稼働時間チェックの設定後、「Uptime Check Created」の画面が表示され画面下部に「Create Alerting Policy」ボタンがあるので選択。

アラートポリシーの設定画面に移るので、それぞれ設定していきます。
Condirions:HTTP check on instance [instance_name] と記載されていれば特に変更なし
Notifications:通知先に設定するメールアドレスを選択
Documntation:アラート時に記載される任意の文章を入力
       今回は、「Uptime Check テスト」と入力
Name this policy:デフォルトのまま特に変更なし

「Save Policy」 を選択。

5.チェックとアラートのテスト

アラートが正常に機能するかテストします。

インスタンスの停止

さきほど作成したインスタンスを停止させます。
Cloud Console からGCEを選択。
「apps-gcp-stackdriver-test」インスタンス右側の▼から、「停止」を選択。
Uptime Check で失敗になるまで待機します。
失敗した段階でアラート通知が設定したメールアドレスに送信されます。
設定したアドレスに下記のような内容でメールが届きます。

無事にアラート通知が動作したら、インスタンスは起動しておきましょう。

アラートポリシーを自動で変更する

アラートポリシーを自動で変更する方法を紹介します。
自動で設定を変更するため、今まで使用したConsole 等のGUIからではなく、CLIから実行します。
実行する方法として、3種類があります。

  1. APIを直接呼び出す(HTTP/gRPC)
  2. クライアントライブラリを使用する
  3. Cloud SDK を使用する

それぞれについて、紹介していきます。

0.ポリシーIDの確認

ご紹介するいくつかの方法では、アラートポリシーのIDを指定します。
Monitoring のコンソール画面からはポリシーIDが確認できないため、取得方法をご紹介します。

下記コマンドを環境に合わせて書き換えてから実行してください。

コード
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN GET "https://monitoring.googleapis.com/v3/projects/YOUR_PROJECT_ID/alertPolicies"

上記コマンドを実行すると下記のようなアラートポリシーの詳細情報がjson形式で出力されます。
アラートポリシーIDは、”name” 値文末の18桁の数字です。

コード
{
  "alertPolicies": [
    {
      "name": "projects/YOUR_PROJECT_ID/alertPolicies/ALERTPOLICY_ID",
      "displayName": "Uptime Check Policy",
      "combiner": "OR",
      "creationRecord": {
        "mutateTime": "2018-07-03T07:04:25.547479682Z",
        "mutatedBy": "YOUR_ACCOUNT"
      },
      "mutationRecord": {
        "mutateTime": "2018-07-26T04:02:21.677080502Z",
        "mutatedBy": "YOUR_ACCOUNT"
      },
      "conditions": [
        {
          "conditionThreshold": {
            "filter": "metric.type=\"monitoring.googleapis.com/uptime_check/check_passed\" AND metric.label.check_id=\"uptime-check-test\" AND resource.label.instance_id=\"4323243808139947362\" AND resource.type=one_of(\"gce_instance\", \"aws_ec2_instance\")",
            "comparison": "COMPARISON_GT",
            "thresholdValue": 1,
            "duration": "300s",
            "trigger": {
              "count": 1
            },
            "aggregations": [
              {
                "alignmentPeriod": "1200s",
                "perSeriesAligner": "ALIGN_NEXT_OLDER",
                "crossSeriesReducer": "REDUCE_COUNT_FALSE",
                "groupByFields": [
                  "resource.label.*"
                ]
              }
            ]
          },
          "displayName": "HTTP check on instance apps-gcp-stackdriver-test",
          "name": "projects/ca-tkg-test/alertPolicies/970032983077305641/conditions/970032983077302826"
        }
      ],
      "documentation": {
        "content": "Uptime Check テスト",
        "mimeType": "text/markdown"
      },
      "notificationChannels": [
        "projects/YOUR_PROJECT_ID/notificationChannels/6973779047957085362"
      ],
      "enabled": false
    }
  ]
}

1.APIを直接呼び出す(HTTP/gRPC)

直接HTTP経由でAPIリクエストを送信し、アラートの切り替えをします。
今回紹介する方法では、下記の準備が必要です。

  • Cloud SDK のインストール
  • アカウントから発行したアクセストークン

Cloud SDK のインストール

Cloud SDK のインストールを行い、ローカルマシンからGCPに対してアクセスする準備をします。
こちらのドキュメントから自端末のOSに合うパッケージをインストールしてください。
※その後の手順もドキュメントに記載されているため、本記事では割愛します。

アカウントから発行したアクセストークン

API に対してリクエストを送信する場合、送信元が送信先に対して最適な権限を持っている必要があります。

認証情報を識別するための文字列のことをアクセストークンと呼び、権限を持つアカウントからアクセストークンを発行し、リクエストのヘッダーに追加してAPI に対してリクエストを送信します。
実際のリクエスト方法は後述しますので、まずは発行方法から紹介します。
といっても、コマンド一つで発行可能で非常に簡単です。

下記コマンドを1. でCloud SDK をセットアップした端末から実行してください。
まずはどのアカウントでアクセストークン を発行するか確認します。

コード
入力コマンド
gcloud config list

出力結果
account = YOUR_ACCOUNT
disable_usage_reporting = True or False 
project = YOUR_PROJECT

上記のように出力されますので、今回アクセストークンを発行するアカウントとプロジェクトかご確認ください。
確認後、下記コマンドを実行しアクセストークン を発行します。

コード
gcloud beta auth application-default print-access-token

コマンド実行後、ランダムな文字列が出力されたと思います。これがアクセストークンです。
※アクセストークンは生成後1時間で有効期限切れとなります。

アクセストークン発行後、実際に発行したトークンを使用して、APIリクエストを送信します。
送信するために、ローカルマシンからcurl コマンドを実行します。
下記コマンドをベースに、自分の環境に置き換えてリクエストを送信してください。

  • YOUR_ACCESS_TOKEN:さきほど発行したアクセストークンを記載
  • PROJECT_ID:対象のプロジェクトのIDを記載
  • ALERT_POLICY_ID:対象のAlert PolicyのIDを記載
コード
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d "{'name':'projects/PROJECT_ID/alertPolicies/ALERT_POLICY_ID','enabled':false or true}" \
-X PATCH \
"https://monitoring.googleapis.com/v3/projects/PROJECT_ID/alertPolicies/ALERT_POLICY_ID
?updateMask=enabled&fields=displayName%2Cenabled%2Cname"

直接リクエストを送る方法の紹介は終了です。

2. クライアントライブラリを使用する

Stackdriver Monitoring クライアントライブラリを使用して、設定変更を行う方法です。
クライアントライブラリを使用することで、任意の言語でAPI に対してリクエストが送れます。
まずクライアントライブラリのインストールを行います。

Monitoring クライアントライブラリのインストール

コード
pip install --upgrade google-cloud-monitoring

その後、下記コマンドを実行し、認証を行なってください。

APIアクセス用のユーザーアカウントの認証情報を取得

コード
gcloud auth application-default login

※上記コマンドをローカル環境から実行するためには、「APIを直接呼び出す」で紹介したCloud SDK のインストールが必要になります。

ここまで終了したら、オン/オフを行うためのコードを作成していきます。
今回はPython を使用してアラートポリシーのオン/オフをするコードを作成しました。
公式ドキュメントGithubを参考にしていますので、他の機能を利用する場合はご参照ください。

ファイル名は、monitoring_alert_policy.py です。

コード
from __future__ import print_function

import argparse
import json
import os

from google.cloud import monitoring_v3


def enable_alert_policies(project, enable, filter_=None):
    client = monitoring_v3.AlertPolicyServiceClient()
    name = client.project_path(project)
    policies = client.list_alert_policies(name, filter_=filter_)

    for policy in policies:
        if bool(enable) == policy.enabled.value:
            print(‘Policy’, policy.name, ‘is already’,
                  ‘enabled’ if policy.enabled.value else ‘disabled’)
        else:
            policy.enabled.value = bool(enable)
            mask = monitoring_v3.types.field_mask_pb2.FieldMask()
            mask.paths.append(‘enabled’)
            client.update_alert_policy(policy, mask)
            print(‘Enabled’ if enable else ‘Disabled’, policy.name)

enable_alert_policies(“YOUR_PROJECT_NAME”,True)

ソースコード最下部 enable_alert_policies の引数「True」の値でオン/オフを設定します。
「True」の場合はオン
「False」の場合はオフになります。

3. Cloud SDK を使用する

下記コマンドを実行することで、アラート設定のオン/オフができます。
※ローカル環境で使用するには、「APIを直接呼び出す」で紹介したCloud SDK のインストールが必要となります。

コード
Cloud SDK 
アラートのオン
gcloud alpha monitoring policies update ALERT_POLICY_ID --enabled
アラートのオフ
gcloud alpha monitoring policies update ALERT_POLICY_ID --no-enabled

まとめ

本記事では、Stackdriver Monitoring のアラートポリシーのオン/オフを、コンソール以外から変更する方法をご紹介しました。
今回は切り替え方法のみご紹介しましたが、上記3つの方法を流用することにより、新しいポリシーの作成や削除等様々なことができます。
コマンドから実行すると、自動化や簡略化等もできますので、これを機にコンソール以外の方法も試してみてはいかがでしょうか。

次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます