はじめてのCloudWatch Agent導入 (SSM & CentOS)

記事タイトルとURLをコピーする

こんにちは、高橋です。日々ポインコと暮らしています。 最近、兄の方が黒ばんできました。「黒ばむ」ってはじめて使いました。

ということで、今回は「はじめてのCloudWatch Agent導入」です。導入にはAmazon Systems Manager(SSM)を使います。何故SSMという略なのかと言うと、たぶん前身の「EC2 Simple Systems Manager」の名残だと思われます。たぶん。

そもそもCloudWatch Agentとは

簡単に言うと、EC2(サーバー)に入れると色々なログ(メトリクス)を収集できるよ、ってサービスです。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

CloudWatch Agentには2種類あるんですが、今回は新しい方が対象です。違いは当社blogで確認してください! http://blog.serverworks.co.jp/tech/2019/12/20/cloudwatch_agent_migration/

そもそもSSM(Agent)とは

簡単に言うと、AWSからEC2などのリソースを管理してコマンドを実行したり、CLI操作ができたり...というものです。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html

今回はこのSSMでCloudWatch Agentを導入します。 (私は未検証ですが、コマンドラインを使用しても導入可能です)

前置き

今回対象とするOSはCentOS 7(CentOS Linux release 7.6.1810 (Core))です。 https://aws.amazon.com/marketplace/pp/B00O7WM7QW

CentOS 7のAMIのマイナーバージョンが気になった方はこちら! http://blog.serverworks.co.jp/tech/2019/04/15/centos-ami-os-version/

それでは導入して参りましょう。

1.EC2(サーバー)の用意

まずはEC2インスタンスを用意しましょう。オンプレミスサーバーも対象にできますが、今回はEC2です。こんな感じです。

2.IAMロールの作成 / アタッチ

次に、EC2用のIAMロールを作成します。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html

各サーバーで CloudWatch Agentを実行する上で必要な IAM ロールを作成するには ・CloudWatchAgentServerPolicy ・AmazonSSMManagedInstanceCore

管理者が Parameter Store に書き込むための IAM ロールを作成するには ・CloudWatchAgentAdminPolicy ・AmazonSSMManagedInstanceCore

とのことです。 今回は1つのロールにまとめましたが、必要に応じて分けると良いかもしれません。

作成が完了したら手順1で起動したEC2インスタンスにアタッチします。SSHで接続するので、セキュリティグループの設定もお忘れなく。

3.SSM Agentの導入

CentOSには、SSM Agentはデフォルトでインストールされていませんので、以下の手順でインストールします。

$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

インストールしたら、起動チェックします。

$ sudo systemctl status amazon-ssm-agent

もし起動していない(amazon-ssm-agent is stopped)場合は起動。 

$ sudo systemctl enable amazon-ssm-agent

更にマネジメントコンソールの「AWS Systems Manager」-「マネージドインスタンス」画面で、対象のインスタンスが表示されていることを確認するといい感じです。

※参考にしたドキュメントはこちら https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html#agent-install-centos

4.CloudWatch Agentの導入

SSMの用意がととのいましたので、続いて目的のCloudWatch Agentをインストールします。こちらはAWSのドキュメントから手順をそのまま抜粋しました。

  1. ナビゲーションペインで、[Run Command] を選択し、次に [Run command (コマンドの実行)] を選択します。
  2. [Command document (コマンドのドキュメント)] リストで、AWS-ConfigureAWSPackage を選択します。
  3. [Targets] セクションでオプションを選択し、更新するインスタンスを選択します。
  4. [アクション] リストで、Install を選択します。
  5. [名前] に AmazonCloudWatchAgent と入力します。
  6. [バージョン] に、latest と入力します (デフォルトで提供されていない場合)。
  7. [Run (実行)] を選択します。

コマンドがこのように成功しない場合は、各種設定を見直しましょう。

更に「rpm -qa | grep -i watch」で、「amazon-cloudwatch-agent」パッケージが導入されていることを確認するといい感じです。

5.CloudWatch Agentの設定

続いて、CloudWatch Agentの設定ファイルの初期化をおこないます。「amazon-cloudwatch-agent-config-wizard」とウィザードが用意されています。以下で実行します。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

するとウィザード氏が色々質問してきますので、丁寧に答えていきましょう。

$ On which OS are you planning to use the agent?
$ 1. linux
$ 2. windows
$ default choice: [1]:

OSはCent OSなので1ですね。

$ Trying to fetch the default region based on ec2 metadata...
$ Are you using EC2 or On-Premises hosts?
$ 1. EC2
$ 2. On-Premises
$ default choice: [1]:

オンプレじゃなくてEC2なので1。

$ Which user are you planning to run the agent?
$ 1. root
$ 2. cwagent
$ 3. others
$ default choice: [1]:

エージェントを稼働するユーザーを選びます。

$ Do you want to turn on StatsD daemon?
$ 1. yes
$ 2. no
$ default choice: [1]:

StatsDという(ざっくり言うと)データ収集ツールを有効化するかどうかです。詳しくはドキュメントを参照してください。クライアントの実装が必要になります。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-custom-metrics-statsd.html

$ Which port do you want StatsD daemon to listen to?
$ default choice: [8125]

StatsDを使うためのポート番号です。

$ What is the collect interval for StatsD daemon?
$ 1. 10s
$ 2. 30s
$ 3. 60s
$ default choice: [1]:

StatsDでデーモンさんがデータ収集する周期です。

$ What is the aggregation interval for metrics collected by StatsD daemon?
$ 1. Do not aggregate
$ 2. 10s
$ 3. 30s
$ 4. 60s
$ default choice: [4]:

StatsDでのメトリクス集約周期です。

$ Do you want to monitor metrics from CollectD?
$ 1. yes
$ 2. no
$ default choice: [1]:

続いてCollectDを使ってメトリクス収集するかどうかです。「collectd」もざっくり言うとデータ収集ツールのことです。これをyesにした場合、CloudWatch Agent起動時に「open /usr/share/collectd/types.db: no such file or directory」とエラーが発生してしまいます。これはCentOSにcollectdのパッケージがインストールされていないためです。以下を参考にEPELパッケージを有効にした後、collectdをインストールしましょう。 https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/

$ Do you want to monitor any host metrics? e.g. CPU, memory, etc.
$ 1. yes
$ 2. no
$ default choice: [1]:

CPUやメモリのメトリクス収集するかどうかです。もちろんしたいですね。

$ Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
$ 1. yes
$ 2. no
$ default choice: [1]:

コアあたりのCPUを監視するかどうかです。1を選びます。

$ Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
$ 1. yes
$ 2. no
$ default choice: [1]:

メトリクスに利用可能なディメンションを追加するかどうかです。これも1で良いですね。

$ Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize $ for specific metrics in the output json file.
$ 1. 1s
$ 2. 10s
$ 3. 30s
$ 4. 60s
$ default choice: [4]:

メトリクスの収集間隔です。よしなに。

$ Which default metrics config do you want?
$ 1. Basic
$ 2. Standard
$ 3. Advanced
$ 4. None
$ default choice: [1]:

メトリクスセットを選択します。詳しくはドキュメントを参照しましょう。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}

このように設定ファイルの内容が表示されます。

$ Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
$ 1. yes
$ 2. no
$ default choice: [1]:

設定内容に満足したらyesを選びます。noにすると、メトリクスセットに戻るだけです(ドラクエのいいえループ)。

$ Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
$ 1. yes
$ 2. no
$ default choice: [2]:

既にCloudWatch Agentが存在するかどうかを選びます。今回は新規ですので2でOKです。

$ Do you want to monitor any log files?
$ 1. yes
$ 2. no
$ default choice: [1]:

ログファイルの監視をおこなうかどうかを選びます。今回は/var/log/messagesを監視してみます。

$ Log file path:

「/var/log/messages」を入力します。

$ Log group name:
$ default choice: [messages]

ロググループ名を入力します。今回はそのままmessagesにしてみます。

$ Log stream name:
$ default choice: [{instance_id}]

ログストリーム名を入力します。こちらもインスタンスIDのままにします。

$ Do you want to specify any additional log files to monitor?
$ 1. yes
$ 2. no
$ default choice: [1]:

他にも監視したいログファイルがあるか? と訊かれます。今回は1ファイルだけ監視するので2を選びます。1を選んだ場合は、再度監視対象の入力を促されますので、違うログファイルを指定します。

Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "messages",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.

設定内容が表示されます。

$ Do you want to store the config in the SSM parameter store?
$ 1. yes
$ 2. no
$ default choice: [1]:

SSMのパラメータストアに保存するかどうかを訊かれます。yesです。

$ What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
$ default choice: [AmazonCloudWatch-linux]

パラメータストアの名前を決めます。AWSのポリシーに沿う場合は「AmazonCloudWatch-」で始まる必要があるとのことで、「AmazonCloudWatch-CentOS-test」としました。これに沿わないとパラメータストアへの読み書きができないらしいです。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html

$ Trying to fetch the default region based on ec2 metadata...
$ Which region do you want to store the config in the parameter store?
$ default choice: [ap-northeast-1]

パラメータストアのリージョンです。東京にします。

$ Which AWS credential should be used to send json config to parameter store?
$ 1. ASIAZRDYFXCLJONKBC7F(From SDK)
$ 2. Other
$ default choice: [1]:

設定ファイルをパラメータストアに送るためのクレデンシャルをどうするか。デフォルトのままとします。

$ Successfully put config to parameter store AmazonCloudWatch-CentOS-test.
$ Program exits now.

設定内容が保存されました!お疲れさまでした。 設定ファイルは「/opt/aws/amazon-cloudwatch-agent/bin/config.json」に保存されます。

6.CloudWatch Agentの起動

設定が終わったので、SSMでCloudWatch Agentを起動しましょう。手順はこちらから抜粋。

  1. [Run command] を選択します。
  2. [Command document] リストで、[AmazonCloudWatch-ManageAgent] を選択します。
  3. [ターゲット] 領域で、CloudWatch エージェントをインストールしたインスタンスを選択します。
  4. [Action] リストで、[configure] を選択します。
  5. [Optional Configuration Source] リストで、[ssm] を選択します。
  6. 「CloudWatch エージェント設定ファイルを作成する」で説明されているとおり、[Optional Configuration Location (オプションの設定場所)] ボックスに、作成して Systems Manager Parameter Store に保存したエージェント設定ファイルの名前を入力します。
  7. これらのステップを完了した後、[Optional Restart] リストで、[yes] を選択してエージェントを開始します。
  8. [Run] を選択します。
  9. 必要に応じて、[ターゲットと出力] 領域で、インスタンス名の横のボタンを選択して [View output (出力の表示)] を選択します。Systems Manager に、エージェントが正常に開始されたことが表示されます。

コマンドは成功しましたか? 失敗した場合は「出力の表示」でログを確認しましょう。

7.ログの確認

CloudWatch Agentが起動しているか、一応こちらを参考に確認しましょう。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

また、以下も確認してみましょう。 ・マネジメントコンソールのCloudWatch画面を開き、メトリクスに「CWAgent」が追加され、対象インスタンスのメトリクスが取得されていること ・マネジメントコンソールのCloudWatch画面を開き、ロググループに対象インスタンスのログが取得されていること

あとがき

今回はSSMを使ってCloudWatch Agentを導入してみました。 いくつかハマりポイントがあったかと思いますので、参考にしていただけると兄が喜びます。

高橋 悠佑 (ポインコ兄) (執筆記事一覧)

健康志向です