IaC

Terraform - (2) 기본 사용법

Operation CWAL 2021. 6. 6. 23:17

리소스 정의

tutorial01이라는 디렉토리와 하위에 main.tf 라는 파일을 생성한 뒤, 아래와 같은 코드를 작성해보자. 'ap-northeast-2' region에 새로운 VPC 리소스를 생성하는 매우 간단한 코드이다. 참고로 Terraform은 HashiCorp에서 정의한 언어인 HCL을 사용하며, 확장자명은 반드시 .tf 파일 또는 .tf.json(JSON 형식)을 갖는다.

provider "aws" {
    region = "ap-northeast-2"
}

resource "aws_vpc" "myvpc" {
    cidr_block = "10.0.0.0/16"
}

 

provider는 AWS, Azure와 같은 Public Cloud에서부터 Docker, K8s와 같은 외부 Infrastrcuture의 API를 추상화하여, 리소스 타입과 데이터 소스를 Terraform에 제공하는 Terraform 플러그인이다. 참고로 Terraform을 지원하는 Provider는 링크를 참고하기 바란다. 지금은 일단 AWS를 Provider로 지정 후, 해당 플러그인을 통해 AWS 리소스를 생성한다고 생각하자.

위 코드는 "myvpc"라는 "aws_vpc"를 정의한다. 다만 "myvpc"는 terraform 안에서 사용할 Resource ID일 뿐, AWS VPC  ID가 아님에 유의해야 한다. 그리고 위 VPC는 "10.0.0.0/16" CIDR을 갖는다.

 

terraform init

리소스 생성에 앞서, 현재 디렉토리(tutorial01)을 Terraform 프로젝트용으로 만들어야 한다. 'terraform init' 명령어를 사용하면 다음과 같은 메시지가 출력되며, .terraform 디렉토리 안에 'aws' provider 플러그인을 다운로드하는 것을 알 수 있다.

 

terraform plan

실제 리소스 생성에 앞서 Terraform 파일에 문법 등의 문제가 없는지 검토할 필요가 있다. 'terraform plan' 명령어를 사용하면 아래와 같이 어떤 리소스가 추가되고, 어떤 값을 갖는지 예측할 수 있다. 물론 대부분의 항목은 실제 생성된 뒤에 알 수 있기 때문에 '(known after apply)'로 출력된다. 예를 들어 ARN(Amazon Resource Name)은 직접 리소스를 생성하기 전까지 그 값을 알 수 없다.

terraform apply

'terraform plan' 명령어에서 에러가 없었다면, 다음은 실제로 리소스를 생성할 차례다. 'terraform apply' 명령어를 사용하여 VPC를 추가하고, AWS 콘솔에서 실제 정의한 값과 동일한지 비교해보자. 작업 수행시, 사용자에게 확인을 요구하므로 'yes'를 입력한다.

AWS 콘솔에서 ID가 'vpc-076c2effb92e6fc73'이고, CIDR이 '10.0.0.0/16'인 VPC가 ap-northeast-2 region에 추가된 것을 확인 가능하다.

'terraform apply' 명령어 사용시, 프로젝트 폴더 안에 'terraform.tfstate' 파일이 생성된다. 해당 파일을 열어보면 다음과 같은데, Terraform을 통해 추가된 리소스들의 State가 JSON 형식으로 저장되는 것을 알 수 있다.

{
  "version": 4,
  "terraform_version": "0.12.24",
  "serial": 1,
  "lineage": "1d7d8fad-c3c4-2533-afc7-8edff414e430",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "aws_vpc",
      "name": "myvpc",
      "provider": "provider.aws",
      "instances": [
        {
          "schema_version": 1,
          "attributes": {
            "arn": "arn:aws:ec2:ap-northeast-2:199137616366:vpc/vpc-076c2effb92e6fc73",
            "assign_generated_ipv6_cidr_block": false,
            "cidr_block": "10.0.0.0/16",
            "default_network_acl_id": "acl-095a2c39cbf5bb0d5",
            "default_route_table_id": "rtb-0f8e93a4327fd34bc",
            "default_security_group_id": "sg-02b10bdf6f1abacc0",
            "dhcp_options_id": "dopt-4220b729",
            "enable_classiclink": null,
            "enable_classiclink_dns_support": null,
            "enable_dns_hostnames": false,
            "enable_dns_support": true,
            "id": "vpc-076c2effb92e6fc73",
            "instance_tenancy": "default",
            "ipv6_association_id": "",
            "ipv6_cidr_block": "",
            "main_route_table_id": "rtb-0f8e93a4327fd34bc",
            "owner_id": "199137616366",
            "tags": null,
            "tags_all": {}
          },
          "private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ=="
        }
      ]
    }
  ]
}

terraform destroy

'terraform destroy' 명령어를 사용하여, 모든 리소스를 제거할 수 있다. 지금은 간단한 튜토리얼이므로 별 문제가 없으나, 실제 운영 환경에서 이 명령어는 돌이킬 수 없는 결과를 초래하므로 매우 신중하게 사용해야 한다. 'terraform apply'와 마찬가지로 사용자의 의사를 확인하는 프롬프트에서 'yes'를 입력한다.

해당 명령어 사용시, 현재 'terraform.tfstate' 파일은 다음과 같이 초기화된다.

{
  "version": 4,
  "terraform_version": "0.12.24",
  "serial": 3,
  "lineage": "1d7d8fad-c3c4-2533-afc7-8edff414e430",
  "outputs": {},
  "resources": []
}

 

State

'terraform apply', 'terraform destroy'와 같이 리소스를 변경하는 명령어를 사용할 경우, 'terraform.tfstate' 파일은 항상 현재 리소스의 state로 업데이트되며, 이전 내용은 'terraform.tfstate.backup' 파일에 백업된다. 이를 통해 작업 전 상태로 복원할 수 있는 장점이 있지만, 바로 이전 revision에 대해서만 가능하다.

최대한 안전하게 Backup&Restore를 할 수 있도록, Terraform 프로젝트 폴더를 Git으로 관리하도록 하자.

'IaC' 카테고리의 다른 글

Terraform - (4) 기본 AWS 리소스  (0) 2021.06.08
Terraform - (3) Variables  (0) 2021.06.07
Terraform - (1) 소개 및 설치  (0) 2021.03.29
Ansible - Playbook Tutorial(3/3)  (0) 2021.03.07
Ansible - Playbook Tutorial(2/3)  (0) 2021.03.06