AWS CLIで構築するCloudWatch Agent

CloudWatch Agentを、AWS CLIから構築してみたいと思います。本エントリではCloudWatch Agentの設定ファイルを、AWS Systems Manager(以下、SSM)パラメータストアに格納しています。こうすることで、取得対象のメトリクス、ログ変更を、OSへのログインなしで対応することが可能になります。
2018.10.01

こんにちは、坂巻です。

システムのパフォーマンスに関するデータ(メトリクス)やログを収集する際に、CloudWatch Agentは使用されていますか? CloudWatch Agentを使用すると、Amazon EC2から標準外のメトリクス(ディスク使用率やメモリ使用率等)とログの両方を収集することが可能です。

今回はそんなCloudWatch Agentを、AWS CLIから構築してみたいと思います。

なお、本エントリではCloudWatch Agentの設定ファイルを、AWS Systems Manager(以下、SSM)パラメータストアに格納しています。 こうすることで、取得対象のメトリクス、ログ変更を、OSへのログインなしで対応することが可能になります。

なお、CloudWatch Agentの構築は、ウィザード形式で行うことも可能です。 ウィザード形式で実施する場合は、以下のエントリを確認ください。

新しいCloudWatch Agentでメトリクスとログの収集が行なえます

目次

  • 前提
  • CloudWatch Agentのインストール
  • CloudWatch Agentの設定ファイルをパラメータストアにアップロード
  • CloudWatch Agent設定
  • CloudWatch Agent設定変更

前提

本エントリでは以下の環境で構築を実施しています。

  • インターネット接続可能なEC2(Amazon Linux 2)が構築済みであること
  • SSMエージェントのバージョンは2.2.93.0以上であること
  • CloudWatch Agentの設定ファイルが作成済みであること

本エントリで使用していますCloudWatch Agentの設定ファイルには、こちらに格納しています。設定ファイルは作成、更新する際は、以下を参考にしてください。

また、構築対象のEC2には、ロールにてCloudWatchAgentAdminPolicyポリシーをアタッチしています。 CloudWatch Agentに関するポリシーの詳細については、以下をご確認ください。

CloudWatch Agentのインストール

変数設定

AWS CLIからSSM経由でコマンドを実行していきますが、システム固有の情報等は環境変数にいれて実行したいと思います。

INSTANCE_ID=i-04998c2c5740aae93
PARAMETER_NAME=AmazonCloudWatch-linux
FILE_PATH="/tmp/"
FILE_NAME=amazon-cloudwatch-agent.json

変数に設定する値は環境にあわせて設定してください。

  • INSTANCE_ID…CloudWatch Agentをインストールする対象のインスタンスID
  • PARAMETER_NAME…パラメータストアに作成するパラメータの名前
  • FILE_PATH…パラメータストアに流し込む設定ファイルを格納しているディレクトリ
  • FILE_NAME…設定ファイル名称

変数確認

設定された変数が意図した通りに設定されているか確認しましょう。

cat << ETX
  INSTANCE_ID: ${INSTANCE_ID}
  PARAMETER_NAME: ${PARAMETER_NAME}
  FILE_PATH: ${FILE_PATH}
  FILE_NAME: ${FILE_NAME}
ETX

CloudWatch Agentインストール

SSM経由でCloudWatch Agentをインストールします。 Run CommandでコマンドのドキュメントではAWS-ConfigureAWSPackageを指定します。

aws ssm send-command \
  --document-name "AWS-ConfigureAWSPackage" \
  --targets "Key=instanceids,Values=${INSTANCE_ID}" \
  --parameters "action=Install, name=AmazonCloudWatchAgent, version=latest"

正常にコマンドが実行されると、以下のようなjsonが出力されます。

{
    "Command": {
        "Comment": "",
        "Status": "Pending",
        (略)
        "CommandId": "354fa776-cf6f-4d34-89bc-d3e6df2003b4",
        "InstanceIds": [],
        "MaxConcurrency": "50"
    }
}

マネジメントコンソールよりRun Commandの実行結果を確認すると、バージョン1.201929.0がインストールされたことが分かります。

1

CloudWatch Agentの設定ファイルをパラメータストアにアップロード

Agentの設定変更を考慮して、CloudWatch Agentの設定ファイルはパラメータストアに保存しておきます。 以下のコマンドでパラメータを作成します。

aws ssm put-parameter --name "${PARAMETER_NAME}" \
  --type "String" --value file://"${FILE_PATH}${FILE_NAME}"

パラメータストアより「AmazonCloudWatch-linux」パラメータが作成されたことが確認できました。

2

CloudWatch Agentをインストールしたサーバにログインし、Agentの状態を確認してみます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "stopped",
  "starttime": "",
  "version": "1.201929.0"
}

statusがstoppedとなっており、Agentが停止していることがわかります。

CloudWatch Agent設定

SSM経由でCloudWatch Agentを設定します。 Run CommandでコマンドのドキュメントではAmazonCloudWatch-ManageAgentを指定します。

aws ssm send-command \
  --document-name "AmazonCloudWatch-ManageAgent" \
  --targets "Key=instanceids,Values=${INSTANCE_ID}" \
  --parameters "action=configure, mode=ec2, optionalConfigurationSource=ssm, \
    optionalConfigurationLocation=${PARAMETER_NAME}, optionalRestart=yes" \
  --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1

コマンドを実行すると、以下のようなjsonが出力されます。

{
    "Command": {
        "Comment": "",
        "Status": "Pending",
        (略)
        "CommandId": "00c04294-99a5-4fbc-a6d8-a43007101f39",
        "InstanceIds": [],
        "MaxConcurrency": "50"
    }
}

マネジメントコンソールよりRun Commandの実行結果を確認してみます。

3

CloudWatch Agentをインストールしたサーバにログインし、Agentの状態を確認してみます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "running",
  "starttime": "2018-09-23T09:34:42+0000",
  "version": "1.201929.0"
}

statusがrunningとなっており、Agentが起動していることがわかります。 CloudWatch Logsを確認すると、指定したログが取得されています。

4

また、カスタムメトリクスも取得されていました。

5

正しく動作しない場合はログ/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.logや、マニュアルを確認しましょう。

CloudWatch Agent設定変更

CloudWatch Agentの設定を変更してみたいと思います。 ログ収集の対象に/var/log/yum.logの設定を追加しました。

6

先程同様の、CloudWatch Agent設定コマンドを実行します。

aws ssm send-command \
  --document-name "AmazonCloudWatch-ManageAgent" \
  --targets "Key=instanceids,Values=${INSTANCE_ID}" \
  --parameters "action=configure, mode=ec2, optionalConfigurationSource=ssm, \
    optionalConfigurationLocation=${PARAMETER_NAME}, optionalRestart=yes" \
  --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1

jsonが出力されます。

{
    "Command": {
        "Comment": "",
        "Status": "Pending",
        (略)
        "CommandId": "0e09c5f4-9cde-457c-a055-e5ddde3d4fc4",
        "InstanceIds": [],
        "MaxConcurrency": "50"
    }
}

マネジメントコンソールよりRun Commandの実行結果を確認してみます。

7

CloudWatch Logsに追加した/var/log/yum.logが出力されました。

8

さいごに

SSMパラメータストアに格納することで、取得対象変更が、OSへのログインなしで行うことができました。一度設定しておくと運用が楽になると思うので試してみてはいかがでしょうか。