🔖
Terraform を用いた AWS Systems Manager - maintenance window の管理
ここでは Systems Manager の機能のうち、主に maintenance window の機能について触れます
terraform resource
maintenance window の管理を行う際は、以下のリソースを使用することになります。
-
aws_ssm_maintenance_window
- 全体的な設定。cronなどのスケジュール定義
-
aws_ssm_maintenance_window_task
- 動かす Shell Script などの定義
-
aws_ssm_maintenance_window_target
- 対象となるサーバー、リソースの定義
月次のバッチ処理をサンプルとして引用します。
examples
aws_ssm_maintenance_window
resource "aws_ssm_maintenance_window" "monthly-maintenance" {
allow_unassociated_targets = true
cutoff = 0
duration = 1
enabled = true
name = "monthly-maintenance"
schedule = "cron(0 0 3,15 1 * ? *)"
schedule_timezone = "Japan"
tags = {}
}
aws_ssm_maintenance_window_task
resource "aws_ssm_maintenance_window_task" "monthly-maintenance" {
name = "monthly-maintenance"
max_concurrency = 50
max_errors = 0
priority = 1
task_arn = "AWS-RunShellScript"
task_type = "RUN_COMMAND"
window_id = aws_ssm_maintenance_window.monthly-maintenance.id
targets {
key = "WindowTargetIds"
values = [
aws_ssm_maintenance_window_target.monthly-maintenance_prod.id,
aws_ssm_maintenance_window_target.monthly-maintenance_dev.id,
]
}
task_invocation_parameters {
run_command_parameters {
timeout_seconds = 600
parameter {
name = "commands"
values = [file("${path.module}/shell/monthly-maintenance.sh")]
}
parameter {
name = "executionTimeout"
values = [
"3600",
]
}
parameter {
name = "workingDirectory"
values = [
"",
]
}
}
}
}
task_type は実行するタスクの種類。
現在登録されているものでは基本的に RUN_COMMAND
が使用されています。
実行するコマンドは、task_invocation_parameters.run_command_parameters
にパラメータとして定義をします
当該タスクを実行する環境の関連付けは targets
にて行います
aws_ssm_maintenance_window_target
resource "aws_ssm_maintenance_window_target" "monthly-maintenance_prod" {
window_id = aws_ssm_maintenance_window.monthly-maintenance.id
name = "prod"
resource_type = "INSTANCE"
targets {
key = "tag:env"
values = ["prod"]
}
}
動作対象とするリソースの種類は resource_type
で定義します
resource_type には INSTANCE と RESOURCE_GROUP の2種類があります
INSTANCE では、タグなどの情報を元に対象とするリソースを絞り込みます
RESOURCE_GROUP では Resource Group として作成されているグループを指定します
design
あくまで一つの実装例として。
- 一つの maintenance window ごとに、一つの tf ファイルを用意
- 一つの tf ファイル中に 3 種類のリソースを包含して記載
- aws_ssm_maintenance_window
- aws_ssm_maintenance_window_task
- aws_ssm_maintenance_window_target
- 実行する shell script は、外部ファイルとして定義。tf ファイルでは
file
関数で読み込み
parameter {
name = "commands"
values = [file("${path.module}/shell/monthly-maintenance.sh")]
}
Discussion