Terraform

 


테라폼

Hashicorp 사에서 오프소스로 개발한 범용 인프라 스트럭쳐 관리 도구입니다. 인프라를 안전하고 효율적으로 구축, 변경 및 버전 관리하기 위한 인프라 구축 자동화 도구 입니다. 주요 기능들은 아래와 같습니다.

  1. Infrastructure as Code : 인프라를 코드로 관리하여 버전화 할 수 있고, 쉽게 공유하고 재사용 할 수 있습니다.
  2. Execution Plans : apply 를 호출 할 때 terraform 이 수행할 작업을 미리 보여줍니다.
  3. Resource Graph : 모든 리소스의 그래프를 작성하여 효율적으로 인프라를 구축하고 인프라의 종속성에 대한 인사이트를 얻습니다.
  4. Change Automation : 복잡한 변경 집합을 인프라에 자동 적용 할 수 있습니다. 실행계획 및 리소스 그래프를 사용하면 많은 인적 오류를 피하고 Terraform이 어떤 순서로 변경 될 지 정확하게 알 수 있습니다.

관련 사이트들은 아래와 같습니다.

  1. 공식 사이트 : https://www.terraform.io/
  2. 지원하는 AWS 서비스 목록 : https://www.terraform.io/docs/providers/aws/
  3. 기초 튜토리얼 : https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code

  4. 커뮤니티 : https://www.terraform.io/community.html

개념

provisioning

어떤 프로세스나 서비스를 실행하기 위한 준비 단계를 프로비저닝이라고 이야기합니다. 프로비저닝에는 크게 네트워크나 컴퓨팅 자원을 준비하는 작업과 준비된 컴퓨팅 자원에 사이트 패키지나 애플리케이션 의존성을 준비하는 단계로 나뉘어집니다. 명확한 경계는 불분명하지만 테라폼은 전자에 치우쳐있는 도구라고 할 수 있습니다.

provider

테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈입니다. 예를 들어 테라폼으로 AWS 서비스의 컴퓨팅 자원을 생성하기 위해서는 aws 프로바이더를 먼저 셋업해야합니다. 프로바이더로는 AWS, 구글 클라우드 플랫폼Google Cloud Platform, 마이크로소프트 애저Microsoft Azure와 같은 범용 클라우드 서비스를 비롯해 깃허브(Github), 데이터도그(Datadog), DNSimple과 같은 특정 기능을 제공하는 서비스, MySQL, 레빗MQ(RabbitMQ), 도커(Docker)와 같은 로컬 서비스 등을 지원합니다. 전체 목록은 테라폼 프로바이더 문서에서 찾아볼 수 있습니다. 사이트 : https://www.terraform.io/docs/providers/index.html

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 명령어를 사용해 확인할 수 있습니다.


설치

아래 사이트를 통해서 설치해줍니다.

Terraform 다운로드 및 설치 : https://www.terraform.io/downloads.html


워크 플로우

여기서 간단한 Lambda 함수를 생성하는 샘플 코드를 실행해 봅니다.

아래 3개의 스탭으로 진행합니다.

  • Step 1. HCL 언어로 필요한 리소스를 선언합니다.
  • Step 2. 선언된 리소스들이 생성가능하지 계획( Plan ) 을 확인합니다.
  • Step 3. 선언된 리소스들을 아마존 웹 서비스에 적용 ( Apply ) 합니다.

여기서 간단히 ec2 instance 를 생성해 보도록 하겠습니다.

AWS 프로바이더 정의

AWS 프로바이더 정의 파일 생성

$ mkdir web_infra
$ cd web_infra
$ touch provider.tf web_infra.tf index.js

AWS 프로바이더  정의 ( provider.tf 파일 )

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

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

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

AWS 리소스 정의

web_infra.tf 파일에 아래 내용을 추가합니다.

# Simple AWS Lambda Terraform Example
# requires 'index.js' in the same directory
# to test: run `terraform plan`
# to deploy: run `terraform apply`
 
data "archive_file" "lambda_zip" {
  type        = "zip"
  source_file = "index.js"
  output_path = "lambda_function.zip"
}
 
resource "aws_lambda_function" "test_lambda" {
  filename         = "lambda_function.zip"
  function_name    = "test_lambda"
  role             = "${aws_iam_role.iam_for_lambda_tf.arn}"
  handler          = "index.handler"
  source_code_hash = "${data.archive_file.lambda_zip.output_base64sha256}"
  runtime          = "nodejs12.x"
}
 
resource "aws_iam_role" "iam_for_lambda_tf" {
  name = "iam_for_lambda_tf"
 
  assume_role_policy = <<EOF
{
  "Version""2012-10-17",
  "Statement": [
    {
      "Action""sts:AssumeRole",
      "Principal": {
        "Service""lambda.amazonaws.com"
      },
      "Effect""Allow",
      "Sid"""
    }
  ]
}
EOF
}

index.js 파일에 아래 내용을 추가합니다.

// 'Hello World' nodejs6.10 runtime AWS Lambda function
exports.handler = (event, context, callback) => {
  console.log("Hello, logs!");
  callback(null"great success");
};

선언한 리소스들이 생성가능한지 계획( plan )을 확인

plan 명령어를 사용하면 현재 정의되어 있는 리소스들을 실제로 프로바이더에 적용시 어떤 작업을 할지 계획을 보여줍니다.

$ terraform plan

선언된 리소스들을 아마존 웹 서비스에 적용 ( apply )

apply 명령어를 실행하여 적용합니다.

plan 결과를 보여주고 yes 를 입력해야만 리소스를 생성합니다. yes를 입력하세요.

$ terraform apply

프로비저닝된 인프라스트럭처 일괄 종료

 plan 명령어에 -destroy 옵션을 붙여서 실제 리소스를 제거하지 않고도 실행해볼 수 있습니다.

$ terraform plan -destroy

이 계획을 적용하려면 terraform destroy 명령어를 실행합니다.

입력란에 yes라고 입력후 엔터를 누르면 리소스가 전부 제거됩니다.

$ terraform destroy

리소스 생성 확인

web console 로 리소스가 정상적으로 생성되었는지 확인합니다.



cloudFormation 에는 생성된 stack 이 없습니다.

즉, Terraform은 cloudFormation template 기반으로 동작하지 않습니다.

댓글

이 블로그의 인기 게시물

dailyFocus - Frontend

CDK - Assets

About VPC