일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- exclusive lock
- 힙
- CHECK OPTION
- 다대일
- 백트래킹
- 이진탐색
- JPQL
- 유니크제약조건
- SQL프로그래밍
- 스프링 폼
- 지연로딩
- dfs
- 즉시로딩
- 스토어드 프로시저
- 일대다
- fetch
- 연결리스트
- 동적sql
- FetchType
- 데코레이터
- 낙관적락
- PS
- shared lock
- execute
- BOJ
- 비관적락
- querydsl
- eager
- 연관관계
- 다대다
- Today
- Total
흰 스타렉스에서 내가 내리지
테라폼 작동원리 그리고 CLI 간단실습 본문
Terraform 기본 개념
resource | 실제로 생성할 인프라 자원을 의미한다. ex) aws_security_group, aws_lb, aws_instance |
provider | Terraform 으로 정의할 Infrastructure Provider 를 의미한다. ex) aws, azure, github, naver cloud, ... |
output | 안프라를 테라폼을 통해 프로비저닝 한 후에 결과물들을 variable 로 state 파일에 저장한다. output 으로 추출한 부분은 이후에 remote state 에서 활용할 수 있다. |
backend | terraform 의 상태 (state 파일) 을 저장하는 공간을 의미한다. backend 를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능하다. 가장 대표적으로는 AWS S3 가 있다. |
module | 공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의하는 부분이다. 일종의 함수라고 생각하면 편하다. |
remote state | remote state 를 사용하면 VPC, IAM 등과 같은 공용 서비스를 다른 서비스에서 참조할 수 있다. tfstate 파일 (최신 테라폼 상태정보) 이 저장되어 있는 backend 정보를 명시하면, terraform 이 해당 backend 에서 output 정보들을 가져온다. |
Terraform 작동 원리
테라폼에는 3가지 형상이 존재한다.
- Local 코드 : 현재 개발자가 작성/수정하고 있는 코드
- AWS 실제 인프라 : 실제로 AWS 에 배포되어 있는 인프라
- Backend 에 저장된 상태 : 가장 최근에 배포한 테라폼 코드 형상
중요한 것은 AWS 실제 인프라와 Backend 에 저장된 상태가 100% 일치하도록 만드는 것이다.
테라폼을 운영하면서 최대한 이 두가지가 100% 동일하도록 유지하는 것이 중요하다.
테라폼에서는 이를 위해 import, state 등 여러 명령어를 제공한다.
먼저 인프라 정의는 Local 코드에서 시작한다.
개발자는 로칼에서 테라폼 코드를 정의한 후에 해당 코드를 실제 인프라로 프로비전한다.
이 때 backend 를 구성하여 최신 코드를 저장하는데, 흐름은 아래와 같다.
terraform init
- 지정한 backend 에 상태 저장을 위한 .tfstate 파일을 생성한다. 여기에는 가장 마지막에 적용한 테라폼 내역이 저장된다.
- init 작업을 완료하면, local 에는 .tfstate 에 정의된 내용을 담은 .terraform 폴더가 생성된다.
- 기존에 다른 개발자가 이미 .tfstate 에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init 작업을 통해서 local 에 sync 를 맞출 수 있다.
terraform plan
- 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여준다.
- 단, plan 을 한 내용에 에러가 없다고 하더라도, 실제 적용되었을 때는 에러가 발생할 수 있다.
- Plan 명령어는 어떠한 형상에도 변화를 주지 않는다.
terraform apply
- 실제로 인프라를 배포하기 위한 명령어이다. apply 를 완료하면, AWS 상에 실제로 해당 인프라가 생성되고 작업 결과가 backend 의 .tfstate 파일에 저장된다.
- 해당 결과는 local 의 .terraform 파일에도 저장된다.
terraform import
- AWS 인프라에 배포된 리소스를 terraform state 로 옮겨주는 작업이다.
- 이는 local 의 .terraform 에 해당 리소스의 상태 정보를 저장해주는 역할을 한다. (코드를 생성하는 것이 아니다)
- Apply 전까지는 backend 에 저장되지 않는다.
- import 이후에 plan 을 하면 로컬에 해당 코드가 없기 때문에 리소스가 삭제 또는 변경된다는 결과를 보여준다. 이 결과를 바탕으로 코드를 작성할 수 있다.
- 만약에 기존에 인프라를 AWS 에 배포한 상태에서 테라폼을 적용하고 싶으면 모든 리소스를 terraform import 로 옮겨야 한다.
CLI 간단 실습
terraform init
현재 폴더 내에 아무것도 없는 상태에서 init 명려엉를 실행할 시 아무것도 이루어지지 않는다.
이제 provider 를 생성해 보자.
vim provider.tf
provider "aws" {
region = "ap-northeast-2"
}
terraform init
init 명령어를 사용하면 aws provider 를 다운로드 받은 것이다.
폴더 내에 .terraform 폴더가 생성이 되었다.
terraform 은 내부적으로 aws 에 API 를 호출하는 것이기 때문에 aws 라이브러리가 필요한데, 그 라이브러리를 다운로드 받는 것도 init 명령어의 역할이다.
이제 간단하게 리소스를 만들어 보자.
vim s3.tf
resource "aws_s3_bucket" "test" {
bucket = "terraform-cli-test-0123"
}
참고로 버킷명에 _(언더바) 문자는 사용할 수 없다. -(하이픈) 을 써야한다.
사실 당연한거다. s3 버킷이 서브도메인으로 들어가니까.
그리고 리전당 고유한 버킷명을 가져야 하기 때문에 버킷 명도 잘 정해야 한다.
terraform plan
다른 인자들을 옵셔널하기 때문에 정의해도 되고 안해도 되고, 혹은 디폴트값이 들어가는 인자들이 있다.
그러나 bucket 이름은 필수 인자이기 때문에 꼭 넣어줘야 한다.
plan 명령어는 인프라에 어떠한 변화도 주지 않기 때문에 계속 실행해도 괜찮다.
그럼 이제 실제로 인프라를 배포하기 위해 terraform apply 를 해보자.
terraform apply
yes 를 실제로 쳐줘야 실행된다.
ls 명령어를 치면 state 파일이 생성되어 있다.
backend 를 따로 지정하지 않았기 때문에 local 이 backend 가 된 것이다.
cli 명령어를 통해서 s3 버킷이 잘 생성되었는지 확인해 보자.
aws s3 ls
terraform import 명령어를 사용하는 예시
위 상황에서 s3.tf 파일을 지우게 된다면?
rm -f s3.tf
그리고 plan 명령어를 쳐서 확인해본다.
terraform plan
plan 명령어를 쳐보면, 버킷이 삭제가 될것이라고 나온다.
왜냐하면 s3.tf 가 실제로 삭제가 되었기 때문이다.
코드가 삭제되었으니까, 실제 state 파일에도 남아있고, 실제 인프라도 남아있으니까 삭제를 할 것이라고 테라폼이 인지하는 것이다.
그런데 여기서 terraform.tfstate 파일을 삭제해보겠다.
rm -f terraform.tfstate
rm -rf .terraform
.terraform 폴더를 지웠으니 plan 명령어가 먹히지 않는다.
다시 terraform init 을 한다.
terraform init
re: init 명령어를 통해 상태 저장을 위한 .tfstate 파일을 생성한다.
re: init 작업을 완료하면, local 에는 .tfstate 에 정의된 내용을 담은 .terraform 폴더가 생성된다.
여기서 plan 명령어를 쳐본다.
terraform plan
그러면, 실제 방금 우리가 만든 인프라 (s3 버킷) 은 아직 있지만, 코드를 분실했기 때문에, 즉 삭제했기 때문에 테라폼 입장에서는 아무것도 안 만들어진 상태가 맞는 것이다.
여기서 import 명령어를 통해 기존 리소스를 import 해보자.
공식 문서에 import 명령어 사용법이 적혀 있다.
# terraform import aws_s3_bucket.bucket bucket-name
terraform import aws_s3_bucket.test terraform-cli-test-0123
실제 코드가 없기 때문에 import 를 할 수 가 없다.
그럼 위에서 우리가 내가 만든 s3.tf 를 다시 생성해 보자.
vim s3.tf
resource "aws_s3_bucket" "test" {
bucket = "terraform-cli-test-0123"
}
terraform plan
여기서 plan 명령어를 치면 이렇게 결과가 나온다. 여기서 알 수 있는 것이 무엇인가?
plan 명령어는 실제 리소스가 있는지 없는지는 검사를 하지 않는다.
하지만 실제로 apply 를 통해 실행을 하면, 생성이 되지 않을 것이다. 이미 만들어져 있으니까.
이럴 때 import 명령어를 사용한다.
terraform import aws_s3_bucket.test terraform-cli-test-0123
import 가 성공적으로 되었다고 나온다.
폴더에 terraform.tfstate 파일이 생성되었을 것이다.
이제 plan 명령어를 치면
terraform plan
변경될 사항이 없다고 나온다.
s3.tf 파일을 생성한 후, import 명령어를 치기 전에는 plan 명령어를 실행했을 때 리소스가 생성될 것이라고 나왔다.
import 명령어를 실행한 후에 plan 명령어를 실행하면, 변경될 리소스가 없다고 뜬다.
이는 로컬과 실제 인프라의 sync 를 맞춘 것이다.
terraform state list
state 라는 명령어도 있는데, 실행하면 실제로 생성된 인프라를 볼 수 있다.
'DevOps' 카테고리의 다른 글
AWS VPC 와 관련 개념, 콘솔을 통한 생성 실습 (0) | 2024.08.06 |
---|---|
테라폼에서 *.tf 파일 설명 (0) | 2024.08.01 |
AWS Configure 설정 (0) | 2024.07.30 |
terraform 설치하기 (0) | 2024.07.30 |
AWS EC2 그리고 SSH (0) | 2024.07.29 |