[Terraform] Terraform으로 AWS EC2 서버 배포하기 (2)
https://heywantodo.tistory.com/106
앞 포스팅에 이어서 Userdata를 통해 EC2에 nginx를 설치하고, 보안그룹을 지정해주는 과정을 진행해보자
1. Userdata
userdata는 aws_instance resource와 함께 사용할 수 있다
userdata에 대한 설명은 aws_instance의 resource 부분의 document에서 확인할 수 있다
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
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에서 확인
인스턴스와 보안 그룹이 모두 잘 생성된 모습을 확인할 수 있다.
마지막으로 IP로 접속했을 때 nginx가 잘 뜬다면 완벽한 성공😆
'📚 IaC > Terraform' 카테고리의 다른 글
[Terraform] 템플릿 파일(Templatefile) (0) | 2023.06.21 |
---|---|
[Terraform] 테라폼 변수와 출력 (0) | 2023.06.20 |
[Terraform] Terraform으로 AWS EC2 서버 배포하기 (1) (0) | 2023.06.06 |
[Terraform] Terraform 기본 명령어 (0) | 2023.06.05 |
[Terraform] Terraform이란? (0) | 2023.06.04 |