🔖

Terraform を用いた AWS Systems Manager - maintenance window の管理

2024/08/15に公開

ここでは Systems Manager の機能のうち、主に maintenance window の機能について触れます

terraform resource

maintenance window の管理を行う際は、以下のリソースを使用することになります。

月次のバッチ処理をサンプルとして引用します。

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 が使用されています。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_maintenance_window_task#run-command-tasks

実行するコマンドは、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 には INSTANCERESOURCE_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