CloudWatch Agentを自動更新するState ManagerをCloudFormationで設定してみた

2022.12.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

State Managerの設定をCloudFormationでやってみたのでブログに残しておきます。

State Managerとは

Systems Managerの機能の一つです。
SSM ドキュメントで定義された内容を自動で対象のインスタンスに実行するものです。
自動で実行されることによって常に同じ状態の設定を保つことができます。
AWS Systems Manager State Manager

やること

  1. CloudFormationでCloudWatch Agentを更新するState Managerの作成
  2. EC2にインストールされたCloudWatch Agentが更新されていることの確認

今回EC2のOSはAmazon Linux 2を利用しています。
CloudWatch Agentのインストールは以下のドキュメントを参考にしています。
CloudWatch エージェントのインストール

作成したCloudFormationテンプレート

AWSTemplateFormatVersion: "2010-09-09"

Description: State Manager

Parameters:
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------# 
  AssociationName:
    Default: AgentUpdate
    Type: String

  TargetValue:
    Default: ec2
    Type: String

Resources:
# ------------------------------------------------------------#
# State Manager
# ------------------------------------------------------------# 
  StateManager:
    Type: AWS::SSM::Association
    Properties: 
      ApplyOnlyAtCronInterval: True
      AssociationName: !Ref AssociationName
      Name: AWS-ConfigureAWSPackage
      Parameters:
        action: 
          - Install
        name: 
          - AmazonCloudWatchAgent
      ScheduleExpression: cron(0 8 * * ? *)
      Targets: 
        - Key: tag:Name
          Values:
            - !Ref TargetValue

24行目の設定を入れることでState Managerを作成した段階で実行するのではなくCronで指定された時間になるまで待つようになります。
32行目の設定ではCronで実行する時間を指定しています。
cron(0 8 * * ? *)はUTC表記なのでJSTにすると毎日「17:00」に実行されます。
今回はEC2のNameタグに「ec2」と設定されているものだけをターゲットにするため、33行目からの設定を行っています。

ターゲットのEC2を全台にしたい場合は34行目にある「Targets」の設定を以下のようにします。

      Targets: 
        - Key: InstanceIds
          Values:
            - "*"

CloudWatch Agentのバージョン確認

State Managerを作成する前にEC2にインストールしたCloudWatch Agentのバージョンを確認しておきます。
バージョンの確認は以下のコマンドで行いました。
CloudWatch エージェントのバージョンについての情報の検索

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

実行すると以下のような結果が返ってきます。
以下の結果の「version」がCloudWatch Agentのバージョンになります。

{
  "status": "stopped",
  "starttime": "",
  "configstatus": "not configured",
  "cwoc_status": "stopped",
  "cwoc_starttime": "",
  "cwoc_configstatus": "not configured",
  "version": "1.247354.0b251981"
}

State Manager作成

CloudFormationの実行はAWS CLIで行いました。
以下のコマンドをPowerShellで実行します。

aws cloudformation create-stack --stack-name スタック名 --template-body file://CloudFormationテンプレートファイル名

作成が完了したらCronで指定した時間まで待機後、EC2で以下のコマンドを実行して更新されることを確認します。

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

結果としては以下のようにバージョンアップしていることが確認できます。

{
  "status": "stopped",
  "starttime": "",
  "configstatus": "not configured",
  "cwoc_status": "stopped",
  "cwoc_starttime": "",
  "cwoc_configstatus": "not configured",
  "version": "1.247355.0b252062"
}

State Managerの実行結果は「Run Command」→「コマンド実行履歴」から確認することができます。

さいごに

自動でアップデートなどをしてくれる仕組みはかなり重要なので今後もState Managerは上手く利用していきたいと思います。