티스토리 뷰
HashCorp 가 개발한 IAC 도구로서 클라우드 인프라스터럭처를 정의하고 자동화한다.
○ terraform 사용을 위한 인스턴스 생성
○ terraform 설치
sudo yum install -y yum-utils shadow-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install terraform
https://developer.hashicorp.com/terraform/install?product_intent=terraform#linux
Install | Terraform | HashiCorp Developer
Explore Terraform product documentation, tutorials, and examples.
developer.hashicorp.com
[ec2-user@ip-172-31-15-244 ~]$ terraform --version
Terraform v1.7.5
on linux_amd64
○ terraform 자동완성
terraform -install-autocomplete
source ~/.bashrc
○ 다운로드
○ vim 을 쉽게 사용하기 위한 플러그인 다운로드
git clone https://github.com/hashivim/vim-terraform.git ~/.vim/pack/plugins/start/vim-terraform
sudo yum install -y ruby
○ 업데이트 실행
/home/ec2-user/.vim/pack/plugins/start/vim-terraform
[ec2-user@ip-172-31-15-244 vim-terraform]$ ./update_automagic.sh
USAGE EXAMPLES:
./update_automagic.sh 0.8.7
./update_automagic.sh 0.9.2
○ 간단한 내용 작성
# ec2.tf 파일 생성
resource "aws_instance" "tf-ec2-1" {
instance_type = "t2.micro"
tags = {
Name = "tf-ec2-1"
}
}
○ 문법 체크
terraform validate
comment
# - 한줄 주석
// - 한줄 주석
/* */ - 여러줄을 주석
문자 인코딩 - 항상 utf-8 로 인코딩
# 문법 참조
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance
Terraform Registry
registry.terraform.io
○ 튜토리얼 진행
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli
Install Terraform | Terraform | HashiCorp Developer
Install Terraform on Mac, Linux, or Windows by downloading the binary or using a package manager (Homebrew or Chocolatey). Then create a Docker container locally by following a quick-start tutorial to check that Terraform installed correctly.
developer.hashicorp.com
# 참고사항
Terraform의 구성 언어는 HCL이라는 보다 일반적인 언어를 기반으로 하며,
HCL 문서에서는 일반적으로 "인수" 대신 "속성"이라는 단어를 사용
이러한 단어는 이 맥락에서 서로 바꿔 사용할 수 있을 만큼 유사하며
숙련된 Terraform 사용자는 일상적인 대화에서 두 용어 중 하나를 사용할 수 있다.
그러나 Terraform은 "속성"이라는 다른 여러 항목과도 작용하기 때문에
(특히 Terraform 리소스에는 id표현식에서 참조할 수 있지만
구성에서 값을 할당할 수 없는 속성이 있음)
이 구문 구성을 참조할 때 Terraform 문서를 참조
# 실행 전에 필요한 것들을 다운로드
terraform init
# 적용
terraform apply
# 적용되는 것이 무엇인지 체크
# 실행 한 것은 아니다
terraform plan
실습
○ 인스턴스 넣을 때의 키 생성
○ 인스턴스 생성
# 들여쓰기는 2칸 권장
○ vpc 생성 [ vpc.tf ]
provider "aws" {
region = "ap-northeast-2"
access_key="........"
secret_key="........"
}
resource "aws_vpc" "sample-vpc" {
cidr_block = "10.20.0.0/16"
tags = {
Name = "sample-vpc"
}
}
○ subnet 생성 [ subnet.tf ]
리소스 타입[고정] . 아이디 . id
resource "aws_subnet" sample_pub-subnet_1 {
vpc_id = aws_vpc.sample-vpc.id
cidr_block = "10.20.1.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "sample_pub-subnet-1"
}
}
resource "aws_subnet" sample_priv-subnet_1 {
vpc_id = aws_vpc.sample-vpc.id
cidr_block = "10.20.10.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "sample_priv-sbunet-1"
}
}
resource "aws_subnet" sample_pub-subnet_2 {
vpc_id = aws_vpc.sample-vpc.id
cidr_block = "10.20.2.0/24"
availability_zone = "ap-northeast-2b"
tags = {
Name = "sample_pub_subnet-2"
}
}
resource "aws_subnet" sample_priv-subnet_2 {
vpc_id = aws_vpc.sample-vpc.id
cidr_block = "10.20.20.0/24"
availability_zone = "ap-northeast-2b"
tags = {
Name = "sample_priv-sbunet-2"
}
}
○ 라우팅태이블 생성 / pub , priv
# 라우팅태이블에 서브넷을 붙이는 타입 == aws_route_table_association
resource "aws_route_table" "sample-rtb-public" {
vpc_id = aws_vpc.sample-vpc.id
tags = {
Name = "sample-rtb-public"
}
}
resource "aws_route" "sample-public_route" {
route_table_id = aws_route_table.sample-rtb-public.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.sample-igw.id
}
resource "aws_route_table_association" "route_table_association_public1" {
subnet_id = aws_subnet.sample_pub-subnet_1.id
route_table_id = aws_route_table.sample-rtb-public.id
}
resource "aws_route_table_association" "route_table_association_public2" {
subnet_id = aws_subnet.sample_pub-subnet_2.id
route_table_id = aws_route_table.sample-rtb-public.id
}
resource "aws_route_table" "sample-rtb-private" {
vpc_id = aws_vpc.sample-vpc.id
tags = {
Name = "sample-rtb-private"
}
}
resource "aws_route" "sample-private_route" {
route_table_id = aws_route_table.sample-rtb-private.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.sample_nat_gw.id
}
resource "aws_route_table_association" "route_table_association_private1" {
subnet_id = aws_subnet.sample_priv-subnet_1.id
route_table_id = aws_route_table.sample-rtb-private.id
}
resource "aws_route_table_association" "route_table_association_private2" {
subnet_id = aws_subnet.sample_priv-subnet_2.id
route_table_id = aws_route_table.sample-rtb-private.id
}
○ 게이트웨이 생성
resource "aws_internet_gateway" "sample-igw" {
vpc_id = aws_vpc.sample-vpc.id
tags = {
Name = "sample-igw"
}
}
○ NAT G.W 생성
# NAT gateway 는 탄력적 IP 가 필요 ( eip )
# igw 를 먼저 작업하고 NAT.GW를 실행하기 위해 종속성 설정
resource "aws_internet_gateway" "sample-igw" {
vpc_id = aws_vpc.sample-vpc.id
tags = {
Name = "sample-igw"
}
}
○ 보안 그룹 생성
# from_port 와 to_port 동일하게 지정한다
# ingress == inbound / egress == outbound
resource "aws_security_group" "bastion-sg" {
vpc_id = aws_vpc.sample-vpc.id
tags = {
Name = "bastion-sg"
}
ingress {
from_port = 22
to_port = 22
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"]
}
}
○ ec2 생성을 위한 파일
# 보안 그룹은 여러개 가능하다 >> list 형식
ex> [aws_security_group.bastion-sg,aws.id]
resource "aws_instance" "bastion-ec2-1" {
ami = "ami-02c956980e9e063e5"
instance_type = "t2.micro"
subnet_id = aws_subnet.sample_pub-subnet_1.id
vpc_security_group_ids = [aws_security_group.bastion-sg.id]
associate_public_ip_address = true
tags = {
Name = "bastion-ec2-1"
}
}
'AWS' 카테고리의 다른 글
AWS - CDN [ Contents Delivery Network ] (0) | 2024.03.27 |
---|---|
AWS - VPC 피어링 (0) | 2024.03.26 |
AWS - VPC 엔드포인트 (0) | 2024.03.25 |
AWS - EKS (0) | 2024.03.21 |
AWS - ECS (0) | 2024.03.21 |