이전 포스팅에서 이어집니다.
[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 |