https://www.terraform.io/intro
사이트로 가서 테라폼 설치 가능합니다.
terraform 이란?
인프라스트럭처 자동화중의 하나로 코드로 서비스들을 관리할 수 있는 오픈소스입니다.
오류를 줄이고 관리작업의 효율을 높일 수 있습니다.
Cloudformation VS Terraform
Cloudformation : aws 자체 서비스로 다른 클라우드 서비스와는 사용이 어렵습니다.
스택 및 구축 관리시 UI 와 호환이 가능하므로 쉽게 제어 및 확인 가능합니다.
자체로 모듈을 사용하진 않지만 중첩된 스택으로 가능합니다.
Terraform : aws 내부 서비스 cloudformation 과 달리 다른 클라우드 서비스들이나
리소스들을 지원 해 사용 유연성이 큽니다. 따라서 커뮤니티 규모도 클라우드포메이션보다 큽니다.
모듈 사용으로 동일한 구성의 리소스를 재사용할 수 있습니다.
1. 테라폼 사용 환경 구축하기
테라폼 사용을 위한 테스트용 EC2 를 리눅스로 설정 해 둡니다.
사용할 키를 선택하고 나머지 네트워크들은 기본값으로 해서 바로 생성 합니다.
방금 생성한 EC2 의 public ip 를 이용 해 ssh 로 접속 해 줍니다.
aws cli 사용을 위한 환경을 명령어를 통해 구축 해 줍니다.
1. ec2 생성하기 -> 2. cli 유저 생성하기 -> 3.cli 설치 및 설정하기 의 단계를 그대로 따라하시면 됩니다.
2. 테라폼 설치하기
cd ~
mkdir terra
cd terra
wget https://releases.hashicorp.com/terraform/1.2.3/terraform_1.2.3_linux_amd64.zip
unzip terraform_1.2.3_linux_amd64.zip
./terraform --version
cd ~
pwd
PATH=${PATH}:/home/ec2-user/terra
terraform --version
wget 명령어로 terraform v1.2.3 버전을 다운 받습니다.
PATH 명령어로 어디서든 terraform 명령어를 사용하도록 해주고 버전을 확인 해 봅니다.
이렇게 버전이 확인 가능하면 테라폼 설치가 완료 된 것입니다.
mkdir aws && cd $_
vi provider.tf
provider "aws" {
# access_key = "YOUR-ACCESS-KEY"
# secret_key = "YOUR-SECRETK-KEY"
region = "ap-northeast-2"
}
terraform init
terraform plan
terraform apply
기본 설정으로 aws 파일에 provider.tf 파일을 만들어주고 기본 값을 설정해줍니다.
이미 aws 의 cli 에 접속한 상태라서 액세스 키는 상관이 없으며 나머지 값들도 따라서 이미 설정 되어있습니다.
terraform init/plan/apply 명령어로 한번 더 확인 해 봅니다.
terraform init : 테라폼의 코드를 스캔하고 어느 공급자인지 확인 한 후 필요한 코드를 다운 받습니다.
terraform plan : 테라폼 작업 수행전 기본 코드의 큰 오류값을 확인 해 줍니다.
terraform apply : 테라폼의 구성파일을 실행합니다. plan 명령어에서 잡지 못한 오류들을 발견 해 줍니다.
3. 테라폼으로 VPC 생성하기
# vi new-vpc.tf
data "aws_availability_zones" "available" {
state = "available"
}
resource "aws_vpc" "new_vpc" {
cidr_block = "192.168.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
instance_tenancy = "default"
tags = {
Name = "NEW-VPC"
}
}
resource "aws_subnet" "new_public_subnet_2a" {
vpc_id = aws_vpc.new_vpc.id
cidr_block = "192.168.0.0/20"
map_public_ip_on_launch = true
availability_zone = data.aws_availability_zones.available.names[0]
tags = {
Name = "NEW-PUBLIC-SUBNET-2A"
}
}
resource "aws_subnet" "new_public_subnet_2b" {
vpc_id = aws_vpc.new_vpc.id
cidr_block = "192.168.16.0/20"
map_public_ip_on_launch = true
availability_zone = data.aws_availability_zones.available.names[1]
tags = {
Name = "NEW-PUBLIC-SUBNET-2B"
}
}
resource "aws_subnet" "new_public_subnet_2c" {
vpc_id = aws_vpc.new_vpc.id
cidr_block = "192.168.32.0/20"
map_public_ip_on_launch = true
availability_zone = data.aws_availability_zones.available.names[2]
tags = {
Name = "NEW-PUBLIC-SUBNET-2C"
}
}
resource "aws_subnet" "new_public_subnet_2d" {
vpc_id = aws_vpc.new_vpc.id
cidr_block = "192.168.48.0/20"
map_public_ip_on_launch = true
availability_zone = data.aws_availability_zones.available.names[3]
tags = {
Name = "NEW-PUBLIC-SUBNET-2D"
}
}
resource "aws_internet_gateway" "new_igw" {
vpc_id = aws_vpc.new_vpc.id
tags = {
Name = "NEW-IGW"
}
}
resource "aws_route_table" "new_public_rtb" {
vpc_id = aws_vpc.new_vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.new_igw.id
}
tags = {
Name = "NEW-PUBLIC-RTB"
}
}
resource "aws_route_table_association" "new_public_subnet_2a_association" {
subnet_id = aws_subnet.new_public_subnet_2a.id
route_table_id = aws_route_table.new_public_rtb.id
}
resource "aws_route_table_association" "new_public_subnet_2b_association" {
subnet_id = aws_subnet.new_public_subnet_2b.id
route_table_id = aws_route_table.new_public_rtb.id
}
resource "aws_route_table_association" "new_public_subnet_2c_association" {
subnet_id = aws_subnet.new_public_subnet_2c.id
route_table_id = aws_route_table.new_public_rtb.id
}
resource "aws_route_table_association" "new_public_subnet_2d_association" {
subnet_id = aws_subnet.new_public_subnet_2d.id
route_table_id = aws_route_table.new_public_rtb.id
}
VPC 생성을 위해 new-vpc.tf 파일로 다음과 같이 vpc 생성에 필요한 구성요소들을 적어 줍니다.
terraform init
terraform plan
terraform apply
테라폼 파일을 적용시키기 위한 3가지 명령어를 실행 한 후 마지막 단계에서 yes 로 확인 해 줍니다.
다음과 같이 새롭게 11개의 구성요소가 추가된것 확인 할 수 있습니다.
다음과 VPC, 서브넷, 라우트테이블, 인터넷 게이트웨이와 연결상태가 잘 만들어졌습니다.
4. 테라폼으로 EC2 생성하기
# vi terra-ec2.tf
resource "aws_instance" "example" {
ami = "ami-0fd0765afb77bcca7"
instance_type = "t2.micro"
subnet_id = "${aws_subnet.new_public_subnet_2a.id}"
vpc_security_group_ids = [aws_security_group.instance.id]
key_name = "BIM-KEY"
user_data = <<-EOF
#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo "Hello, Terraform" > /var/www/html/index.html
EOF
tags = {
Name = "terraform-example"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
vpc_id = "${aws_vpc.new_vpc.id}"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["192.168.0.0/32"]
}
ingress {
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "terraform-sg"
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
output "public_dns" {
value = aws_instance.example.public_dns
description = "The Public dns of the Instance"
}
output "private_ip" {
value = aws_instance.example.private_ip
description = "The Private_ip of the Instance"
}
ec2 생성에 필요한 구성요소들을 넣어주고 입력 해 줍니다. 앞서 만든 vpc 의 가용역역 a 에 있는 서브넷을 이용하기 위해 참조 명령어로 넣어주고 보안그룹도 생성해주면서 vpc id 를 참조해 줍니다.
테라폼으로 직접 키를 생성하지 못하기 때문에 미리 만들어놓은 BIM-KEY 키를 사용하겠습니다.
22 포트의 ip 주소는 본인의 ip 주소로 바꿔주어야 합니다.
terraform init
terraform plan
terraform apply
마찬가지로 terraform 실행 명령어를 적용합니다.
잘 적용됬다는 메세지와 private ip 와 public ip 를 할당 받았습니다.
테스트용 EC2 와 금방 생성한 terraform-example EC2 가 잘 작동하고 있습니다.
주소창에 퍼블릭 IP 로 접근하니 유저데이터에 넣었던 문구가 잘 나오고 있습니다.
마지막으로 ssh 에 키와 함께 접속해보니 잘 접속 할 수 있습니다.
5. 테라폼으로 삭제하기
terraform destroy
terraform destory 명령어로 앞서 생성했던 자원들을 손쉽게 지울 수 있습니다.
VPC 와 EC2 는 모두 정상적으로 제거되었으며 파일에는 아직 남아있기 때문에 다시 terraform 실행 명령어만 넣어주면
같은 자원들을 쉽게 생성할 수 있으며 필요에 따라 코드를 수정한 뒤 다시 생성할 수 도있습니다.
테스트용 ec2 로 지우면서 마무리 해 줍니다.
'AWS - KOR' 카테고리의 다른 글
#012) AWS RDS 생성 하기 (0) | 2022.07.07 |
---|---|
#011) AWS S3 생성하기 /퍼블릭 ACL,버킷폴리시 (0) | 2022.07.04 |
#009) CloudFormation 으로 VPC, EC2 생성하기 (0) | 2022.07.01 |
#008) AWS CLI 로 VPC 와 EC2 생성하기 (0) | 2022.07.01 |
#007) AWS EC2 생성하기 (0) | 2022.06.30 |