Mackerel

MackerelのAWSインテグレーションで自動ホスト管理を実現してみた。

前置き

ども、安田です。
最近Mackerelをいじることが多いので、
ちょいネタをアップロードします。
誰かにさされー!

目次

  1. AWSインテグレーションでの自動ホスト登録の紹介
    2.ホストの手動解除の課題
    3.シェルスクリプトの紹介
    4.定期実行の設定
    5.自動退役のメリット

AWSインテグレーションでの自動ホスト登録の紹介

AWSインテグレーションは、AWSマネージドサービス(EC2やRDS)を
Mackerelのホストとして自動登録し、メトリックを監視することができる便利な機能です。
仕様や対応しているAWSマネージドサービスについては、以下を参照してください。
公式ドキュメントはこちら

ホストの手動解除の課題

AWSインテグレーションは便利な機能ですが、
ホストの自動解除には対応していません。

そのため、例えばGitを使ってインフラをデプロイする環境では、
古いホストと新しいホストが混在してしまうという問題が発生します。
不要になったホストの退役は手動で行わなければならず、
手間が増えるため、運用負担が大きくなります。
そこで、今回はこの手間を削減するために、
シェルスクリプトを使ってホストを自動で退役させる方法を紹介します。

シェルスクリプトの紹介

以下のシェルスクリプトでは、Mackerel APIを使用してホストの情報を取得し、
登録日時を比較して古いホストを自動的に退役させます。
このスクリプトは、ホスト名が同じであれば、より古いホストを退役させ、
新しいホストを維持するように設計されています。
退役処理はcurlコマンドを使用してMackerel APIにリクエストを送信し、
レスポンスを確認しています。

mackerel-ri.sh
#!/bin/bash

# ログファイルの設定(ログが必要な場合はアンコメント)
# log_dir="logs/mackerelapilogs"
# mkdir -p "$log_dir"
# log_file="$log_dir/mackerelapi.log"

{
    # APIキーを環境変数から取得
    API_KEY="${MACKEREL_API_KEY}"

    # ホスト情報を取得して、HTTPステータスコードとレスポンスボディを別々の変数に保存
    http_code=$(curl -s -H "X-Api-Key: $API_KEY" -w "%{http_code}" -o temp.json "https://api.mackerelio.com/api/v0/hosts")
    hosts=$(<temp.json)

    if [ "$http_code" -ne 200 ]; then
        echo "ERROR: API call failed with status $http_code" >&2
        rm temp.json
        exit 1
    fi

    if [ -z "$hosts" ] || [ "$hosts" == "null" ]; then
        echo "ERROR: No data received or data is null." >&2
        rm temp.json
        exit 1
    fi

    declare -A host_names
    declare -A creation_dates

    # JSONからデータを抽出し、古いホストを退役
    echo "$hosts" | jq -c '.hosts[] | {id: .id, name: .name, createdAt: .createdAt}' | while IFS= read -r data; do
        id=$(jq -r '.id' <<< "$data")
        name=$(jq -r '.name' <<< "$data")
        createdAt=$(jq -r '.createdAt' <<< "$data")  # すでにタイムスタンプとして受け取る

        if [[ -n "${host_names[$name]}" ]]; then
            if [[ "${creation_dates[$name]}" -gt "$createdAt" ]]; then
                delete_response=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "X-Api-Key: $API_KEY" -H "Content-Type: application/json" -d '{}' "https://api.mackerelio.com/api/v0/hosts/$id/retire")
                if [ "$delete_response" -eq 200 ]; then
                    echo "Retired older host: $name with ID $id"
                else
                    echo "Failed to retire host: $name with ID $id, Status: $delete_response"
                fi
            fi
        elif [[ -z "${host_names[$name]}" || "${creation_dates[$name]}" -lt "$createdAt" ]]; then
            host_names[$name]=$id
            creation_dates[$name]=$createdAt
        fi
    done

    rm temp.json  # 一時ファイルを削除

} 2>&1 | tee -a "$log_file"

このスクリプトは、jqを使用してホスト情報をJSON形式から抽出し、
ホスト名と登録日時を比較して退役処理を実行します。
実行結果はログに保存されるように設定可能です。

定期実行の設定

まずは読者の環境でちゃんと動くか確認いただいてからですが、
定期的なホスト管理の自動化を実現するために、
このスクリプトを定期的に実行することを強くオススメします。
以下の例では、毎日午前1時にこのスクリプトが実行されるよう設定しています。

0 1 * * * export MACKEREL_API_KEY='MackerelAPIキー'; /home/ec2-user/script/mackerel-API/mackerel-ri.sh

自動退役のメリット

ずばり運用負荷の軽減
手動でホストを退役させる必要がなくなるため、運用チームの負担を削減できます。
特に、頻繁に環境が変わるクラウド環境では、スクリプトによる自動化が有効です。

つまり管理が楽ちん×2ってことさ!

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA