AMGでEC2インスタンスの可視化

こんにちは、 SRE の平です。

今回は AWS EC2 インスタンスの各種メトリクスを、 Grafana Agent と、 Grafana のマネージドサービスである Amazon Managed Service for Grafana (以下 AMG )と、 Amazon Managed Service for Prometheus(以下 AMP )を組み合わせて可視化していく手順を書いてみました。

手順および目次は以下の通りです。

  1. AMGを用意する。
  2. 監視アカウントで、AMPを用意する。
  3. 監視アカウントで、AMPに書き込むIAMロールを作成する。
  4. 本番アカウントで、AMPに書き込むIAMポリシーを作成し、EC2等のIAMロールにアタッチする。
  5. 監視対象に Grafana Agent をインストールする。
  6. 監視対象で Grafana Agent の起動・終了
  7. 管理アカウントで、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のみでとても簡単にできてしまいました。 今後どんどん横展していく予定ですので、また何かあれば書かせてもらえれば幸いです。

最後までお読みいただきありがとうございました。