DEV/Infrastructure

[AWS] 테라폼 활용 게이트웨이, 라우팅 테이블, 보안 그룹 생성

Bi3a 2024. 2. 22. 23:05

목차
반응형

테라폼 활용
인프라에 대해 학습합시다.

 


이전 포스팅에서 이어집니다.

 

 

[AWS, IntelliJ] 테라폼 설치, 테라폼 활용 VPC, 서브넷 설정

테라폼 설치 테라폼? 테라폼은 HCL 기반의 IAC 프로비저닝 도구이다. HCL (HashCorp Configuration Language) : 하시코프 설정 언어 기반이다. IAC (Infrastructure As Code) : 코드로 인프라 리소스를 관리한다는 개념

doinitright.tistory.com

 

 

 

인터넷 게이트웨이 생성

VPC 내에서 인터넷이 되려면 인터넷 게이트웨이가 필요하다.

 

  • 인터넷 게이트웨이는 프라이빗 네트워크와 인터넷 간의 연결을 담당하는 장치이다.
  • 인터넷 게이트웨이를 통해  내부 네트워크, 즉 VPC로 연결된 리소스들이 외부 네트워크와 통신할 수 있다.
  • 즉, 인터넷 게이트웨이는 내부 네트워크에서 나가는 데이터를 인터넷으로 전달하고,
  • 외부에서 들어오는 데이터를 내부 네트워크로 라우팅 하여 보안 및 네트워크 관리를 수행한다.

 

 

main.tf(추가)

shell
닫기
// AWS 인터넷 게이트웨이 리소스를 생성하고 이름을 'igw_1'로 설정
resource "aws_internet_gateway" "igw_1" {
// 이 인터넷 게이트웨이가 연결될 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-igw-1"
}
}

 

 

인터넷 게이트웨이는 VPC 내부에 속하게 된다.

 

main.tf(전체)

shell
닫기
// 테라폼 설정의 시작
terraform {
// 필요한 프로바이더(클라우드 서비스 제공자)를 설정
required_providers {
// AWS 프로바이더를 사용한다고 선언
aws = {
// AWS 프로바이더의 출처를 hashicorp/aws로 지정
source = "hashicorp/aws"
// AWS 프로바이더의 버전을 4.0 이상으로 지정
version = "~> 4.0"
}
}
}
// AWS를 제공자로 사용한다고 선언
provider "aws" {
// AWS에서 사용할 리전을 변수로부터 받아옴
region = var.region
}
// AWS VPC(Virtual Private Cloud) 리소스를 생성하고 이름을 'vpc_1'로 설정
resource "aws_vpc" "vpc_1" {
// VPC의 IP 주소 범위를 설정
cidr_block = "10.0.0.0/16"
// DNS 지원을 활성화
enable_dns_support = true
// DNS 호스트 이름 지정을 활성화
enable_dns_hostnames = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-vpc-1"
}
}
// AWS 서브넷 리소스를 생성하고 이름을 'subnet_1'로 설정
resource "aws_subnet" "subnet_1" {
// 이 서브넷이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 서브넷의 IP 주소 범위를 설정
cidr_block = "10.0.1.0/24"
// 서브넷이 위치할 가용 영역을 설정
availability_zone = "${var.region}a"
// 이 서브넷에 배포되는 인스턴스에 공용 IP를 자동으로 할당
map_public_ip_on_launch = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-subnet-1"
}
}
// AWS 서브넷 리소스를 생성하고 이름을 'subnet_2'로 설정
resource "aws_subnet" "subnet_2" {
// 이 서브넷이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 서브넷의 IP 주소 범위를 설정
cidr_block = "10.0.2.0/24"
// 서브넷이 위치할 가용 영역을 설정
availability_zone = "${var.region}b"
// 이 서브넷에 배포되는 인스턴스에 공용 IP를 자동으로 할당
map_public_ip_on_launch = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-subnet-2"
}
}
// ★ 추가
// AWS 인터넷 게이트웨이 리소스를 생성하고 이름을 'igw_1'로 설정
resource "aws_internet_gateway" "igw_1" {
// 이 인터넷 게이트웨이가 연결될 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-igw-1"
}
}

 

teffaform init, terraform apply

변경사항을 동일하게 적용해준다.

 

shell
닫기
$ terraform init
$ terraform apply

 

테라폼 init 시 변경 감지된 코드에 한해 실행

 

terraform init, apply가 될 때마다 테라폼 내부에서 변경이 감지된 코드에 한해서만 실행이 됨을 알 수 있다.

이전 버전에서 게이트웨이만 추가되는 것으로, 게이트웨이만 추가됨을 알 수 있다.

 

인터넷 게이트웨이 생성
인터넷 게이트웨이가 생성되었다.

인터넷 게이트웨이가 생성되었지만, 아직 연결되어 있는 상태는 아니므로 사용할 수 없다.

 

 

라우팅 테이블 생성, 서브넷에 적용, 게이트웨이 연결

라우팅 테이블은 네트워크에서 데이터 패킷 전송에 사용되는 정보를 담고 있는 표이다.
동일 VPC 내의 리소스 간 데이터 전송은 라우팅 테이블을 통해 이뤄진다.

 

main.tf(추가)

shell
닫기
// AWS 라우트 테이블 리소스를 생성하고 이름을 'rt_1'로 설정
resource "aws_route_table" "rt_1" {
// 이 라우트 테이블이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 라우트 규칙을 설정. 여기서는 모든 트래픽(0.0.0.0/0)을 'igw_1' 인터넷 게이트웨이로 보냄
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw_1.id
}
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-rt-1"
}
}
// 라우트 테이블 'rt_1'과 서브넷 'subnet_1'을 연결
resource "aws_route_table_association" "association_1" {
// 연결할 서브넷을 지정
subnet_id = aws_subnet.subnet_1.id
// 연결할 라우트 테이블을 지정
route_table_id = aws_route_table.rt_1.id
}
// 라우트 테이블 'rt_1'과 서브넷 'subnet_2'을 연결
resource "aws_route_table_association" "association_2" {
// 연결할 서브넷을 지정
subnet_id = aws_subnet.subnet_2.id
// 연결할 라우트 테이블을 지정
route_table_id = aws_route_table.rt_1.id
}

 

여기서 아래의 부분에 주목할 필요가 있다.

 

shell
닫기
// 라우트 규칙을 설정. 여기서는 모든 트래픽(0.0.0.0/0)을 'igw_1' 인터넷 게이트웨이로 보냄
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw_1.id
}

 

원칙적으로 라우팅 테이블에 의한 서브넷, 기타 리소스 간 데이터 통신은 별도 제약 없이 가능하지만,

외부 네트워크에서의 트래픽에 경우에서는 라우팅 테이블이 처리할 수 없다.

따라서, 외부 네트워크에서 발생하는 트래픽은 인터넷 게이트웨이로 발생하게 설정하며,

VPC가 구성한 네트워크 내부에서 발생하는 데이터 전송은 위 규칙보다 우선해 내부 통신이 가능해진다.

 

main.tf (전체)

// 테라폼 설정의 시작
terraform {
// 필요한 프로바이더(클라우드 서비스 제공자)를 설정
required_providers {
// AWS 프로바이더를 사용한다고 선언
aws = {
// AWS 프로바이더의 출처를 hashicorp/aws로 지정
source = "hashicorp/aws"
// AWS 프로바이더의 버전을 4.0 이상으로 지정
version = "~> 4.0"
}
}
}
// AWS를 제공자로 사용한다고 선언
provider "aws" {
// AWS에서 사용할 리전을 변수로부터 받아옴
region = var.region
}
// AWS VPC(Virtual Private Cloud) 리소스를 생성하고 이름을 'vpc_1'로 설정
resource "aws_vpc" "vpc_1" {
// VPC의 IP 주소 범위를 설정
cidr_block = "10.0.0.0/16"
// DNS 지원을 활성화
enable_dns_support = true
// DNS 호스트 이름 지정을 활성화
enable_dns_hostnames = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-vpc-1"
}
}
// AWS 서브넷 리소스를 생성하고 이름을 'subnet_1'로 설정
resource "aws_subnet" "subnet_1" {
// 이 서브넷이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 서브넷의 IP 주소 범위를 설정
cidr_block = "10.0.1.0/24"
// 서브넷이 위치할 가용 영역을 설정
availability_zone = "${var.region}a"
// 이 서브넷에 배포되는 인스턴스에 공용 IP를 자동으로 할당
map_public_ip_on_launch = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-subnet-1"
}
}
// AWS 서브넷 리소스를 생성하고 이름을 'subnet_2'로 설정
resource "aws_subnet" "subnet_2" {
// 이 서브넷이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 서브넷의 IP 주소 범위를 설정
cidr_block = "10.0.2.0/24"
// 서브넷이 위치할 가용 영역을 설정
availability_zone = "${var.region}b"
// 이 서브넷에 배포되는 인스턴스에 공용 IP를 자동으로 할당
map_public_ip_on_launch = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-subnet-2"
}
}
// AWS 인터넷 게이트웨이 리소스를 생성하고 이름을 'igw_1'로 설정
resource "aws_internet_gateway" "igw_1" {
// 이 인터넷 게이트웨이가 연결될 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-igw-1"
}
}
// AWS 라우트 테이블 리소스를 생성하고 이름을 'rt_1'로 설정
resource "aws_route_table" "rt_1" {
// 이 라우트 테이블이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 라우트 규칙을 설정. 여기서는 모든 트래픽(0.0.0.0/0)을 'igw_1' 인터넷 게이트웨이로 보냄
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw_1.id
}
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-rt-1"
}
}
// 라우트 테이블 'rt_1'과 서브넷 'subnet_1'을 연결
resource "aws_route_table_association" "association_1" {
// 연결할 서브넷을 지정
subnet_id = aws_subnet.subnet_1.id
// 연결할 라우트 테이블을 지정
route_table_id = aws_route_table.rt_1.id
}
// 라우트 테이블 'rt_1'과 서브넷 'subnet_2'을 연결
resource "aws_route_table_association" "association_2" {
// 연결할 서브넷을 지정
subnet_id = aws_subnet.subnet_2.id
// 연결할 라우트 테이블을 지정
route_table_id = aws_route_table.rt_1.id
}

 

 

 

teffaform init, terraform apply

변경사항을 동일하게 적용해 준다.

 

shell
닫기
$ terraform init
$ terraform apply

 

두개의 라우트 테이블과 association이 추가된다.

 

 

라우팅 테이블, 서브넷, 게이트웨이 연결
만들어진 라우팅 테이블과 서브넷, 게이트웨이가 연결되었다.

 

 

보안 그룹 추가

AWS에는 security group이 있고, NCP에는 ACG가 있다.

보안 그룹은 IP 주소 및 포트 기반 규칙을 구성해 특정 네트워크 트래픽을 허용 / 거부해 보안을 강화한다. 
들어오고, 나가는 패킷을 IP, 포트 기준으로 필터링하는 역할을 한다.

 

보안그룹은 차후에 서버(EC2)에 적용해서 사용할 예정이다.

 

main.tf (추가)

shell
닫기
// AWS 보안 그룹 리소스를 생성하고 이름을 'sg_1'로 설정
resource "aws_security_group" "sg_1" {
// 보안 그룹의 이름을 설정. 이름 앞에는 변수로부터 받은 prefix를 붙임
name = "${var.prefix}-sg-1"
// 인바운드 트래픽 규칙을 설정
// 여기서는 모든 프로토콜, 모든 포트에 대해 모든 IP(0.0.0.0/0)로부터의 트래픽을 허용
ingress {
from_port = 0
to_port = 0
protocol = "all"
cidr_blocks = ["0.0.0.0/0"]
}
// 아웃바운드 트래픽 규칙을 설정
// 여기서는 모든 프로토콜, 모든 포트에 대해 모든 IP(0.0.0.0/0)로의 트래픽을 허용
egress {
from_port = 0
to_port = 0
protocol = "all"
cidr_blocks = ["0.0.0.0/0"]
}
// 이 보안 그룹이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-sg-1"
}
}

 

인바운드, 아웃바운드 트래픽 규칙은 우선 모든 포트, 유형과 IP에 대해 허용한 상태로

Security Group을 구성했다.

 

main.tf (전체)

// 테라폼 설정의 시작
terraform {
// 필요한 프로바이더(클라우드 서비스 제공자)를 설정
required_providers {
// AWS 프로바이더를 사용한다고 선언
aws = {
// AWS 프로바이더의 출처를 hashicorp/aws로 지정
source = "hashicorp/aws"
// AWS 프로바이더의 버전을 4.0 이상으로 지정
version = "~> 4.0"
}
}
}
// AWS를 제공자로 사용한다고 선언
provider "aws" {
// AWS에서 사용할 리전을 변수로부터 받아옴
region = var.region
}
// AWS VPC(Virtual Private Cloud) 리소스를 생성하고 이름을 'vpc_1'로 설정
resource "aws_vpc" "vpc_1" {
// VPC의 IP 주소 범위를 설정
cidr_block = "10.0.0.0/16"
// DNS 지원을 활성화
enable_dns_support = true
// DNS 호스트 이름 지정을 활성화
enable_dns_hostnames = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-vpc-1"
}
}
// AWS 서브넷 리소스를 생성하고 이름을 'subnet_1'로 설정
resource "aws_subnet" "subnet_1" {
// 이 서브넷이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 서브넷의 IP 주소 범위를 설정
cidr_block = "10.0.1.0/24"
// 서브넷이 위치할 가용 영역을 설정
availability_zone = "${var.region}a"
// 이 서브넷에 배포되는 인스턴스에 공용 IP를 자동으로 할당
map_public_ip_on_launch = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-subnet-1"
}
}
// AWS 서브넷 리소스를 생성하고 이름을 'subnet_2'로 설정
resource "aws_subnet" "subnet_2" {
// 이 서브넷이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 서브넷의 IP 주소 범위를 설정
cidr_block = "10.0.2.0/24"
// 서브넷이 위치할 가용 영역을 설정
availability_zone = "${var.region}b"
// 이 서브넷에 배포되는 인스턴스에 공용 IP를 자동으로 할당
map_public_ip_on_launch = true
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-subnet-2"
}
}
// AWS 인터넷 게이트웨이 리소스를 생성하고 이름을 'igw_1'로 설정
resource "aws_internet_gateway" "igw_1" {
// 이 인터넷 게이트웨이가 연결될 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-igw-1"
}
}
// AWS 라우트 테이블 리소스를 생성하고 이름을 'rt_1'로 설정
resource "aws_route_table" "rt_1" {
// 이 라우트 테이블이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 라우트 규칙을 설정. 여기서는 모든 트래픽(0.0.0.0/0)을 'igw_1' 인터넷 게이트웨이로 보냄
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw_1.id
}
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-rt-1"
}
}
// 라우트 테이블 'rt_1'과 서브넷 'subnet_1'을 연결
resource "aws_route_table_association" "association_1" {
// 연결할 서브넷을 지정
subnet_id = aws_subnet.subnet_1.id
// 연결할 라우트 테이블을 지정
route_table_id = aws_route_table.rt_1.id
}
// 라우트 테이블 'rt_1'과 서브넷 'subnet_2'을 연결
resource "aws_route_table_association" "association_2" {
// 연결할 서브넷을 지정
subnet_id = aws_subnet.subnet_2.id
// 연결할 라우트 테이블을 지정
route_table_id = aws_route_table.rt_1.id
}
// AWS 보안 그룹 리소스를 생성하고 이름을 'sg_1'로 설정
resource "aws_security_group" "sg_1" {
// 보안 그룹의 이름을 설정. 이름 앞에는 변수로부터 받은 prefix를 붙임
name = "${var.prefix}-sg-1"
// 인바운드 트래픽 규칙을 설정
// 여기서는 모든 프로토콜, 모든 포트에 대해 모든 IP(0.0.0.0/0)로부터의 트래픽을 허용
ingress {
from_port = 0
to_port = 0
protocol = "all"
cidr_blocks = ["0.0.0.0/0"]
}
// 아웃바운드 트래픽 규칙을 설정
// 여기서는 모든 프로토콜, 모든 포트에 대해 모든 IP(0.0.0.0/0)로의 트래픽을 허용
egress {
from_port = 0
to_port = 0
protocol = "all"
cidr_blocks = ["0.0.0.0/0"]
}
// 이 보안 그룹이 속할 VPC를 지정. 여기서는 'vpc_1'를 선택
vpc_id = aws_vpc.vpc_1.id
// 리소스에 대한 태그를 설정
tags = {
Name = "${var.prefix}-sg-1"
}
}

 

 

teffaform init, terraform apply

변경사항을 동일하게 적용해 준다.

 

shell
닫기
$ terraform init
$ terraform apply

 

 

코드 구성

 

보안 그룹 → 인바운드 규칙 / 아웃바운드 규칙

 

인바운드 / 아웃바운드 규칙 구성
인바운드 / 아웃바운드 규칙이 생성되었다.

 

 


 

 

반응형