Ssoon

[T101] 02 왜 Terraform 인가? - (4) 단일 웹 서버 배포 본문

Terraform 101 Study

[T101] 02 왜 Terraform 인가? - (4) 단일 웹 서버 배포

구구달스 2022. 10. 18. 02:44
CloudNet@ 팀의 가시다님이 진행하는 Terraform 101 Study 1주차 정리입니다.

1. 웹서버 Bash script

yum install -y httpd
systemctl enable --now httpd
echo "<h1>Welcome to Hell! - Ssoon</h1>" > /var/www/html/index.html

2. Resource - aws_instance - user_data

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

resource "aws_instance" "example" {
  ami                    = "ami-0c76973fbe0ee100c"
  instance_type          = "t2.micro"
  
  user_data              = <<-EOF
  #!/bin/bash
  yum install -y httpd
  systemctl enable --now httpd
  echo "<h1>Welcome to Hell! - Ssoon</h1>" > /var/www/html/index.html
  EOF

  tags = {
    "Name" = "ssoon-webserver"
  }
}

3. Resource - aws_security_group

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

resource "aws_instance" "example" {
  ami                    = "ami-0c76973fbe0ee100c"
  instance_type          = "t2.micro"
  
  user_data              = <<-EOF
  #!/bin/bash
  yum install -y httpd
  systemctl enable --now httpd
  echo "<h1>Welcome to Hell! - Ssoon</h1>" > /var/www/html/index.html
  EOF

  tags = {
    "Name" = "ssoon-webserver"
  }
}

resource "aws_security_group" "instance" {
  name = "ssoon-webserver-SG"

  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
  }
  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
  }
  egress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
  }
}

4.  Resource - aws_instance - vpc_security_group_id

참조(reference) 

  • 코드의 다른 부분에서 값을 액세스할 수 있게 해주는 표현식

<PROVIDER>_<TYPE>.<NAME>.<ATTRIBUTE>

  • PROVIDER : 'AWS' ... 공급자
  • TYPE : resource 의 유형
  • NAME : resource 의 이름
  • ATTRIBUTE : resource 의 인수 중 하나이거나 resource 가 내보낸 속성 중 하나

※ Terraform Registry 사이트에서 Resource 들의 Arguments Attributes 을 확인 할 수 있습니다.

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group#attributes-reference

 

name 이 'example' 인 'aws_instance' resource 의 'vpc_security_group_ids' argument 에서

name 이 'instance' 인 'aws_security_group' 의 attributes 'id' 값을 참조합니다. 

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

resource "aws_instance" "example" {
  ami                    = "ami-0c76973fbe0ee100c"
  instance_type          = "t2.micro"
  # (선택 사항, VPC만 해당) 연결할 보안 그룹 ID 목록입니다.
  vpc_security_group_ids = [aws_security_group.instance.id]
  
  user_data              = <<-EOF
  #!/bin/bash
  yum install -y httpd
  systemctl enable --now httpd
  echo "<h1>Welcome to Hell! - Ssoon</h1>" > /var/www/html/index.html
  EOF

  tags = {
    "Name" = "ssoon-webserver"
  }
}

resource "aws_security_group" "instance" {
  name = "ssoon-webserver-SG"

  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
  }
  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
  }
  egress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
  }
}

5. terraform plan

  • plan 이 이상 없이 완료되어도 apply 시 error가 발생하거나 Resource 가 생성되지 않을 수 있습니다.

6. terraform apply

  • terraform apply 중 error가 나거나 설정한 Resource 가 생성이 되지 않았다면 코드를 보고 수정한 후 다시 apply 를 실행합니다.

7. 접속 확인

8. Console 결과 확인

Comments