테라폼에서 Worksspace란 한 프로젝트 단위를 말합니다. 기본적으로 조직의 규모에 따라 서비스가 소규모이다 보니까, 인프라의 규모도 작습니다. 그래서 하나의 워크스페이스에서 모든 인프라를 관리할 수 있습니다. 하지만 조직의 규모가 커지게 되면 infra라는 워크스페이스가 (network, account, domain, service-a ...)와 같이 나누어 질 수 있게 됩니다.
그리고 테라폼은 변경사항을 추적할 수 있게 됩니다. 이를 위해 상태 관리를 하게 됩니다. 상태관리를 하게되면 .terraform.tfstate라는 파일로 관리하게 됩니다. 이는 워크스페이스 단위로 관리합니다.
이제 본격적으로 실습을 위한 워크 스페이스를 만들어보도록 하겠습니다.
실습
https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file
테라폼 공식문서를 참고하여 코드를 작성해 보도록 하고 Write -> Plan -> Apply까지 한번 간단히 해보겠습니다.
Local Provider
local provider에 들어가서 local을 선택해 줍니다. local provider의 Resources에는 Resource와 Data Source로 나누어 지게 됩니다. Resources > local_file이 local provider를 사용해서 관리할 수 있는 인프라 리소스라고 보면 됩니다. 그리고 Data Sources는 인프라 리소스를 작성할 떄 외부에서 데이터를 참조해야 할 때가 있을 수 있습니다. 그럴 떄 사용할 수 있는 데이터 소스라고 볼 수 있습니다. 말 그대로 Data Sources는 데이터를 읽기 위한, Resources는 데이터를 쓰기위한 것이라고 보시면 됩니다.
우선 프로젝트를 진행하기 위한 폴더를 만들고 main.tf를 아래와 같이 작성하겠습니다.
/main.tf
provider "local" {
}
resource "local_file" "foo" {
# ${}의 의미는 string interperation이라고 합니다.
# HCL에서 제공하는 변수, context에서 값을 가져오기 위함입니다.
# path.module은 파일 디렉토리 경로를 뜻합니다.
filename = "${path.module}/foo.txt"
content = "Hello World!"
}
여기서 아래와 같이 버전을 명시해 줄 수 있지만 생략해서 가장 최신 버전을 깔기로 한 것입니다. 그리고 샘플 코드를 통해 프로젝트 폴더에 foo.txt안에 Hello World!를 써보겠습니다. 여기서 local의 Resources의 local_file은 ( Generates a local file with the given content )라고 공식문서에 명시되어 있는데, content의 내용을 기반으로 파일을 로컬에 생성하는 것이라고 보시면 됩니다.
그 다음으로는 이제 terraform명령어를 쳐주겠습니다.
$ alias tf=terraform
$ tf init
우선 별칭을 지정해주고 테라폼 워크스페이스를 초기화 시켜주었습니다.
그리고 plan -> apply를 아래 명령어를 통해서 진행해 보겠습니다.
$ tf plan
$ tf apply
그럼 추가되는 리소스와 변경되는 사항들을 체크해주고 apply하게 되면 아래와 같이 foo.txt가 만들어 진 것을 보실 수 있습니다.
그리고 로컬에 terraform.tfstate가 추가된 것을 보실 수 있는데, 여기에는 현재 리소스의 상태를 관리해주는 파일이라고 보시면 됩니다.
/terraform.tfstate
{
"version": 4,
"terraform_version": "1.2.5",
"serial": 1,
"lineage": "82dcf6bb-bbe6-24a6-8c56-2c2d6565e49e",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "local_file",
"name": "foo",
"provider": "provider[\"registry.terraform.io/hashicorp/local\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"content": "Hello World!",
"content_base64": null,
"directory_permission": "0777",
"file_permission": "0777",
"filename": "./foo.txt",
"id": "2ef7bde608ce5404e97d5f042f95f89f1c232871",
"sensitive_content": null,
"source": null
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
}
]
}
이제 이 다음에는 Data Resources를 통해서 인프라를 읽어오고 그 인프라를 출력해보는 작업을 진행해 보겠습니다.
다음 코드를 참고하여 main.tf를 수정해 주었습니다.
/main.tf
provider "local" {
}
resource "local_file" "foo" {
# ${}의 의미는 string interperation이라고 합니다.
# HCL에서 제공하는 변수, context에서 값을 가져오기 위함입니다.
# path.module은 파일 디렉토리 경로를 뜻합니다.
filename = "${path.module}/foo.txt"
content = "Hello World!"
}
data "local_file" "bar" {
filename = "${path.module}/bar.txt"
}
output "file_bar" {
value = data.local_file.bar
}
data를 통해서 local_file을 읽고 output을 통해서 출력해 보겠습니다. 바로 아래 명령어를 통해 apply시켜보겠습니다.
$ tf apply
그럼 다음과 같이 제가 임의로 추가한 bar.txt를 읽어 객체로 출력을 잘 해주는 것을 보실 수 있습니다.
AWS Provider
우선 먼저 main.tf에 aws provider를 추가해 주겠습니다.
/main.tf
...
# Configure the AWS Provider
provider "aws" {
region = "ap-northeast-2"
}
...
aws provider는 region별로 인프라를 관리하기 때문에 다양한 region을 사용하려면 provider를 여러개를 만들어 주셔야 합니다.
그리고 aws-cli의 credential이 잘 되어 있는지 확인하기 위해 아래 명령어를 쳐주겠습니다.
$ aws sts get-caller-identity
네 저는 codecommit_master라는 사용자로 잘 설정되어 있는 것을 보실 수 있습니다.
그리고 이번 시간에는 aws VPC를 만들어 볼 것이므로 아래와 같이 resource를 추가해 줍니다.
/main.tf
...
# Create a VPC
resource "aws_vpc" "foo" {
# CIDR
cidr_block = "10.0.0.0/16"
}
...
그리고 aws provider를 까아주기 위해 terraform init을 다시해주고 terraform plan을 해줍니다.
$ tf init
$ tf apply
다음과 같이 vpc가 추가된다고 알려줍니다. 그리고 진짜로 apply를 하고 aws에서 이가 잘 추가되었는지 확인해 보겠습니다.
$ tf apply
다음과 같이 맨 마지막에 우리가 추가하고 싶었던 VPC가 잘 생성된 것을 보실 수 있습니다.
그리고 다음에는 위와 동일하게 인프라 정보도 출력하고 VPC의 Name tag를 수정해 보도록 하겠습니다.
/main.tf
...
# Create a VPC
resource "aws_vpc" "foo" {
# CIDR
cidr_block = "10.0.0.0/16"
tags = {
"Name" = "This is test VPC in Terraform"
}
}
output "vpc_foo" {
value = aws_vpc.foo
}
...
다음과 같이 tag를 This is test VPC in Terraform으로 바꾸고 출력도 하는 코드를 짜보았습니다. 그리고 다시 아래 명령어를 치고 결과를 확인하게 되면
$ terraform apply
다음과 같이 정상작동하는 것을 확인해 볼 수 있습니다.
이번에는 CIDR블럭을 변경해 볼것입니다. 이 때는 위의 상황과 어떤 점이 다를지 추측해 봅시다.
/main.tf
...
# Create a VPC
resource "aws_vpc" "foo" {
# CIDR
cidr_block = "10.123.0.0/16"
tags = {
"Name" = "This is test VPC in Terraform"
}
}
...
$ terraform apply
이번에는 change가 아니라 하나가 없어지고 하나가 추가된 것을 보실 수 있습니다. AWS VPC정책상 CIDR블럭을 수정하면 아예 새로운 VPC를 만들어야 합니다.
그럼 위와같이 VPC ID가 달라져 완전히 다른 VPC가 생성되었고 CIDR block또한 잘 변경된 것을 확인해 볼 수 있습니다.
또한 이제 Data Resources도 aws provider에서도 사용할 수 있는데, 간단히 ap-northeast-2상의 모든 VPC목록을 조회하는 방법에 대해 알아보겠습니다.
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpcs
이 공식문서를 참고하였습니다.
/main.tf
...
data "aws_vpcs" "this" {}
output "vpcs" {
value = data.aws_vpcs.this
}
...
이렇게 한다음에 terraform apply를 해보겠습니다.
$ terraform apply
다음과 같이 지금 제 ap-northeast-2상의 모든 VPC의 id를 알려줍니다. 이 외에도 main.tf에 tag, filter arguments를 넣어주면 조건에 따라 VPC목록을 볼 수 있게 해줍니다.
마지막으로 terraform의 인프라를 삭제하는 방법에 대해 알아보겠습니다.
$ terraform destroy
다음과 같이 foo.txt와 VPC 총 2개의 인프라가 삭제된다고 알려주고 있습니다.
다음과 같이 정상적으로 다 삭제된 것을 보실 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL resource와 data (0) | 2022.07.21 |
---|---|
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 기초 문법 (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 소개 (0) | 2022.07.21 |
[ DevOps ] - 엔서블 설치 (0) | 2022.07.20 |
[ DevOps ] - 패커 설치 및 기본 설정 (0) | 2022.07.20 |