こしあん
2025-02-05

Systems Manager Run Commandを試す


7{icon} {views}


Terraformで複数のEC2インスタンスを作成し、同一タグを指定してSystems Manager Run Commandから一括シャットダウンする手順を紹介。コンソール上での操作やログ出力の可視化により、スクリプト実行・管理が容易になるメリットがある。

はじめに

  • よくAWSの資格試験を勉強していて出てきたSystems Manager Run Commandを試してみた
  • この例では、同一タグのついたEC2インスタンスを複数起動し、それを一括でシャットダウンするというのをやってみる

EC2の起動

  • 以下のTerraformのコードでEC2を複数起動する
  • このインスタンスはProject = "Run Command Shutdown Test"というタグがついているので、Systems Manager Run Commandを使って一括で落とすというのを試してみる
###############################
# IAMロール:EC2がSSMに接続するためのロールを作成
###############################
resource "aws_iam_role" "ssm_role" {
  name = "ec2_ssm_role"

  assume_role_policy = jsonencode({
    Version   = "2012-10-17",
    Statement = [{
      Action    = "sts:AssumeRole",
      Effect    = "Allow",
      Principal = {
        Service = "ec2.amazonaws.com"
      }
    }]
  })
}

###############################
# IAMロールポリシーアタッチメント:SSM用のマネージドポリシーをアタッチ
###############################
resource "aws_iam_role_policy_attachment" "ssm_managed" {
  role       = aws_iam_role.ssm_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}

###############################
# IAMインスタンスプロファイル:EC2にIAMロールを紐付けるためのプロファイルを作成
###############################
resource "aws_iam_instance_profile" "ssm_instance_profile" {
  name = "ec2_ssm_instance_profile"
  role = aws_iam_role.ssm_role.name
}

###############################
# セキュリティグループ:SSM通信(アウトバウンドHTTPS通信)を許可する設定
###############################
resource "aws_security_group" "ec2_sg" {
  name        = "ec2_ssm_sg"
  description = "Allow outbound traffic for SSM communication"
  vpc_id      = var.vpc_id

  # 全てのアウトバウンドトラフィックを許可
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }
}

###############################
# EC2インスタンス作成:UbuntuのEC2インスタンスを5台作成
###############################
# Ubuntu 24.04
data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"] # CanonicalのAMI所有者ID

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
  }

  filter {
    name   = "architecture"
    values = ["x86_64"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
}

resource "aws_instance" "ubuntu_ec2" {
  count                = 5
  ami                  = data.aws_ami.ubuntu.id
  instance_type        = "t3.nano"  # 必要に応じて変更してください
  subnet_id            = var.private_subnet_ids[count.index % length(var.private_subnet_ids)]
  iam_instance_profile = aws_iam_instance_profile.ssm_instance_profile.name

  # セキュリティグループを紐付け
  vpc_security_group_ids = [aws_security_group.ec2_sg.id]

  tags = {
    Name = "UbuntuEC2-${count.index + 1}"
    Project = "Run Command Shutdown Test"
  }
}

Systems Manager Run Commandの操作

Terraformというよりマネジメントコンソールからの操作になる

EC2が5個立ち上がった

Run Commandからドキュメントを選択する。AWS-RunShellScriptを選択。コマンドはsudo shutdown -h now

インスタンスタグの指定はタグで行い、キーはProject、値はRun Command Shutdown Testとする。

デフォルトではS3に出力している。このためにバケット作るのも面倒だったので、CloudWatch Logsに書き出してみた。

実行するとこのように成功する。かなりインタラクティブに見れるのがいい点

今回はインスタンスの停止だったのでログがなかったが、各インスタンスのログも出力できる

EC2の管理画面に見ると全て停止されている

所感

  • かなり便利。ログ残るのがいい
  • Lambda作ってforループで探して◯◯を実行するみたいな定期バッチって結構あると思うのだが、特にシェルスクリプトの実行はログが残るのであとからの問題発見に便利そうという印象だった


Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です