/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

Terraformで管理しているUserdataを変更したらインスタンスはどうなるのか?

インフラ関連はTerraform管理していて、その際にUserdataを変更したらインスタンスはどうなるのか?新しいインスタンスが作り直されるのか?再起動されるのか?何も起こらないのか?そこがわからなくなったので調べてみた。

準備

とりあえず適当なVPCやSubnetを準備して、EC2を起動させる。Userdataは別ファイルでuser_data_script.shとして保存して、variablesにて渡すようにしておく。

provider "aws" {
  region = "ap-northeast-1"
}

# Data sources to retrieve existing VPC, Subnet, and Security Group

data "aws_vpc" "default" {
  id = "vpc-XXXXXXXXXXXXXXX"
}

data "aws_subnet" "example" {
  id = "subnet-XXXXXXXXXXXXXXX"
}

data "aws_security_group" "example" {
  id = "sg-XXXXXXXXXXXXXXX"
}

variable "user_data_file" {
  default = "user_data_script.sh"
}

resource "aws_instance" "example" {
  ami           = "ami-023ff3d4ab11b2525"
  instance_type = "t2.micro"

  subnet_id                   = data.aws_subnet.example.id
  vpc_security_group_ids      = [data.aws_security_group.example.id]

  user_data                  = templatefile(var.user_data_file, {})

  tags = {
    Name = "example-ec2"
  }
}

user_data_script.shの中身はこんな感じ。

#!/bin/bash

set -e
echo "Starting user data script..." > /var/log/user-data.log
sudo yum update -y >> /var/log/user-data.log 2>&1
sudo dnf install -y amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
sudo yum install -y httpd >> /var/log/user-data.log 2>&1
sudo systemctl start httpd >> /var/log/user-data.log 2>&1
sudo systemctl enable httpd >> /var/log/user-data.log 2>&1

いったんこれでterraform applyしてインスタンスを構築する。

これで準備完了。

 

いざ確認でuser_data_script.shを変更する

これで準備は整ったので、user_data_script.shを変更してみる。

以下のように変更。(最後の行を追加)

#!/bin/bash

set -e
echo "Starting user data script..." > /var/log/user-data.log
sudo yum update -y >> /var/log/user-data.log 2>&1
sudo dnf install -y amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
sudo yum install -y httpd >> /var/log/user-data.log 2>&1
sudo systemctl start httpd >> /var/log/user-data.log 2>&1
sudo systemctl enable httpd >> /var/log/user-data.log 2>&1
echo "Finish user data script.." >> /var/log/user-data.log 2>&1

そしてplanすると、以下のような差分が出る。

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # aws_instance.example will be updated in-place
  ~ resource "aws_instance" "example" {
        id                                   = "i-02cf8234a3f9d99e1"
        tags                                 = {
            "Name" = "example-ec2"
        }
      ~ user_data                            = "bf1d06c9652c8f21e0cb61dabc95750680b90949" -> "5213021bd62385a211f31c75bf8d6c3416d42cc2"
        # (39 unchanged attributes hidden)

        # (8 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

これを見る限りだとchangeなので、インスタンスは作り直されなさそう。再起動かかるか、何もされないか。

では実際にterraform applyをしてみようと思うが、インスタンスの状態がどうなるかを見ておきたいのでマネコンを開こうと思ったが、めんどくさかったのでCLIで状態を見れるようにしておく。

while :; do aws ec2 describe-instances --query "Reservations[].Instances[].{InstanceId:InstanceId, State:State.Name, Name:Tags[?Key=='Name'].Value | [0]}" --output table ; sleep 1 ; done

では実際にApply開始。

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_instance.example: Modifying... [id=i-i-02cf8234a3f9d99e1]
aws_instance.example: Still modifying... [id=i-02cf8234a3f9d99e1, 10s elapsed]
aws_instance.example: Still modifying... [id=i-02cf8234a3f9d99e1, 20s elapsed]
aws_instance.example: Still modifying... [id=i-02cf8234a3f9d99e1, 30s elapsed]
aws_instance.example: Still modifying... [id=i-02cf8234a3f9d99e1, 40s elapsed]
aws_instance.example: Modifications complete after 43s [id=i-02cf8234a3f9d99e1]

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

43秒で完了。その間のインスタンスの状態のCLIの結果ですが・・・

---------------------------------------------------
|                DescribeInstances                |
+----------------------+---------------+----------+
|      InstanceId      |     Name      |  State   |
+----------------------+---------------+----------+
|  i-02cf8234a3f9d99e1 |  example-ec2  |  running |
+----------------------+---------------+----------+
----------------------------------------------------
|                 DescribeInstances                |
+----------------------+---------------+-----------+
|      InstanceId      |     Name      |   State   |
+----------------------+---------------+-----------+
|  i-02cf8234a3f9d99e1 |  example-ec2  |  stopping |
+----------------------+---------------+-----------+

再起動されていました!

結果

検証結果としては再起動されるように見えました。

Userdataの変更って時々あるから、その時の挙動がどうなるかいつも忘れるので備忘録でした。