
이전 포스팅에서 이어집니다.
[AWS, IntelliJ] 테라폼 설치, 테라폼 활용 VPC, 서브넷 설정
테라폼 설치 테라폼? 테라폼은 HCL 기반의 IAC 프로비저닝 도구이다. HCL (HashCorp Configuration Language) : 하시코프 설정 언어 기반이다. IAC (Infrastructure As Code) : 코드로 인프라 리소스를 관리한다는 개념
doinitright.tistory.com
인터넷 게이트웨이 생성
VPC 내에서 인터넷이 되려면 인터넷 게이트웨이가 필요하다.
- 인터넷 게이트웨이는 프라이빗 네트워크와 인터넷 간의 연결을 담당하는 장치이다.
- 인터넷 게이트웨이를 통해 내부 네트워크, 즉 VPC로 연결된 리소스들이 외부 네트워크와 통신할 수 있다.
- 즉, 인터넷 게이트웨이는 내부 네트워크에서 나가는 데이터를 인터넷으로 전달하고,
- 외부에서 들어오는 데이터를 내부 네트워크로 라우팅 하여 보안 및 네트워크 관리를 수행한다.
main.tf(추가)
// 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(전체)
// 테라폼 설정의 시작 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
변경사항을 동일하게 적용해준다.
$ terraform init $ terraform apply

terraform init, apply가 될 때마다 테라폼 내부에서 변경이 감지된 코드에 한해서만 실행이 됨을 알 수 있다.
이전 버전에서 게이트웨이만 추가되는 것으로, 게이트웨이만 추가됨을 알 수 있다.

인터넷 게이트웨이가 생성되었지만, 아직 연결되어 있는 상태는 아니므로 사용할 수 없다.
라우팅 테이블 생성, 서브넷에 적용, 게이트웨이 연결
라우팅 테이블은 네트워크에서 데이터 패킷 전송에 사용되는 정보를 담고 있는 표이다.
동일 VPC 내의 리소스 간 데이터 전송은 라우팅 테이블을 통해 이뤄진다.
main.tf(추가)
// 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 }
여기서 아래의 부분에 주목할 필요가 있다.
// 라우트 규칙을 설정. 여기서는 모든 트래픽(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
변경사항을 동일하게 적용해 준다.
$ terraform init $ terraform apply


보안 그룹 추가
AWS에는 security group이 있고, NCP에는 ACG가 있다.
보안 그룹은 IP 주소 및 포트 기반 규칙을 구성해 특정 네트워크 트래픽을 허용 / 거부해 보안을 강화한다.
들어오고, 나가는 패킷을 IP, 포트 기준으로 필터링하는 역할을 한다.
보안그룹은 차후에 서버(EC2)에 적용해서 사용할 예정이다.
main.tf (추가)
// 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
변경사항을 동일하게 적용해 준다.
$ terraform init $ terraform apply

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

'DEV > Infrastructure' 카테고리의 다른 글
[AWS, IntelliJ] 테라폼 설치, 테라폼 활용 VPC, 서브넷 설정 (0) | 2024.02.22 |
---|---|
[AWS] IAM, VPC의 개념, AWS CLI 설치, 엑세스 코드 발급 (0) | 2024.02.22 |
[NCP, Docker, Github Actions] 를 활용한 CI / CD 구축 (4) | 2024.01.09 |
[트러블슈팅] Docker, Linux no space left on device 해결 방법 (1) | 2024.01.08 |
[NCP, 도커] 서버 생성부터 배포까지 (4 / 4) (1) | 2024.01.08 |