Study_note
[Terraform] Terraform up & running 학습 및 기본 문법 (1) 본문
cka를 따고 다음 자격증으로 Terraform associate를 목표로 잡았다
iac를 목표로 설정한 이유는 awskrug의 발표들 및 원티드의 공고를 보면 terraform을 사용안하는 업체가 없다
모든 인프라를 코드로 재사용할수있는 iac의 큰장점이 트랜드를 이끈것 같다
사실 겉핧기 식으로 공부한 경험은 있지만 목적과 동기부여가 없는데 자격증을 목표로 잡고 공부할 계획을 잡았다
우선 자격증 취득 목적이 아니라 기술 습득을 우선시 하기 떄문에 공부 할 책을 찾던 도중
Terraform up & running을 선택하게 됐다 후기들도 좋고 워낙 oreilly의 책들은 좋다는 평을 들었기 때문에 선택하게 됐다
https://www.terraformupandrunning.com/
----------------------------------------------
IaC에는 5가지 범주가 있다.
1. 애드혹 스크립트(Ad hoc script)
스크립트를 서버에서 수동으로 실행하는 형태. -> 소규모 일회성 작업에 적합하다
예를들어 EC2의 User Data같은 것
2. 구성 관리 도구
Chef, Puppet, Ansible 등
!!멱등성!! : 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미
분산형 구조에서의 배포 : 원격의 수많은 서버를 관리가능
3. 서버 템플릿 도구
여러 서버를 시작하고 각각 동일한 코드를 실행하는 방식으로 서버를 구성하는 것이 기존 방식.
서버 템플릿 도구는 OS, SW, 파일 등 모든 내용을 포함하고 있는 스냅숏으로 이미지를 생성.
4. 오케스트레이션 도구
Kubernetes/AWS ECS/Docker Swarm
이건 생략
5. 프로비전 도구
Terraform, AWS CloudFormation, OpenStack Heat 등
서버, DB, Monitoring, Subnet 구성, SSL 인증서 등 모든 인프라에 관한 모든 것을 프로비저닝 가능
IaC의 장점
- 자급식 배포
- 속도와 안정성
- 문서화
- 버전 관리 -> 변경 내용이 모두 기록된 IaC 소스 파일을 저장할 수 있기에 버전 관리가 쉬워진다(뒤에 나올 backend)
- 유효성 검증 -> 코드가 변경될 때마다 검증을 수행 후 자동화된 테스트 실행 가능
- 재사용 -> 재사용 가능한 모듈로 패키징 가능
------------------------------
tf파일 배포 명령어
terraform init : 테라폼에 코드 스캔을 지시해서 공급자 확인 및 플러그인 다운로드
-> 테라폼 파일이 있는 경로에 .terraform 폴더가 생기고, 파일 실행에 필요한 플러그인이 여기 설치된다.
terraform plan : 테라폼 빌드 검증 테스트. 실제 변경 전에 수행할 작업 확인
-> apply 사용하면 굳이 사용안해도 된다
terraform apply : 테라폼 템플릿(tf 파일) 적용시켜 리소스 생성
-> yes 치기 귀찮으면 --auto-approve 옵션 써서 강제 적용.
-> 명령어 입력 후 terraform.tfstate파일 생성
terraform.tfstate는 JSON 형태로 되어 있는데, 이는 terraform으로 구성된 인프라스터럭처의 현재 상태를 보여준다.
terraform destroy : 테라폼 상태 정보 파일을 참조하여 모든 리소스 제거
-> apply처럼 확인 메시지 나오면 yes 입력
공급자
공급자를 aws로 설정, 서울 리전을 선택 하기 위해서 아래와 같이
provider : 클라우드 공급자를 명시해 API와 상호 작용할 수 있습니다.
region : 지역
provider "aws" {
region = "ap-northeast-2"
}
리소스
resource "공급자 유형" "이름" { # "아래와 같이 공급자_리소스_유형" "이름" 형태로 생성
설정
}
resource "aws_instance" "example" {
ami = "ami-01d87646ef267ccd7"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
tags = {
Name = "terraform-example"
}
}
환경 변수
variable "name" {
설정 # 설정에 들어갈 수 있는 매개변수는 description, default, type가 있다.
}
variable "number_example" {
description = "An example of a number variable in Terraform"
type = number
default = 42
}
variable "list_example" {
description = "An example of a list in Terraform"
type = list
default = ["a", "b", "c"]
}
variable "list_numeric_example" {
description = "An example of a numeric list in Terraform"
type = list(number)
default = [1, 2, 3]
}
variable "string_example" {
description = "An example of a string in Terraform"
type = string
default = "안녕하세요"
}
변수 값 전달 방법은 아래와 같이 환경변수.tf 파일 생성
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
default = 8080
}
var.환경변수이름 으로 변수 전달
resource "aws_security_group" "instance" {
# name = var.security_group_name
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
여기서 환경변수.tf파일과 메인.tf은 같은 디렉토리에 있어야한다.
출력 값
만약 인스턴스를 생성할 때 ip를 확인하려면 콘솔로 진입 하여 ip를 확인해야하는 귀찮음이 있다 또한 이 값은 terrafrom.tfstate에 저장 되지 않기 때문에 추후에 사용하지도 못한다.
output "name" {
설정 # value, description 등 가능
}
value는 <provider_type>.<name>.<attribute> 형태로 입력
output "s3_bucket_arn" {
value = aws_s3_bucket.terraform_state.arn
description = "The ARN of the S3 bucket"
}
output "dynamodb_table_name" {
value = aws_dynamodb_table.terraform_locks.name
description = "The name of the DynamoDB table"
}
출력값 .tf파일도 마찬가지로 메인.tf은 같은 디렉토리에 있어야한다.
데이터 소스
vpc default처럼 기존에 설치 되어있는 리소스를 가져와서 사용할 경우가 사용할 수 있다
이럴경우 사용하는게 data로 공급자에서 읽기 전용 정보를 가져온다
아래처럼
aws_vpc데이터 소스에서 vpc-id를 얻을려면 아래와 같이 "provider.type" "name"입력
사용한 data 소스 값을 사용할려면 data 인수 사용
data.<provider_type>.<name>.<attribute> 형태로 입력
즉 filter 명령어를 통해 원하는 vpc선정 후 value에서 data 소스 값을 불러와 확인 후 서브넷 지정 가능
data "aws_vpc" "default" {
default = true
}
data "aws_subnets" "default" {
filter {
name = "vpc-id"
values = [data.aws_vpc.default.id]
}
}
데이터 소스는 따로 파일 안만들고 main.tf에서 사용 가능하다
'Terraform' 카테고리의 다른 글
EKS Upgrade 1.22 -> 1.23 version (0) | 2023.03.13 |
---|---|
[etc] systemd 및 service 등록 (0) | 2023.03.09 |
[Terraform] 반복문, if문 (for, for_each, count, if) (0) | 2022.10.11 |
[Terraform] 모듈 (입력 변수, 지역 변수, 출력 변수, 파일 경로, 인라인 블록) (0) | 2022.10.05 |
[Terraform] 상태 파일, 원격 Backend, remote_state (2) (1) | 2022.09.29 |