[컴] terraform 에서 ebs block 을 추가하고, user_data 사용하는 예시

디버그 요령 / 테라폼 요령 /

terraform 에서 ebs block 을 추가하고, user_data 사용하는 예시

data "template_file" "my_user_data" {
  # template = file("../../scripts/init-fish.yml")
  template = templatefile(
    "../../scripts/init-fish.tftpl",
    {
      bashrc  = "${indent(6, file("../../scripts/.bashrc"))}"
    }
  )
}


output "debug_user_data_output" {
  value = data.template_file.my_user_data.rendered
}

resource "aws_instance" "stage_a" {
  ...

  user_data = data.template_file.my_user_data.rendered
}

resource "aws_ebs_volume" "stage_a" {
  availability_zone = "ap-northeast-2a"
  size              = 10 # GB
  iops              = 3000
  type              = "gp3"
}

resource "aws_volume_attachment" "ebs_att" {
  device_name = "/dev/sdf"
  volume_id   = aws_ebs_volume.stage_a.id
  instance_id = aws_instance.stage_a.id
}
#cloud-config

packages:
  - curl

# .bashrc file
write_files:
  - path: /home/admin/.bashrc
    content: |
      "${bashrc}"
  - path: /home/admin/.profile
    content: |
      if [ -n "$BASH_VERSION" ]; then
          # include .bashrc if it exists
          if [ -f "$HOME/.bashrc" ]; then
              . "$HOME/.bashrc"
          fi
      fi

bootcmd:
  # format 하고
  - test -z "$(blkid /dev/nvme1n1)" && mkfs -t ext4 -L home_admin /dev/nvme1n1
  - mkdir -p /home/myuser

mounts:
  # mount
  - [ "/dev/nvme1n1", "/home/myuser", "ext4", "defaults,nofail", "0", "2" ]

runcmd:
  # set .bashrc
  - cp -f /home/bashrc_template_by_cloud_init /home/myuser/.bashrc
  - chown admin:admin /home/admin/.bashrc
# .bashrc, ${}를 사용하려면 $${} 를 사용해야 한다. terraform 에서도 ${} 를 사용하기 때문에. 나머지 $ 들은 괜찮다.
if [ -n "$force_color_prompt" ]; then
  if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
      # We have color support; assume it's compliant with Ecma-48
      # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
      # a case would tend to support setf rather than setaf.)
      color_prompt=yes
  else
      color_prompt=
  fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='$${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$$ '
else
    PS1='$${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

data template 의 output 을 확인

다음 처럼 output 을 추가하고, terraform plan 을 하면 output 이 template_file이 어떤 모습으로 생성되는지 확인할 수 있다.

...
output "debug_user_data_output" {
  value = data.template_file.my_user_data.rendered
}

aws cloud init debug

  1. aws management console 에서 stop instance 를 한 후 Actions -> Instance settings -> Edit user data 를 하자.
  2. 수정후 start instance
  3. cat /var/log/cloud-init-output.log

/var/log/cloud-init-output.log

aws 에서 cloud init 에 대한 log는 /var/log/cloud-init-output.log 에서 확인할 수 있다.

See Also

  1. 쿠…sal: [컴] aws 에서 cloud-init 을 이용해서 ebs attach

Reference

  1. grep - How to escape special characters in Terraform local-exec command line - Stack Overflow

댓글 없음:

댓글 쓰기