Terraform 이란?
Terraform
Terraform 이란?
코드형 인프라(IaC) 접근 방식을 통해 선언적 구성 파일(가상 머신, 컨테이너, 스토리지, 네트워킹 등의 리소스)로 Google Cloud 리소스를 프로비저닝할 수 있는 오픈소스 도구
Google Cloud
## public IP
- 54.x.x.x
- 2.xx
- 34.xx
## private IP
- 10.0.x.x
- 192.168.x.x
- 172.16~32.x.x
session에 key를 붙이는 명령어
ssh-add <key_name>
zsh 설치 및 적용
# server password
sudo -i
sudo passwd ec2-user
sudo yum install util-linux-user.x86_64 # 아마존 리눅스만
# zsh 설치
sudo yum install zsh
chsh -s /bin/zsh * # 기본쉘은 zsh 로 변경 몇몇 os는 util-linux-user.x86_64 를 설치필요*
AWS CLI 설치
# Linux x86 (64-bit)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# Linux ARM
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
Terraform 설치
curl -sO https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_darwin_amd64.zip
unzip terraform_0.12.24_darwin_amd64.zip
mv terraform /usr/local/bin
aws configure 세팅
aws configure
설정된 사용자 및 권한 확인
aws sts get-caller-identity
Terraform 명령어
terraform init
terraform plan
terraform apply
terraform import
VPC
Amazon에서 제공하는 Private한 네크워크 망입니다. 다음은 VPC의 핵심 구성요소입니다.
- Virtual Private Cloud(VPC)
- 사용자의 AWS 계정 전용 가상 네트워크입니다.
- 서브넷
- VPC의 IP 주소 범위입니다.
- 라우팅 테이블
- 네트워크 트래픽을 전달할 위치를 결정하는 데 사용되는 라우팅이라는 규칙 집합입니다.
- 인터넷 게이트웨이
- VPC의 리소스와 인터넷 간의 통신을 활성화하기 위해 VPC에 연결하는 게이트웨이입니다.
- NAT 게이트웨이
- 네트워크 주소 변환을 통해 프라이빗 서브넷에서 인터넷 또는 기타 AWS 서비스에 연결하는 게이트웨이입니다.
- 씨큐리티 그룹
- 보안 그룹은 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 하는 규칙 집합입니다.
- VPC 엔드포인트 — 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결을 필요로 하지 않고 PrivateLink 구동 지원 AWS 서비스 및 VPC 엔드포인트 서비스에 VPC를 비공개로 연결할 수 있습니다. VPC의 인스턴스는 서비스의 리소스와 통신하는 데 퍼블릭 IP 주소를 필요로 하지 않습니다. VPC와 기타 서비스 간의 트래픽은 Amazon 네트워크를 벗어나지 않습니다.
vpc생성 시 사설 대역망 사용 (CIDR block)
10.0.0.0/8
172.168.0.0/12
192.168.0.0/16
프라이빗 서브넷 vs 퍼블릭 서브넷
프라이빗 서브넷 (Private Subnet)
- 서브넷에 연걸된 라우팅 테이블에 아웃바운드로 나가는 트래픽이
nat gateway
일 경우 - 프라이빗 서브넷에 있는 인스턴스들은 인터넷을 할때 nat gateway가 가지고 있는 동일한 IP, 즉 elastic IP를 통해 나가게 된다.
nat gateway
는 퍼블릭 서브넷에 존재한다
퍼블릭 서브넷 (Public Subnet)
- 서브넷에 연걸된 라우트 테이블에 아웃바운드로 나가는 트래픽이
internet gateway
일 경우
따라서 서브넷은 라우트 테이블에 따라 프라이빗, 퍼블릭 서브넷이 될 수 있다.
Terraform 으로 VPC 생성
provider.tf
# provider
provider "aws" {
region = "ap-northeast-2"
}
vpc.tf
# VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "terraform-101"
}
}
# Subnets
resource "aws_subnet" "public_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "terraform-101-public-subnet"
}
}
resource "aws_subnet" "private_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-2b"
tags = {
Name = "terraform-101-private-subnet"
}
}
# IGW
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "terraform-101-igw"
}
}
# elastic ip for NAT
resource "aws_eip" "nat" {
vpc = true
lifecycle {
create_before_destroy = true
}
}
# NAT Gateway
resource "aws_nat_gateway" "nat_gateway" {
allocation_id = aws_eip.nat_1.id
# Private subnet이 아니라 public subnet을 연결해야한다.
subnet_id = aws_subnet.public.id
tags = {
Name = "terraform-101-NAT-GW-1"
}
}
# Route Table
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
# inner rule (IGW와 RT 연결)
route = {
cidr_block = "0.0.0.0/0"
gateway_id = "aws_internet_gateway.igw.id"
}
tags = {
Name = "terraform-101-rt-public"
}
}
resource "aws_route_table" "private" {
vpc_id = aws_vpc.main.id
tags = {
Name = "terraform-101-rt-private"
}
}
# Subnet - Route Table 연결
resource "aws_route_table_association" "route_table_association_public" {
subnet_id = aws_subnet.public_subnet.id
route_table_id = aws_route_table.puvlic.id
}
resource "aws_route_table_association" "route_table_association_private" {
subnet_id = aws_subnet.private_subnet.id
route_table_id = aws_route_table.private.id
}
# NAT와 RT 연결
resource "aws_route" "private_nat" {
route_table_id = aws_route_table.private.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.nat_gateway.id
}
++ 추가로 VPC endpoint 연결
IAM 계정 생성
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_iam_user" "gildong_hong" {
name = "gildong.hong"
}
Reference
Author And Source
이 문제에 관하여(Terraform 이란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@1yangsh/Terraform-이란저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)