[Terraform] 테라폼Terraform 기초 튜토리얼

[Terraform] 기초 튜토리얼

테라폼Terraform

AWS와 테라폼으로 구현하는 Infrastructure as Code

1. 들어가며: Infrastructure as Code 도구

테라폼Terraform은 하시코프Hashicorp에서 오픈소스로 개발중인 인프라스트럭처 관리 도구입니다. 서비스 실행에 필요한 환경을 구축하는 도구라는 점에서 셰프Chef나 앤서블Ansible 같은 설정 관리 도구와 더불어 프로비저닝 도구로 분류됩니다. 테라폼은 코드로서의 인프라스트럭처Infrstructure as Code를 지향하고 있는 도구로서, GUI나 웹 콘솔을 사용해 서비스 실행에 필요한 리소스를 관리하는 대신 필요한 리소스들을 선언적인 코드로 작성해 관리할 수 있도록 해줍니다.

이 글에서는 테라폼의 기본적인 개념들을 소개하고, 테라폼으로 아마존 웹 서비스Amazon Web Serivce(이하 AWS)에서 간단한 웹 애플리케이션을 배포하기 위한 인프라스트럭처를 프로비저닝해보겠습니다.

2. 테라폼 설치

3. 테라폼을 사용한 웹 애플리케이션 인프라스트럭처 프로비저닝

간단한 웹 애플리케이션을 아마존 웹 서비스에 배포하는 상황을 가정하겠습니다. 이 애플리케이션은 EC2 가상 머신과 RDS 데이터베이스를 사용합니다. 테라폼으로 이 인프라스트럭처를 구축하려면 다음과 같은 단계를 거칩니다.

  • 1단계 – 먼저 아마존 웹 서비스 계정을 준비하고, API 키를 설정합니다.
  • 2단계 스텝 1 – 인프라스트럭처를 묘사하기 위해 사용하는 HCL 언어로 필요한 리소스를 선언합니다.
  • 2단계 스텝 2 – 선언된 리소스들이 생성가능한지 계획(Plan)을 확인합니다.
  • 2단계 스텝 3 – 선언된 리소스들을 아마존 웹 서비스에 적용(Apply)합니다.
  • 3단계 – 웹 애플리케이션을 배포합니다.

1단계는 미리 준비되어있다면 건너뛰어도 무방합니다. 2단계는 생성하고자 하는 리소스 수 만큼 반복하면서 점진적으로 진행합니다. 반복해나갈 때마다 테라폼 정의 파일을 조금씩 완성시켜 나갑니다. 3단계는 준비된 인프라스트럭처에 웹 애플리케이션을 배포하는 단계입니다. 여기서는 인프라스트럭처를 프로비저닝하는 2단계까지 진행해나갑니다.

4. 테라폼의 기본 개념들

이 글에서 다룰 테라폼의 기본 개념들입니다. 각 개념들에 대해서는 튜토리얼을 진행해나가면서 자세히 설명합니다.

프로비저닝(provisioning)
어떤 프로세스나 서비스를 실행하기 위한 준비 단계를 프로비저닝이라고 이야기합니다. 프로비저닝에는 크게 네트워크나 컴퓨팅 자원을 준비하는 작업과 준비된 컴퓨팅 자원에 사이트 패키지나 애플리케이션 의존성을 준비하는 단계로 나뉘어집니다. 명확한 경계는 불분명하지만 테라폼은 전자에 치우쳐있는 도구라고 할 수 있습니다.
프로바이더(Provider)
테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈입니다. 예를 들어 테라폼으로 AWS 서비스의 컴퓨팅 자원을 생성하기 위해서는 aws 프로바이더를 먼저 셋업해야합니다. 프로바이더로는 AWS, 구글 클라우드 플랫폼Google Cloud Platform, 마이크로소프트 애저Microsoft Azure와 같은 범용 클라우드 서비스를 비롯해 깃허브Github, 데이터도그Datadog, DNSimple과 같은 특정 기능을 제공하는 서비스, MySQL, 레빗MQRabbitMQ, 도커Docker와 같은 로컬 서비스 등을 지원합니다. 전체 목록은 테라폼 프로바이더 문서에서 찾아볼 수 있습니다.
리소스(자원)Resource
리소스란 특정 프로바이더가 제공해주는 조작 가능한 대상의 최소 단위입니다. 예를 들어 AWS 프로바이더는 aws_instance 리소스 타입을 제공하고, 이 리소스 타입을 사용해 Amazon EC2의 가상 머신 리소스를 선언하고 조작하는 것이 가능합니다. EC2 인스턴스, 시큐리티 그룹, 키 페어 모두 aws 프로바이더가 제공해주는 리소스 타입입니다.
HCL(Hashicorp Configuration Language)
HCL은 테라폼에서 사용하는 설정 언어입니다. 테라폼에서 모든 설정과 리소스 선언은 HCL을 사용해 이루어집니다. 테라폼에서 HCL 파일의 확장자는 .tf를 사용합니다.
계획Plan
테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용을 실제로 적용 가능한지 확인하는 작업을 계획이라고 합니다. 테라폼은 이를 terraform plan 명령어로 제공하며, 이 명령어를 실행하면 어떤 리소스가 생성되고, 수정되고, 파괴될지 계획을 보여줍니다.
적용Apply
테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용대로 리소스를 생성, 수정, 파괴하는 일을 적용이라고 합니다. 테라폼은 이를 terraform apply 명령어로 제공합니다. 이 명령어를 실행하기 전에 변경 예정 사항은 plan 명령어를 사용해 확인할 수 있습니다.

5. 프로바이더 작업

vi provider.tf

 provider "aws" {
  access_key = "AKIAI7CZXYAIQZUWDDDA"
  secret_key = "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"
  region = "ap-northeast-2"
}

6. 테라폼 프로젝트 초기화

현재 사용하는 버전이 0.10보다 낮다면 테라폼 프로젝트를 별도로 초기화하지 않아도 됩니다. 0.10 이전에는 테라폼 본체에 프로바이더들이 포함되어 있었지만 0.10부터 프로바이더가 플러그인으로 분리되었고, 이에 따라서 테라폼 프로젝트를 별도로 초기화할 필요가 있어졌습니다. 테라폼은 테라폼 프로젝트를 초기화할 때 프로바이더 설정을 보고 필요한 플러그인을 설치합니다.

web_infra 디렉터리에서 terraform init 명령어를 실행합니다.

$ terraform init
Initializing provider plugins...
 - Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "aws" (1.24.0)...
...

테라폼이 현재 디렉터리에 아래에 선언된 프로바이더 플러그인을 설치해줍니다.

  1. 키페어 생성
    resource "aws_key_pair" "web_admin" {
     key_name = "web_admin"
     public_key = "${file("~/.ssh/web_admin.pub")}"
    } 
    
    
  2. SG생성
    data "aws_security_group" "default" {
     name = "SG_Beyond_IDS"
    }
    resource "aws_security_group" "ssh" {
     name = "allow_ssh_from_all"
     description = "Allow SSH port from all"
     ingress {
       from_port = 20022
       to_port = 20022
       protocol = "tcp"
       cidr_blocks = ["203.244.0.0/16"]
     }
    } 
    
  3. ami를 이용한 인스턴스 생성
    resource "aws_instance" "web" {
     ami = "ami-05b3c0d42bb502311" # Amazon Linux AMI 2017.03.1 Seoul
     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}"
     ]
    } 
    

테라폼init화면

​ [Apply 시에 나타나는 문구]


테라폼실제생성화면

​ [실제 생성된 이미지]

7. 마치며 : 테라폼을 사용하는 이유

여기까지 테라폼으로 AWS 리소스들을 정의하고 프로비저닝하는 방법에 대해서 알아보았습니다. 웹 콘솔을 사용해 리소스를 관리하는 것과는 많이 다릅니다. 여기서는 정말 간단한 사례를 구현해보았지만, 그럼에도 불구하고 간단해보이지는 않습니다. 프로젝트에서 테라폼을 사용해보면 매번 리소스 레퍼런스를 확인하고, 웹 콘솔과 비교해보는 과정을 계속해서 반복해야합니다. 어떤 면에서는 웹 콘솔보다 오히려 어렵고 귀찮습니다. 그렇다면 테라폼을 사용할 필요가 있을까요.

이 글에서는 테라폼의 사용법을 소개하는 데 집중해서 자세히는 다루지 않았지만, 테라폼을 사용하면 좋은 점들이 있습니다. 먼저 웹 콘솔을 사용해 리소스들을 관리하면서 차츰 리소스가 많아지면, 어느 지점에는 더 이상 전체를 관리할 수 없는 순간이 오게 됩니다. 언제 왜 만들었는지 알 수 없는 리소스들도 점점 쌓여나갑니다. 테라폼을 사용하면 프로비저닝하고자 하는 상태를 코드로 명확히 기록해두기 때문에 웹 콘솔만 사용할 때보다 세심한 관리가 가능해집니다.

또한 테라폼은 코드로서의 인프라스터럭처Infrastructure as Code를 지향하는 도구로서, 코드를 작성할 때 누리던 생태계의 이점을 그대로 이용할 수 있습니다. 저장소에서 이력 추적을 할 수도 있고, 깃허브Github에서 팀원들과 코드 리뷰를 진행할 수도 있습니다. 이 과정에서 누가 어떤 리소스를 왜 추가했는지, 투명성은 자동적으로 얻어집니다. 좀 더 잘 활용한다면 CI를 사용해 코드 리뷰가 된 사항을 자동적으로 플랜 및 적용하는 것도 가능합니다.

마지막으로, 테스트나 연습으로 만든 리소스들은 삭제하는 걸 잊지 마시기 바랍니다.

https://blog.wonizz.tk

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다