📚 IaC/Terraform

[Terraform] Terraform으로 AWS EC2 서버 배포하기 (2)

heywantodo 2023. 6. 12. 15:40
728x90
반응형

[Terraform] Terraform으로 AWS EC2 서버 배포하기 (2)

 

https://heywantodo.tistory.com/106

 

[Terraform] Terraform으로 AWS EC2 서버 배포하기 (1)

[Terraform] Terraform으로 AWS EC2 서버 배포하기 (1) Amazon EC2 인스턴스를 Default VPC에서 Terraform을 이용해 코드로 생성해보자 1. 공급자 (Provider) 구성 테라폼을 사용하기 위한 첫번째 단계 AWS 공급자를 사

heywantodo.tistory.com

앞 포스팅에 이어서 Userdata를 통해 EC2에 nginx를 설치하고, 보안그룹을 지정해주는 과정을 진행해보자

 

1. Userdata

userdata는 aws_instance resource와 함께 사용할 수 있다

userdata에 대한 설명은 aws_instance의 resource 부분의 document에서 확인할 수 있다

 

Terraform Registry

 

registry.terraform.io

user_data - (Optional) User data to provide when launching the instance. Do not pass gzip-compressed data via this argument; see user_data_base64 instead. Updates to this field will trigger a stop/start of the EC2 instance by default. If the
user_data_replace_on_change is set then updates to this field will trigger a destroy and recreate.
user_data_base64 will trigger a destroy and recreate when set to true. Defaults to false if not set.

설명을 해석해보면,

 

user_data는 인스턴스를 시작할 때 제공하는 사용자 지정 데이터를 지정한다.

인스턴스가 시작될 때 실행되는 스크립트나, 설정 정보등을 포함 할 수 있다. 

 

user_date_replace_on_change 옵션은, user_data 필드가 변경될 때,

인스턴스를 파괴하고 다시 생성하는 동작을 트리거하는 옵션이다.

 

예를 들어, user_data에 새로운 스크립트나 설정 정보를 업데이트하면,

해당 인스턴스가 파괴되고 새로운 인스턴스가 생성된다

 

user_data_base64 옵션은 user_data 필드에 Base64로 인코딩된 데이터를 제공할 수 있다.

Base64 인코딩을 사용하여 이진 데이터나 압축된 데이터를 전송할 수 있다.

이 옵션을 사용하면, user_date_replace_on_change 옵션이 자동으로 사용된다. 

 

콘솔에서는 인스턴스를 생성할 때, 고급 세부 정보에서 사용 할 수 있음

 

이제 ubuntu에 nginx를 userdata를 통해 설치해보자

resource "aws_instance" "web" {
  ami           ="ami-0c9c942bd7bf113a2" #ubuntu 22.04
  instance_type = "t2.micro"
    
    user_data = <<-EOF
      #!/bin/bash
      sudo apt-get update -y && sudo apt-get install nginx -y
      sudo systemctl enable nginx --now
      EOF

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

 

userdata가 정상적으로 실행된다면 ubuntu에 잘 설치가 되었을텐데,

지금은 access를 할 수 없다. 80 Port가 안열려있기때문이다.

 

2. 보안 그룹 (Security Group)

보안 그룹에 관련한 자세한 내용은 아래 Document에서 확인할 수 있다

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group

 

Terraform Registry

 

registry.terraform.io

aws_security_group 리소스는 AWS의 보안 그룹을 정의하는 데 사용된다.

기본 구성 요소는 다음과 같다.

요소 설명
name 보안 그룹의 이름
description 보안 그룹에 대한 설명
vpc_id 보안 그룹이 속한 VPC의 ID
ingress 인바운드 트래픽을 허용하는 규칙 정의
egress 아웃바운드 트래픽을 허용하는 규칙 정의
from_port 인바운드 규칙의 시작 포트
to_port 인바운드 규칙의 종료 포트
protocol 인바운드 규칙에 사용되는 프로토콜
cidr_blocks 인바운드 규칙에서 허용되는 CIDR 블록들
security_groups 인바운드 규칙에서 허용되는 보안 그룹들
tags 보안 그룹에 추가되는 태그 정보
depends_on 다른 리소스에 대한 의존성을 지정하여 보안 그룹이 해당 리소스에 의존함

위 요소들을 사용하여 AWS 보안 그룹을 정의하고 구성할 수 있다.

그럼 구성을 해보자.

resource "aws_security_group" "web" {
  name = "allow-http"
  description = "Allow HTTP inbound traffics"
  
  ingress {
    description = "HTTP from VPC"
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

http 프로토콜의 기본 포트인 80 포트를 from_port와 to_port로 지정을 해주었다.

egress는 모든 port를 열어주면 됨 

보안그룹을 지정을 해줬으니, 이제 IP:80으로 접속을하면 nginx 홈페이지가 보일 것이다. 

 

그 전에 EC2 인스턴스 생성 resource에 생성한 보안 그룹을 지정해줘야함

SG의 식별자web으로 지정해줬기때문에, web의 id를 가져오면 됨

resource "aws_instance" "web" {
  ami           ="ami-0c9c942bd7bf113a2" #ubuntu 22.04
  instance_type = "t2.micro"
  vpc_security_group_ids = [aws_security_group.web.id]

 

실행을 하기 전 terraform plan을 하여 코드에 문제가 없는지 꼭 확인해주기 ~ 

 

문제가 없다면 terraform apply 명령어를 통해 실행 

 

Console에서 확인

혹시라도 Name을 지정을 해주고 싶으면, tags를 사용해야함

 

인스턴스와 보안 그룹이 모두 잘 생성된 모습을 확인할 수 있다. 

 

마지막으로 IP로 접속했을 때 nginx가 잘 뜬다면 완벽한 성공😆

 

 

728x90
반응형