-
[Terraform] 테라폼 기초클라우드/AWS 2024. 11. 23. 16:59
- 하시코프에서 오픈소스로 개발중인 인프라스트럭처 관리 도구
- 특정 버전의 테라폼을 사용하고 싶거나, 여러 버전을 사용할 필요가 있을 때는 tfenv를 사용하면 편리함 (맥, 리눅스, 윈도우 지원)
태라폼의 기본 개념들
프로비저닝?
- 어떤 프로세스나 서비스를 실행하기 위한 준비 단계
- 테라폼에서는 크게 네트워크나 컴퓨팅 자원을 준비하는 작업을 다루는 개념
프로바이더 (Provider)?
- 테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈
- 예를들어 테라폼으로 aws 서비스의 컴퓨팅 자원 생성하려면 aws 프로바이더를 먼저 셋업해주어야함
- 테라폼 지원 목록 : 테라폼 프로바이더 문서
리소스 (Resource) ?
- 특정 프로바이더가 제공해주는 조작 가능한 대상의 최소 단위
- 예를들어 aws 프로바이더는 aws_instance 리소스 타입 제공하고, 이 리소스 타입을 사용하여 가상머신 리소스를 선언하고 조작함
HCL(Hashicorp Configuration Language)
- HCL은 테라폼에서 사용하는 설정 언어
- HCL 확장자는 .tf 사용
계획 (Plan) ?
- 테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용이 실제로 적용 가능한지 확인하는 작업
- terraform plan -> 어떤 리소스가 생성, 수정, 삭제될지 계획 보여줌
적용 (Apply) ?
- 테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용대로 리소스를 생성, 수정, 삭제하는 일
- terraform apply -> plan으로 확인후 실제로 적용하는 것이다
크게 파일을 세가지로 나누어 실습 진행.
- provider.tf -> 클라우드 서비스 연결 설정
- resource.tf -> 실제로 만드는 인프라 자원 정의
- data.tf -> 이미 존재하는 자원의 정보를 가져옴 ex) VPC ID, 서브넷 존재 등
기초 프로젝트 - 간단한 ec2 및 키페어 생성하기
1. IAM 액세스키 생성
-> 생성완..
2. 프로젝트용 디렉터리 생성후 테라폼 초기화
terraform init
3. ec2용 ssh키 페어 정의
resource "aws_key_pair" "web_admin" { key_name = "web_admin" public_key = file("~/.ssh/web_admin.pub") }
resource "aws_key_pair" "web_admin" 에서
첫번째 문자열은 프로바이더에서 제공하는리소스 타입의 이름들 (정해져있는거)
두번째 문자열은 리소스에 임의로 붙이는 이름으로, 테라폼 코드의 다른 곳에서 참조하기 위함용 (aws_key_pair.web_admin)
4. 접속에 사용할 공개키 만들기
$ ssh-keygen -t rsa -b 4096 -C "<EMAIL_ADDRESS>" -f "$HOME/.ssh/web_admin" -N ""
5. 선언한 리소스들이 생성가능한지 계획 확인
terraform plan
- 테라폼에는 일명 "이상적인 상태" 혹은 "실제상태"로 나뉨
- 실제 상태를 이상적인 상태와 동일하게 만드는 일을 실제로 apply하는것이고, 그전에 plan이 둘 상태를 동일하게 만들기 위해 해야할 일을 찾아내는 것
5. 선언한 리소스들을 적용
terraform apply
6. resource.tf에 보안그룹 및 ec2 인스턴스 정보 추가하기
resource "aws_security_group" "ssh" { name = "allow_ssh_from_all" description = "Allow SSH port from all" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_instance" "web" { ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2 instance_type = "t2.micro" key_name = aws_key_pair.web_admin.key_name vpc_security_group_ids = [ aws_security_group.ssh.id, data.aws_security_group.default.id ] }
7. plan 및 apply 적용
terraform plan
terraform apply
적용하면 인스턴스및 보안그룹이 생긴게 보인다...!
8. 리소스 삭제
terraform destroy
이외에도
- variables.tf -> 변수의 타입과 기본값등을 정의
variable "server_size" { description = "서버 크기" type = string default = "small" # 기본값 }
- terraform.tfvars -> 정의한 변수에 실제 값 넣는 파일
server_size = "large" # 실제로 사용할 값
- outputs.tf -> 테라폼으로 뭔가를 만들고 난 후, 필요한 정보를 보여주는 파일
output "server_ip" { value = aws_instance.my_server.public_ip # 만든 서버의 IP 주소를 보여줌 }
- 사용 방법
# variables.tf - 변수 정의 variable "server_name" { description = "서버 이름" } # terraform.tfvars - 실제 값 지정 server_name = "웹서버-1" # resource.tf - 실제 서버 생성할 때 이 변수 사용 resource "aws_instance" "server" { ami = "ami-12345" instance_type = "t2.micro" tags = { Name = var.server_name # "웹서버-1"이라는 이름이 들어감 } } # outputs.tf - 생성된 서버의 정보 출력 output "server_ip" { value = aws_instance.server.public_ip }
# 방법 1: 다른 tfvars 파일 사용하기 terraform apply -var-file="dev.tfvars" # 개발 환경 설정 terraform apply -var-file="prod.tfvars" # 운영 환경 설정 # 방법 2: 명령어로 직접 변수 입력 terraform apply -var="server_name=웹서버A" # 방법 3: 환경변수로 설정 export TF_VAR_server_name="웹서버B" terraform apply
https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code
'클라우드 > AWS' 카테고리의 다른 글
[AWS] Site to Site VPN 정리 (0) 2024.12.01 [AWS] Route53에 대한 고찰 (0) 2024.11.18 [ALB] ALB에 EC2 연결하면서 만난 문제들 (0) 2024.10.20 [RDS] MySQL 5.7 to 8.0 업그레이드 기록 (2) 2024.07.27 [AWS] AWS IoT Greengrass V2 Workshop 2 (1) 2023.12.05