EC2 の起動時に CloudWatch エージェントを設定するユーザーデータスクリプトを作成してみた(Linux編)

EC2 Linux の起動と同時にカスタムメトリクスやログ送信を設定できるスクリプトを紹介しています
2024.05.13

はじめに

アノテーション テクニカルサポートのShimizuです。

日々の業務で EC2 からカスタムメトリクスを取得したり、CloudWatch Logs へのログ送信を検証する機会がよくあります。
しかしながら、新たに起動したインスタンスに毎回 CloudWatch エージェントをインストールして、各設定をやり直すのはなかなか手間がかかります。

そこで今回は、EC2 の起動時に CloudWatch エージェントのインストールから設定までを自動でやってくれるユーザーデータスクリプトを作成してみました!

やってみた

まず前準備として、EC2 インスタンスにアタッチする IAM ロールを作成します。(参考[1]
SSM パラメータの取得および CloudWatch へのデータ出力に必要な管理ポリシー(以下の3つ)をアタッチします。

  • AmazonSSMManagedInstanceCore
  • CloudWatchAgentAdminPolicy
  • CloudWatchAgentServerPolicy

次に CloudWatch エージェントの設定 json を作成します。(参考[2]

以下の json 例は基本的なカスタムメトリクス(ディスク使用率・メモリ使用率)を取得し、CloudWatch エージェントのログを CloudWatch Logs に送信する内容です。
※ 実際に使用する際には、必要な箇所を書き換えましょう。

{
  "agent": {
    "metrics_collection_interval": 10,
    "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
  },
  "metrics": {
    "namespace": "CustomMetrics",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "disk": {
        "measurement": [
          "used_percent"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
        ]
      },
      "mem": {
        "measurement": [
          "mem_used_percent"
        ],
        "metrics_collection_interval": 60
      }
    }
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
            "log_group_name": "amazon-cloudwatch-agent.log",
            "log_stream_name": "{instance_id}",
            "timezone": "Local"
          }
        ]
      }
    }
  }
}

続いて上記 json の内容を Systems Manager のパラメータとして保存します。

Systems Manager パラメータストアのコンソールから「パラメータの作成」をクリックして任意の名前を入力し、利用枠は「標準」、タイプは「文字列」として「値」に json の内容を貼り付け、「パラメータを作成」で保存します。

以上で前準備は完了です!

それでは EC2 インスタンス(Amazon Linux 2023)を新規で起動し、動作確認をしてみます。

アタッチする IAM ロールは前準備で作成したものを指定し、ユーザーデータには下記の内容を貼り付けて、インスタンスを起動します。

EC2 起動時に実行するユーザーデータスクリプト

#!/bin/bash
# CloudWatch エージェントのインストール
echo y | sudo dnf install amazon-cloudwatch-agent
# SSM パラメータから設定を読み込んで CloudWatch エージェントを起動する
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:作成したSSMパラメータの名前
# 自動起動設定
sudo systemctl enable amazon-cloudwatch-agent
  • 3行目の echo y の部分は、インストール中の入力確認(yes or no)をスキップするための記述です。
  • 3行目の dnf install amazon-cloudwatch-agent は、インスタンスがインターネットに接続できることが前提です。もしプライベート環境の場合は、あらかじめエージェントをインストールしたAMIを用意するなどを検討しましょう。(参考[3]
  • Linux の OS によっては dnf installyum install になる場合もありますので、適宜変更してください。

インスタンスが起動したらしばらく時間をおいて、カスタムメトリクスや CloudWatch Logs へのログが出力されていることを確認します。

正常に出力されていることを確認できました!

おわりに

いかがでしたでしょうか。
EC2 の検証時にはもちろん、EC2 Auto Scaling を使用している場合でも起動テンプレートにこのユーザーデータを設定しておくことで、インスタンスの新規起動時に即時カスタムメトリクスやログを取得する、といった使い方ができます。

また機会があれば、EC2 Windows 編も記事にしてみたいと思います。

この情報がどなたかのお役に立てば幸いです!

参考資料

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。