DevOpsTerraform10 Provision EC2 - 3

Run entry point script to start Docker container

user_data라는 attribute는 EC2가 생성되고 실행이 될 수 있는 script

resource "aws_instance" "myapp-server" {
	user_data = <<EOF
        [여기에 shell script 코드]
							EOF
}

EOF 사이에 shell script를 넣어서 실행할 수 있다.

resource "aws_instance" "myapp-server" {
 
 
	user_data = <<EOF
		#!/bin/bash
		sudo yum update -y && sudo yum install -y docker
		sudo systemctl start docker
		sudo usermod -aG docker ec2-user
		docker run -p 80:80 nginx
	EOF
 
 
}

나중에 다른 코드를 변경해도 위 script는 한 번만 실행됨

terraform apply --auto-approve

script가 더 길다면 이전처럼 분리하고 file location을 적어주는 방법도 있다.

shell script file

위 코드를 다음과 같이 파일 경로로 바꿈

user_data = file("./sh-script/entry-script.sh")

./sh-script/entry-script.sh 생성

		#!/bin/bash
		sudo yum update -y
		sudo yum install -y docker
		sudo systemctl start docker
		sudo usermod -aG docker ec2-user
		docker run -p 8080:80 nginx
terraform plan
terraform apply --auto-approve

Configuring Infrastructures not Servers

위의 과정을 요약하면, Infra가 생성되고 나면 Terraform이 아닌 일반 shell script로 docker를 설치했다. Shell script는 Terraform이 아니기 때문에, 예를들어 -y를 넣지 않아 다음 script가 진행되지 않을 때 Terraform이 알 방법이 없다.
즉, infra는 현재 state가 어떤 지 Terrafom이 control하고 모니터링 할 수 있지만, shell script 자체는 실행이 제대로 되고 있는지 아닌지 Terraform이 control이나 모니터링을 할 수 없다. 디버깅을 위해서 다시 직접 EC2에 ssh 접속을 해서 들어가봐야한다.

이 영역을 커버하기 위한 도구는 다음과 같은 것이 있다.

  • Chef
  • Puppet
  • Ansible

이를 Configuration Management Tools라 부른다.