State Managerの設定をCloudFormationでやってみたのでブログに残しておきます。
State Managerとは
Systems Managerの機能の一つです。
SSM ドキュメントで定義された内容を自動で対象のインスタンスに実行するものです。
自動で実行されることによって常に同じ状態の設定を保つことができます。
AWS Systems Manager State Manager
やること
- CloudFormationでCloudWatch Agentを更新するState Managerの作成
- 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は上手く利用していきたいと思います。