こんにちは、 SRE の平です。
今回は AWS EC2 インスタンスの各種メトリクスを、 Grafana Agent と、 Grafana のマネージドサービスである Amazon Managed Service for Grafana (以下 AMG )と、 Amazon Managed Service for Prometheus(以下 AMP )を組み合わせて可視化していく手順を書いてみました。
手順および目次は以下の通りです。
- AMGを用意する。
- 監視アカウントで、AMPを用意する。
- 監視アカウントで、AMPに書き込むIAMロールを作成する。
- 本番アカウントで、AMPに書き込むIAMポリシーを作成し、EC2等のIAMロールにアタッチする。
- 監視対象に Grafana Agent をインストールする。
- 監視対象で Grafana Agent の起動・終了
- 管理アカウントで、AMGにAMPのデータソースを追加し、Exploreでメトリクスを目視する
それではやっていきましょう。
AMGを用意する。
前回の AMGでコストの可視化 をご覧いただければ幸いです。
監視アカウントで、AMPを用意する。
AMPを開きワークスペースを作成しますが、ワークスペース名を入力する程度で完了です。 AMGはAWSの管理アカウントで作成しましたが、AMPは別の監視用アカウントに作成しました。 なお今回のターゲットであるEC2はさらに別の本番アカウント等で上がっており、アカウントがとても分かりずらいので以下のようにまとめておきます。
種別 | アカウントID例 | 用途 |
---|---|---|
管理アカウント | 0000 | SSO/AMG |
監視アカウント | 0001 | AMP |
本番アカウント | 0002 | EC2等の監視対象が動いている |
監視アカウントで、AMPに書き込むIAMポリシーを作成する。
監視アカウントにて、本番アカウントから届くメトリクスを受け入れるIAMロールを以下のように作成します。
- エンティティの種類:別のAWSアカウント
- アカウントID:0002 (実際はきちんとしたアカウントIDをご指定ください)
- ポリシーの選択:AmazonPrometheusRemoteWriteAccess
- ロール名:例として role_amp_remotewrite_honban とした
本番アカウントで、AMPに書き込むIAMポリシーを作成し、EC2等のIAMロールにアタッチする。
本番アカウントで、role_amp_remotewrite_honban を指定するようなものを作成します。ポリシー作成からJSONにて指定し、 policy-amp-monitor などの名前で保存しました。
※アカウントIDとロール名は適宜ご変更ください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::0001:role/role_amp_remotewrite_honban" } ] }
作成後、このポリシーをEC2等のIAMロールにアタッチしておきます。
監視対象に Grafana Agent をインストールする。
まず入れますが、バージョン番号・保存場所などは適宜ご変更ください (このドキュメントは2021年11月くらいの情報を元にしていたはず・・・(;^ω^)
curl -O -L "https://github.com/grafana/agent/releases/download/v0.19.0/agent-linux-amd64.zip" unzip "agent-linux-amd64.zip" chmod a+x "agent-linux-amd64" sudo mv agent-linux-amd64 /usr/local/bin/
rootのAWS_CONFIGにプロファイルを登録します。
sudo mkdir /root/.aws cat <<EOS | sudo tee /root/.aws/config [profile remotewrite] role_arn = arn:aws:iam::0001:role/role_amp_remotewrite_honban credential_source = Ec2InstanceMetadata EOS
起動スクリプト用のフォルダを用意します。テスト環境がamazon linux1でinit.dでの方法となりますが、バージョンにより適宜ご変更ください。
sudo touch /etc/init.d/grafana_agent sudo chmod 755 /etc/init.d/grafana_agent
中身は以下の通りです。リージョンなど適宜ご変更ください。
cat <<EOS | sudo tee /etc/init.d/grafana_agent #!/bin/sh -e # grafana_agent startup script # chkconfig: - 64 36 #description: grafana_agent AWS_SDK_LOAD_CONFIG="true"; export AWS_SDK_LOAD_CONFIG AWS_STS_REGIONAL_ENDPOINTS="regional"; export AWS_STS_REGIONAL_ENDPOINTS AWS_REGION="ap-northeast-1"; export AWS_REGION AWS_PROFILE="remotewrite"; export AWS_PROFILE APP_NAME=agent-linux ARCH_NAME=amd64 EXP=/usr/local/bin QUERY="--config.file=/etc/grafana/grafana-agent.yaml" case "$1" in start) if [ -e /var/run/$APP_NAME.pid ]; then echo "$APP_NAME-$ARCH_NAME already started" exit 1 else echo "Starting $APP_NAME" cd $EXP su -c "$EXP/$APP_NAME-$ARCH_NAME $QUERY > /tmp/$APP_NAME-$ARCH_NAME.log 2>&1&" touch /var/run/$APP_NAME.pid fi ;; stop) if [ ! -e /var/run/$APP_NAME.pid ]; then echo "$APP_NAME-$ARCH_NAME not started" exit 1 else rm /var/run/$APP_NAME.pid kill `pgrep $APP_NAME` echo "$APP_NAME stopped and killed children process." fi ;; restart) $0 stop sleep 5 $0 start ;; *) echo "Usage: /etc/init.d/$APP_NAME {start|restart|stop}" exit 1 ;; esac exit 0 EOS
Grafana Agent の設定ファイルを置くフォルダを準備します。
sudo mkdir /etc/grafana
設定ファイルを記述します。しかしここは監視対象や方針によって異なりますのでprometheusなどのドキュメントを参考に記述してみてください。以下は基本的なnode_exporterはagentのを利用し、8001番で上がっている外部のエクスポーターを取り込むような設定例にしました。それぞれ不要な部分は省略したり適宜ご変更ください。 なお prometheus_remote_write は AMP の概要欄にある"エンドポイント - リモート書き込み URL"をそのままコピペしてください。
/etc/grafana/grafana-agent.yaml
server: http_listen_address: '127.0.0.1' http_listen_port: 9090 prometheus: global: scrape_interval: 60s wal_directory: '/tmp/grafana-agent' configs: - name: HogeApp remote_write: - url: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/ws-123-456-789/api/v1/remote_write sigv4: region: ap-northeast-1 host_filter: false scrape_configs: - job_name: '8001_HogeApp_exporter' static_configs: - targets: - '127.0.0.1:8001' metrics_path: '/metrics' integrations: agent: enabled: false scrape_interval: 60s node_exporter: enabled: true include_exporter_metrics: false disable_collectors: - bonding - btrfs - hwmon - infiniband - ipvs - mdadm - zfs - nfs - nfsd textfile_directory: '/opt/text_collector/txt' prometheus_remote_write: - url: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/ws-123-456-789/api/v1/remote_write sigv4: region: ap-northeast-1
最後に登録して完了です。
sudo chkconfig grafana_agent on
監視対象で Grafana Agent の起動・終了
インスタンスを再起動するか、以下コマンドで動かしてみましょう。
sudo service grafana_agent start sudo service grafana_agent stop
管理アカウントで、AMGにAMPのデータソースを追加し、Exploreでメトリクスを目視する
以下のように追加します。
- AMG > AWS Data Sources > Service [AMP(略)] を選択する
- リージョン・アカウントを選択すれば表示されるはず
です。
次に Explore からソースをAMPに切り替えればメトリクス一覧に node_ から始まるメトリクスが出ているはずです。 あとはグラフを作成していくだけとなります。
まとめ
AMG/AMPの登場で、全AWSアカウントの可視化と警報が、AWSのみでとても簡単にできてしまいました。 今後どんどん横展していく予定ですので、また何かあれば書かせてもらえれば幸いです。
最後までお読みいただきありがとうございました。