vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

CloudWatch Agent を CLI で EC2 に導入

先日 CloudWatch Agent が発表されました。

SSM Agent 導入が前提、となるとマネジメントコンソールすら使う必要が無いだろうということで、AWS CLI (aws ssm) での導入方法です。

SSM Agent

CloudWatch Agent を使うには、SSM Agent がインストールされていることが前提条件になります。

SSM Agent 導入状況確認

query はお好みで。

$ aws ssm describe-instance-information \
  --query 'sort_by(InstanceInformationList[].{
    InstanceId:InstanceId, ComputerName:ComputerName, ResourceType:ResourceType, PingStatus:PingStatus,
    AgentVersion:AgentVersion, IsLatestVersion:IsLatestVersion
    PlatformType:PlatformType, PlatformName:join(`:`, [ PlatformName, PlatformVersion ])
  },&PlatformName)' \
  --output table
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                              DescribeInstanceInformation                                                                              |
+--------------+---------------------------------------------------+----------------------+------------------+-------------+---------------------------+---------------+----------------+
| AgentVersion |                   ComputerName                    |     InstanceId       | IsLatestVersion  | PingStatus  |       PlatformName        | PlatformType  | ResourceType   |
+--------------+---------------------------------------------------+----------------------+------------------+-------------+---------------------------+---------------+----------------+
|  2.2.120.0   |  ip-xxx-xx-x-xx.ap-northeast-1.compute.internal   |  i-xxxxxxxxxxxx8632f |  False           |  Online     |  Amazon Linux AMI:2017.09 |  Linux        |  EC2Instance   |
|  2.2.103.0   |  ip-xxx-xx-x-xx                                   |  i-xxxxxxxxxxxx2c23b |  True            |  Online     |  Amazon Linux:2.0         |  Linux        |  EC2Instance   |
・・・

IsLatestVersion ですが、 Amazon Linux 2017.09 版で確認した所 False が返ってきました。
最新版は 2.2.103.0 のはずですが、なぜか 2.2.120.0 が導入されており、マニュフェストに存在しないバージョンのため False となっていたようです。

  • 現時点での最新 Version は "2.2.103.0"
# https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/ssm-agent-manifest.json
{"Name":"amazon-ssm-agent-linux-amd64.tar.gz","Version":"2.2.103.0"}

SSM Agent インストール

未導入の場合はインストールする必要があります。 SSM Agent が居ないことには AWS Systems Manager から実行できないため、EC2インスタンス起動時なり、sshログインなりでインストールを行います。

SSM Agent アップデート

On an Amazon EC2 instance, the CloudWatch agent requires that the instance is running version 2.2.93.0 or later.

バージョン 2.2.93.0 以上が必要なため、SSM Agent が古い場合は AWS-UpdateSSMAgent を使用してアップデートを行います。

$ _DOCNAME="AWS-UpdateSSMAgent"
$ _INSTANCEs="i-xxxxxxxxxxxx2c23b,i-xxxxxxxxxxxx8632f"

$ aws ssm send-command \
  --document-name "${_DOCNAME}" \
  --targets "Key=instanceids,Values=${_INSTANCEs}"

send-command の結果確認

list-command-invocations で実行結果一覧が取得できます。

  • 一覧取得例
$ aws ssm list-command-invocations \
  --query 'sort_by(CommandInvocations[].{
    DocumentName:DocumentName, CommandId:CommandId, InstanceId:InstanceId, InstanceName:InstanceName, Status:Status, StatusDetails:StatusDetails, RequestedDateTime:RequestedDateTime
  }, &RequestedDateTime)' \
  --output table

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                      ListCommandInvocations                                                                                       |
+--------------------------------------+-------------------------------+----------------------+---------------------------------------------------+--------------------+----------+-----------------+
|               CommandId              |         DocumentName          |     InstanceId       |                   InstanceName                    | RequestedDateTime  | Status   |  StatusDetails  |
+--------------------------------------+-------------------------------+----------------------+---------------------------------------------------+--------------------+----------+-----------------+
|  XXXXXXXX-ab3e-4aaa-bb72-xxxxxxxxxxxx|  AWS-UpdateSSMAgent           |  i-xxxxxxxxxxxx2c23b |  ip-xxx-xx-x-xx                                   |  1513519181.61     |  Success |  Success        |
|  XXXXXXXX-83d4-4628-a01e-xxxxxxxxxxxx|  AWS-ConfigureAWSPackage      |  i-xxxxxxxxxxxx2c23b |  ip-xxx-xx-x-xx                                   |  1513523228.34     |  Failed  |  Failed         |

get-command-invocation で実行結果詳細が取得できます。 StandardOutputContent と StandardErrorContent が出力結果となります。

  • 詳細取得例
    • command-id、instance-id を指定
$ _CMDID=XXXXXXXX-ab3e-4aaa-bb72-xxxxxxxxxxxx
$ _INSTANCE=i-xxxxxxxxxxxx2c23b

# jq有
$ aws ssm get-command-invocation \
  --command-id ${_CMDID} \
  --instance-id ${_INSTANCE} \
  | jq -r '.StandardOutputContent, .StandardErrorContent'

Updating amazon-ssm-agent from 2.2.120.0 to latest
Successfully downloaded https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/ssm-agent-manifest.json
updating amazon-ssm-agent to an older version, please enable allow downgrade to proceed

# jq無
$ aws ssm get-command-invocation \
  --command-id ${_CMDID} \
  --instance-id ${_INSTANCE} \
  --query '[ StandardOutputContent, StandardErrorContent ]' \
  | awk '{gsub(/\\n/,"\n"); print}'

CloudWatch Agent

CloudWatch Agent インストール

AWS-ConfigureAWSPackage で AmazonCloudWatchAgent を指定することでインストールします。

  • InstanceID での指定例
$ _DOCNAME="AWS-ConfigureAWSPackage"
$ _INSTANCEs="i-xxxxxxxxxxxx2c23b,i-xxxxxxxxxxxx8632f"

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

・・・
Successfully installed arn:aws:ssm:::package/AmazonCloudWatchAgent 1.73.9

構成ファイルの作成

構成ファイルを Parameter Store に格納しておくことで、複数台へ適用が可能になります。 構成ファイル作成はおそらくウィザードで生成、Parameter Store への格納を行うのが最も簡単かと思います。

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

中身はJsonファイルなので一度作成してしまえば使い回し可能かと思います。

f:id:htnosm:20171218034458p:plain

構成ファイルを基に設定を反映

ドキュメント AmazonCloudWatch-ManageAgent を使用します。

  • InstanceID での指定例
$ _DOCNAME="AmazonCloudWatch-ManageAgent"
$ _INSTANCEs="i-xxxxxxxxxxxx2c23b,i-xxxxxxxxxxxx8632f"
# Parameter Store を指定
$ _CONF="agent-config-linux"

$ aws ssm send-command \
  --document-name "${_DOCNAME}" \
  --targets "Key=instanceids,Values=${_INSTANCEs}" \
  --parameters "action=configure, mode=ec2, optionalConfigurationSource=ssm, optionalConfigurationLocation=${_CONF}, optionalRestart=yes"

導入結果

CloudWatch への転送

amazon-cloudwatch-agent は CloudWatch エンドポイントへ 443 で転送します。

  • 東京リージョン
monitoring.ap-northeast-1.amazonaws.com

カスタムメトリクス CWAgent として CloudWatch へ登録されます。

f:id:htnosm:20171218034459p:plain

metrics_collection_interval を最短の 1sec で指定しておけば、秒単位でメトリクスを確認できます。

f:id:htnosm:20171218034500p:plain

Linux、EC2、Advanced 指定で標準取得できるメトリクスは以下のような感じです。

f:id:htnosm:20171218034501p:plain

CloudWatch Logsへの転送

ログ転送(logs_collected)設定を行っていれば CloudWatch Logs に転送されます。

f:id:htnosm:20171218034502p:plain

CloudWatch Logs Agent (awslogs) とは別の設定になります。awslogsの方が細かな設定が可能なようです。