Google Cloud初心者のAWSユーザーがMackerelにGoogle Cloudインテグレーションを設定してみる #mackerelio

仕事柄AWSばかりでGCPは完全な素人(シロウト)なんですが、年末なのでCloud Shellでがんばってみました!
2020.12.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、観測してますか!(挨拶

本記事は Mackerel Advent Calendar 2020 の 21 日目の記事です。

はやいもので、Mackerel が Google Cloud インテグレーションをリリースしてから 3 ヶ月が過ぎようとしています。

これまで Google Cloud は触ってみたいと思いつつ、なかなかさわる機会もなかったのですが、今回のアドベントカレンダーのネタとしてインテグレーションを設定してみました。
とにかく初めてさわるものなので、ドキュメントは参考程度に思うがままに設定追加してみたいと思います。

Google Cloud ということはCloud Shell で操作すれば良い、ということくらいはぼくでも知っているのでそこから始めます!

ドキュメント・参考資料

必要なことはここに全てかいてありますので、基本はこちらに従って操作します。

今回は基本 Cloud Shell での操作なので、このうち Cloud SDK を用いた連携方法 を参照すればいいということですね。

gcloudコマンドの意味は、↓のドキュメントを眺めながら読み解いていきます。

手順

今回は、Google Cloud の Compute Engine インスタンス 1 台を監視することを目標とします。

やることは AWS インテグレーションと大きくは変わりません。流れとしては以下となります。

  1. Google Cloud 側で、Mackerel がアクセスするための認証情報を作成する
  2. (OPTIONAL) Google Cloud 上で監視したいリソースにラベルを付ける
  3. (OPTIONAL) Mackerel で、Google Cloud のリソースを登録するためのサービス・ロールを用意する
  4. Mackerel にインテグレーションの設定をする
  5. (Compute リソースのみ) mackerel-agent を導入する

順にやっていきます!

Cloud Shell の起動とプロジェクト ID 設定

何はともあれ Cloud Shell を起動しましょう。

Mackerel の手順書だとここでコンフィグを作ることになっていますが、そもそも Cloud Shell の環境なんてディスポーザブルで一過性のものなので、気にせずそのまま進めます。

続く作業のために、Cloud Shell のプロジェクト設定をMackerel で監視したいプロジェクトにセットしておきます。
コンフィグは作っていないので、今回の場合は--configuration=NAMEの指定は不要ですね。このあとのコマンド群も同様です。

gcloud config set project <プロジェクト名>

Cloud Shell が承認を求めてきたら「承認」をクリックしてあげてください。

次に手順にしたがって、Mackerel が使う Cloud SDK API を有効化しておきます。めんどくさいのでforで回しました。
Compute Engine だけでなくて Cloud SQL と App Engine も有効にしてますが、気になる方は適当にいじってください。

for api in cloudresourcemanager monitoring compute sqladmin appengine
do
    gcloud services enable ${api}.googleapis.com
done

gcloud services listで現状許可されている API のリストが見られます。有効化したものが表示されていたら成功ですね。

$ gcloud services list
NAME                                 TITLE
appengine.googleapis.com             App Engine Admin API
bigquery.googleapis.com              BigQuery API
bigquerystorage.googleapis.com       BigQuery Storage API
cloudapis.googleapis.com             Google Cloud APIs
clouddebugger.googleapis.com         Cloud Debugger API
cloudresourcemanager.googleapis.com  Cloud Resource Manager API
cloudtrace.googleapis.com            Cloud Trace API
compute.googleapis.com               Compute Engine API
datastore.googleapis.com             Cloud Datastore API
logging.googleapis.com               Cloud Logging API
monitoring.googleapis.com            Cloud Monitoring API
oslogin.googleapis.com               Cloud OS Login API
servicemanagement.googleapis.com     Service Management API
serviceusage.googleapis.com          Service Usage API
sql-component.googleapis.com         Cloud SQL
sqladmin.googleapis.com              Cloud SQL Admin API
storage-api.googleapis.com           Google Cloud Storage JSON API
storage-component.googleapis.com     Cloud Storage
storage.googleapis.com               Cloud Storage API

認証情報(サービスアカウントキー)の作成

Mackerel が使うサービスアカウントを作成し、それに必要な権限を当てていきます。

Cloud Shell ではプロジェクト ID が環境変数 DEVSHELL_PROJECT_ID に格納されているので、それを使って指定の手間を省きました。ついでに作成するサービスアカウント名も環境変数 ACCOUNT に格納しておいて使い回します。

# サービスアカウントの名前を環境変数に設定
export ACCOUNT="mackerel-integration"

# サービスアカウントを作成
gcloud iam service-accounts create ${ACCOUNT} \
    --display-name='Mackerel Integration' \
    --description='Mackerel account'

# サービスアカウントにポリシーを連結
for role in browser monitoring.viewer compute.viewer cloudsql.viewer appengine.appViewer
do
  gcloud projects add-iam-policy-binding ${DEVSHELL_PROJECT_ID} \
    --member=serviceAccount:${ACCOUNT}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
    --role=roles/${role}
done

ここでも Compute Engine だけでなくて Cloud SQL と App Engine も有効にしてますので、気になる方は適当にいじってください。

連結できたらキーファイルを作成します。
どうせあとからコピペするので、ファイルの中身は標準出力に表示させておきます。

# サービスアカウントキーファイルの作成
gcloud iam service-accounts keys create \
    --iam-account=${ACCOUNT}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
    ${ACCOUNT}.json && \
    cat $_

これで、サービスアカウント側の準備は完了ですね!

(OPTIONAL) Mackerel 監視対象リソースにラベルをつける

Mackerel の Google Cloud インテグレーションは、AWS インテグレーションと同様に、Mackerel で監視するリソースをラベルで絞り込めます。AWS でいうところのタグのようなものですね。

せっかくなので設定してみます。
東京リージョンのゾーン A で起動中の Compute Engine のインスタンス instance-1 にラベル monitor:mackerel を付ける場合、Cloud Shell のコマンドは下記のようになります。

gcloud compute instances update \
    instance-1 \
    --zone=asia-northeast1-a \
    --update-labels monitor=mackerel

(OPTIONAL) Mackerel のサービス・ロールを用意

いよいよ Mackerel 側の設定にはいります。

Google Cloud インテグレーションで追加されたホストを所属させるサービス・ロールを決めておきましょう。既存のものでもいいし、新規に作るのもありです。
ここではGCPサービスの下にComputeロールを作りました。

これは後ほど設定で使います。

Mackerel にインテグレーションの設定をする

ここはドキュメントどおりですね。
Google Cloud インテグレーションのタブから「新しい Google Cloud インテグレーション設定を登録」をクリック

プロジェクト ID のところには、監視対象のプロジェクトの ID を。
サービスアカウントキーのところに、先ほど作成したキーの内容をコピペします。

入力後、フォームからフォーカスが外れたあとに、正しく認証されるかどうかチェックが入ります。右上に緑のチェックマークがはいったら OK です。

その下も必要項目を埋めましょう。

「現在の連携ホスト数」が意図通り「Compute Engine」x1 となれば OK です!

Mackerel ダッシュボードの「Hosts」の欄から、該当のインスタンスが確認できるかと思います(すこし時間がかかります)。

Compute Engine インスタンスに mackerel-agent を導入する

ここまでで「インテグレーション」としては官僚なんですが、ついでに mackerel-agent も導入します。 該当インスタンスには、下記のコマンドで Cloud Shell から SSH 接続できますね。

$ gcloud beta compute ssh --zone asia-northeast1-a instance-1

こちらは Debian イメージでつくったインスタンスの素の状態なのですが、wget コマンドが入っていないので、インストラクションそのままが使えません。

ここは普通に curlに置き換えて実行しましょう。あとはセットアップスクリプトが賢く環境を判別してくれます。

$ curl -fsSL https://mackerel.io/file/script/setup-all-apt-v2.sh | MACKEREL_APIKEY='******' sh
Superuser authority is required to setup Mackerel agent:
+ command -v curl
/usr/bin/curl
+ http_get=curl -LfsS
+ [ curl -LfsS =  ]
+ echo deb [arch=amd64,arm64] http://apt.mackerel.io/v2/ mackerel contrib
+ curl -LfsS+ apt-key add -
 https://mackerel.io/file/cert/GPG-KEY-mackerel-v2
OK
+ apt-get update -qq
+ apt-get install -y mackerel-agent
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  mackerel-agent
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
Need to get 2104 kB of archives.
After this operation, 6613 kB of additional disk space will be used.
Get:1 http://apt.mackerel.io/v2 mackerel/contrib amd64 mackerel-agent amd64 0.71.0-1.systemd [2104 kB]
Fetched 2104 kB in 0s (16.1 MB/s)       
Selecting previously unselected package mackerel-agent.
(Reading database ... 39138 files and directories currently installed.)
Preparing to unpack .../mackerel-agent_0.71.0-1.systemd_amd64.deb ...
Unpacking mackerel-agent (0.71.0-1.systemd) ...
Setting up mackerel-agent (0.71.0-1.systemd) ...
Created symlink /etc/systemd/system/multi-user.target.wants/mackerel-agent.service → /lib/systemd/system/mackerel-agent.service.
+ mackerel-agent init -apikey=********
+ systemctl start mackerel-agent
*************************************

     Done! Welcome to Mackerel!

*************************************

connectivity や cpu / memory の詳細、ハードウェア情報などが取得できるようになってますね!

おまけ:後片付けについて

もしインテグレーションを止める場合は、Mackerel 側で設定を削除することはもちろんのこと、Google Cloud 側のサービスアカウントも忘れずに無効化 or 削除しておきましょう。

個人的に、この手の削除作業は GUI で目視しながら行うのが安全でよいと思ってますw

ちなみに Cloud Shell の環境、特にホームディレクトリ配下は 120 日間放置すればまっさらになりますが、明示的に新しくまっさらに作り直したい場合は、下記のドキュメントに従い、下記コマンド実行後に再起動するとといいようです。 GCP さんハードボイルドっすね

sudo rm -rf $HOME

まとめ

GCP と Cloud Shell の勉強を兼ねて、Mackerel の Google Cloud インテグレーションを試してみました。
Cloud Shell はある程度出来合の環境が整えられているし、さくっと作り直せるし、ちょっとした作業を行う捨て環境としては最適ですね。

Mackerel Advent Calendar 2020 も残りあと数日。楽しみましょう!