こんにちは、ちゃりおです。
cronで各サーバのスクリプトを実行しているのですが、他にいい方法がないかと思いステートマネージャー使ってみました。
どんな感じに設定できるかや注意点について書きます。
ステートマネージャーとは
概要
AWS Systems Manager ステートマネージャー (ステートマネージャー) は、安全でスケーラブルな設定管理サービスであり、Amazon Elastic Compute Cloud (Amazon EC2) およびハイブリッドインフラストラクチャを、自動的にユーザー定義の状態に保ちます。
こんなときに使えます。
- 起動時に特定のソフトウェアを使用してインスタンスをブートストラップします。
- 定義済みのスケジュールに従ってエージェント (AWS Systems Manager SSM エージェント (SSM エージェント) など) をダウンロードして更新する。
- ネットワーク設定を設定する。
- インスタンスを Windowsドメインに結合する (Windows Server インスタンスのみ)。
- ライフサイクルを通じてソフトウェアの更新でインスタンスをパッチする。
- ライフサイクルを通じて Linux、macOS、および Windows マネージドインスタンスでスクリプトを実行します。
今回の用途は「ライフサイクルを通じて Linux、macOS、および Windows マネージドインスタンスでスクリプトを実行します。」が近いですね。
メンテナンスウィンドウとの使い分け
ステートマネージャー と メンテナンスウィンドウ は、マネージドインスタンスに対して同じような種類の更新を実行できます。どちらを選択するかは、システムコンプライアンスを自動化する必要があるか、指定した期間中のみ優先度の高い、時間的制約のあるタスクを実行するかによって異なります。
指定した期間中だけ行いたい場合は、メンテナンスウィンドウが良さそうです。
今回は期間は指定せず定期的に実行したいため、ステートマネージャーを使いました。
ステートマネージャー または メンテナンスウィンドウ の選択
実際に設定してみる
ステートマネージャーを設定して、定期実行を試してみます。
ドキュメント「AWS-RunShellScript」を使って「ifconfig」を30分ごとに実行します。
事前準備 SSMの管理対象のEC2作成
対象のインスタンスはCDKで作成しました。
BastionHostLinuxで作ると、SSMに必要なIAMロールがアタッチされていて楽です。
import * as cdk from '@aws-cdk/core';
import * as ec2 from '@aws-cdk/aws-ec2';
export class CdkBastionEc2Stack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const vpc = new ec2.Vpc(this,"vpc")
new ec2.BastionHostLinux(this, "instance", { vpc })
}
}
ステートマネージャーの設定
マネジメントコンソールから「System Manager」 > 「ステートマネージャー」 > 「関連付けの作成」に進みます。
任意の名前をつけて、ドキュメント「AWS-RunShellScript」を選択します。
実行するコマンドを指定します。
実行先のインスタンスを選びます。
設定できる間隔はデフォルト30分を指定しました
他には、出力先であったりレートを指定できるようです。
作成した関連付けから、実行履歴を見れます。
実行ID>出力を選択すると、実行したコマンドの出力を確認できます。
注意点
調べた際に、注意が必要だと思った点です。(2021/05時点)
定期実行は30分より短い間隔を指定できない
関連付けは、30 分以上 31 日未満の間隔の rate 式のみをサポートします。
30分以内の間隔では定期実行ができません。
高頻度なcronには向かない様子です。
リファレンス: Systems Manager の cron 式または rate 式
Cloudwatch Logsへの出力は未対応
実行結果の出力はS3のみ対応しています。(インスタンスのIAMロールにS3への許可が必要)
メンテナンスウィンドウは、Cloudwatch Logsへの出力は対応しているのでステートマネージャーも対応する可能性はありそうです。
まとめ
ステートマネージャーの概要・設定・注意点についてでした。
要件によっては各サーバーで設定しているcronを、ステートマネージャーに置き換えれるかもしれませんね。