center

AWS Terraform 워크샵

코드형 인프라로 AWS 리소스 구축

소개

당신의 이름 :

직위 :

자동화 경험 :

즐겨찾는 텍스트 편집기 :

목차

  1. Terraform 및 데모 소개
  2. Terraform 기초
    👩‍🔬 실습 - 설정 및 기본 사용법
  3. Terraform In Action: Plan, Apply, Destroy
  4. Terraform 코드 구성
    🧪 실습 - 작동 중인 Terraform
  5. AWS 인스턴스 프로비저닝 및 구성
    🔬 실습 - Terraform으로 프로비저닝
  6. 인프라 상태 관리 및 변경
  7. Terraform Cloud
    ⚗️ 실습 - Terraform 원격 상태

1장 Terraform 소개

Terraform 소개

AWS 인스턴스를 프로비저닝하는 방법

새 AWS 인스턴스를 프로비저닝할 수 있는 몇 가지 방법을 살펴보겠습니다. 시작하기 전에 다음을 포함하되 이에 국한되지 않는 몇 가지 기본 정보를 수집해야 합니다.

  • 인스턴스 이름
  • 운영 체제(이미지)
  • VM 크기
  • 지리적 위치(지역)
  • 보안 그룹

방법 1: AWS 콘솔(GUI)

center

방법 1: AWS 포털(GUI)

center

방법 2: CloudFormation 템플릿

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "AWS CloudFormation Sample Template EC2InstanceWithSecurityGroupSample: Create an Amazon EC2 instance running the Amazon Linux AMI. The AMI is chosen based on the region in which the stack is run. This example creates an EC2 security group for the instance to give you SSH access. **WARNING** This template creates an Amazon EC2 instance. You will be billed for the AWS resources used if you create a stack from this template.",
  "Parameters" : {
    "KeyName": {
      "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance",
      "Type": "AWS::EC2::KeyPair::KeyName",
      "ConstraintDescription" : "must be the name of an existing EC2 KeyPair."
    },
  }
}

CloudFormation 템플릿은 AWS 리소스를 프로비저닝하는 일관되고 안정적인 방법을 제공합니다. JSON은 컴퓨터가 읽기 쉽지만 사람이 편집하고 문제를 해결하기 어려울 수 있습니다.

방법 3: Terraform으로 프로비저닝

resource aws_instance "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
  tags = {
    Name = "HelloWorld"
  }
}

AWS 인스턴스를 구축하기 위한 Terraform 코드의 예입니다.

참조 URL : https://registry.terraform.io/providers/hashicorp/aws/latest/docs

Terraform이란?

resource aws_instance "catapp" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = var.instance_type
  tags = {
    Name = "${var.prefix}-meow"
  }
  • 실행 가능한 문서
  • 사람과 기계가 읽을 수 있음
  • 배우기 쉬움
  • 테스트, 공유, 재사용, 자동화
  • 모든 주요 클라우드 제공업체에서 작동

코드형 인프라란 무엇입니까?

IaC(Infrastructure as Code)는 컴퓨터에서 읽을 수 있는 정의 파일을 사용하여 클라우드 인프라를 관리하고 프로비저닝하는 프로세스입니다.

실행 가능한 문서라고 생각하십시오.

코드형 인프라를 통해 다음을 수행할 수 있습니다...

  • 인프라 구축을 위한 코드화된 워크플로 제공
  • 기존 인프라 변경 및 업데이트
  • terraform plan 처럼 모의 실행 모드 를 사용하여 변경 사항을 안전하게 테스트
  • 애플리케이션 코드 워크플로(Git, CI/CD 도구)와 통합
  • 손쉬운 공유 및 협업을 위해 재사용 가능한 모듈 제공
  • 보안 정책 및 조직 표준 시행
  • 서로 다른 팀 간의 협업 활성화

코드 도구로서의 기타 인프라

center

이러한 도구는 운영 체제 및 응용 프로그램을 구성하는 데 적합합니다. 클라우드 인프라 및 플랫폼 서비스 프로비저닝을 위해 특별히 제작되지 않았습니다.

기본 클라우드 프로비저닝 도구

center

각 클라우드에는 자체 YAML 또는 JSON 기반 프로비저닝 도구가 있습니다.

Terraform은 모든 주요 클라우드 공급자 및 VM 하이퍼바이저 에서 사용할 수 있습니다.

center

Terraform 대 JSON

CFT JSON:

"name": "{ "Fn::Join" : [ "-", [ PilotServerName, vm ] ] }",

State:

name = "${var.PilotServerName}-vm"

Terraform 코드(HCL)는 배우기 쉽고 읽기 쉽습니다. 또한 동등한 JSON 구성보다 50-70% 더 작습니다.

왜 AWS에서 Terraform해야 합니까?

  • 멀티 클라우드 및 하이브리드 인프라 지원
  • 다른 클라우드 공급자에서 마이그레이션
  • 프로비저닝 속도 증가
  • 효율성 향상
  • 위험 감소

데모

데모

제 2 장

Terraform 기본 사항

Terraform이란?

center

Terraform은 오픈 소스 프로비저닝 도구입니다.

Go로 작성된 단일 바이너리로 제공됩니다. Terraform은 크로스 플랫폼이며 Linux, Windows 또는 MacOS에서 실행할 수 있습니다.

Terraform 설치는 쉽습니다. zip 파일을 다운로드하고 압축을 풀고 실행하기만 하면 됩니다.

Terraform 명령줄

Terraform은 명령줄 도구입니다.

Terraform 명령은 수동으로 입력하거나 스크립트에서 자동으로 실행됩니다.

명령은 Linux, Windows 또는 MacOS에 관계없이 동일합니다.

Terraform에는 다양한 작업을 수행하는 하위 명령이 있습니다.

# Basic Terraform Commands
terraform version
terraform help
terraform init
terraform plan
terraform apply
terraform destroy

Terraform 도움말

$ terraform help
Usage: terraform [-version] [-help] <command> [args]
...
Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    graph              Create a visual graph of Terraform resources

terraform subcommand help 에는 특정 하위 명령에 대한 도움말을 보려면 입력하십시오.

Terraform 코드

resource aws_vpc "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "dedicated"
}

Terraform 코드는 HCL2 툴킷 을 기반으로 합니다. HCL은 HashiCorp 구성 언어를 나타냅니다.

Terraform 코드 또는 간단히 terraform은 모든 클라우드 또는 플랫폼에서 인프라를 프로비저닝하기 위해 특별히 설계된 선언적 언어입니다.

Terraform 설명

행 주석은 octothorpe * 또는 파운드 기호로 시작합니다.

# This is a line comment.

블록 주석은 /**/ 기호 사이에 포함됩니다.

/* This is a block comment.
Block comments can span multiple lines.
The comment ends with this symbol: */
  • 예, 실제로는 octothorpe 라고 합니다.

Terraform WorkSpace

terraform WorkSpace 은 단순히 terraform 코드가 포함된 폴더 또는 디렉토리 입니다.

Terraform 파일은 항상 *.tf 또는 *.tfvars 확장자로 끝납니다.

대부분의 terraform WorkSpace 에는 최소 3 개의 파일이 포함됩니다.

main.tf - 대부분의 기능 코드가 여기에 위치합니다.
variables.tf - 이 파일은 변수를 저장하기 위한 것입니다.
outputs.tf - terraform 실행이 끝날 때 표시되는 내용을 정의합니다.

Terraform WorkSpace

동일한 구성에서 서로 다른 독립적인 상태를 만들 수 있습니다. Terraform 작업공간은 코드 사용량을 줄입니다. 원격 백엔드와 호환되므로 이 작업 공간은 팀과 공유됩니다.

terraform -help workspace

💥new Create a new workspace
💥list Lists Workspaces
💥show It shows the name of the current workspace
💥select Select a workspace
💥delete To delete a workspace

Terraform WorkSpace 설정

작업 공간 설정 — S3를 원격 백엔드로 사용:

각 작업공간의 원격 상태를 S3에 백업할 수도 있습니다. 여기서 Terraform 스크립트는 아래와 같습니다.

center

Terraform WorkSpace 설정

center

Terraform WorkSpace 설정

환경 개발을 위한 새로운 작업 공간을 만들었습니다.

center

center

Terraform WorkSpace 설정

center

center

Terraform WorkSpace 설정

마지막으로 작업 공간 정리가 수행되었습니다.

center

Terraform Workflow

워크플로는 초기화, 계획, 적용 및 삭제로 시작되는 수명 주기 단계로 구성됩니다. 이 모든 것은 작성된 코드가 구축된 인프라를 업데이트하거나 변경하기 위한 명령으로 실행되었습니다.

Terraform Init

$ terraform init
Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "aws" (hashicorp/aws) 2.35.0...
...
 provider.aws: version = "~> 2.35"
Terraform has been successfully initialized!

Terraform은 필요한 공급자와 모듈을 가져와서 .terraform 디렉터리에 저장합니다. 모듈 또는 공급자를 추가, 변경 또는 업데이트하는 경우 init를 다시 실행해야 합니다.

Terraform Plan

$ terraform plan
An execution plan has been generated and is shown below.
Terraform will perform the following actions:
  # aws_vpc.main will be created
  + resource "aws_vpc" "main" {
      + arn                              = (known after apply)
      + cidr_block                       = "10.0.0.0/16"
      ...
      + instance_tenancy                 = "dedicated"
    }

terraform plan적용하기 전에 변경 사항을 미리 봅니다.

Variable 는 어디에 정의되어 있습니까?

Terraform Variable 는 variables.tf 라는 파일에 배치됩니다. variaalbe 는 기본 설정을 가질 수 있습니다. 기본값을 생략하면 사용자에게 값을 입력하라는 메시지가 표시됩니다. 여기서 우리는 사용할 variable 를 선언합니다.

variable "prefix" {
  description = "This prefix will be included in the name of most resources."
}
variable "instance_tenancy" {
  description = "A tenancy option for instances launched into the VPC."
  default     = "dedicated"
}

Variable 은 어떻게 설정됩니까?

몇 가지 variable 를 정의한 후에는 다양한 방법으로 variable 를 설정하고 재정의할 수 있습니다. 다음은 각 방법의 우선 순위 수준입니다.

이 목록은 가장 높은 우선 순위(1)에서 가장 낮은 우선 순위(5)로 이동합니다.

  1. Command line flag - run as a command line switch
  2. Configuration file - set in your terraform.tfvars file
  3. Environment variable - part of your shell environment
  4. Default Config - default value in variables.tf
  5. User manual entry - if not specified, prompt the user for entry

👩‍💻 실습: Terraform 기초

이 실습에서는 편집기를 설정하고, Terraform 명령줄 도구를 사용하고, AWS와 통합하고, 다양한 설정으로 몇 가지 연습을 수행하는 방법을 배웁니다.

📝 2장 복습

이 장에서 우리는:

  • terraform init 명령 사용
  • terraform plan 명령을 실행
  • variable 에 대해 배웠습니다.
  • 테넌시 및 접두사 설정

3 장

Terraform Run

리소스 분석

모든 terraform 리소스는 정확히 동일한 방식으로 구성됩니다.

resource type "name" {
  parameter = "foo"
  parameter2 = "bar"
  list = ["one", "two", "three"]
}

resource = 최상위 키워드
type = 자원 유형. 예: aws_instance.
name = 이 리소스를 참조하기 위한 임의의 이름입니다. terraform에서 내부적으로 사용됩니다. 이 필드는 변수가 될 수 없습니다.

Terraform Provider 구성

terraform 핵심 프로그램은 무엇이든 구축하기 위해 적어도 하나의 Provider 가 필요합니다.

사용하려는 Provider 버전을 수동으로 구성할 수 있습니다. 이 옵션을 생략하면 Terraform은 기본적으로 제공자의 사용 가능한 최신 버전을 사용합니다.

provider "aws" {
  version = "=2.35.0"
}

버전 관리 연산자

- = (or no operator): exact version equality
- !=: version not equal
- \>, >=, <, <=: version comparison
- ~>: pessimistic constraint, constraining both the oldest and newest
version allowed. ~> 0.9 is equivalent to >= 0.9, < 1.0, and ~> 0.8.4
is equivalent to >= 0.8.4, < 0.9

재사용 가능한 모듈은 >= 2.35.0과 같이 허용되는 최소 버전만 제한해야 합니다.

Terraform Apply

$ terraform apply

An execution plan has been generated and is shown below.
Terraform will perform the following actions:
  # aws_vpc.main will be created
  + resource "aws_vpc" "main" {
      + cidr_block                       = "10.0.0.0/16"
      + instance_tenancy                 = "dedicated"
        ...
      + tags                             = {
          + "Name" = "main"
        }
    }
Plan: 1 to add, 0 to change, 0 to destroy.

terraform apply 을 실행한 다음 승인하면 변경 사항을 적용합니다.

Terraform Destory

$ terraform destroy

An execution plan has been generated and is shown below.
Terraform will perform the following actions:
  # aws_vpc.main will be destroyed
  - resource "aws_vpc" "main" {
      - cidr_block                       = "10.0.0.0/16" -> null
      - instance_tenancy                 = "dedicated" -> null
        ...
      - tags                             = {
          - "Name" = "main"
        } -> null
    }
Plan: 0 to add, 0 to change, 1 to destroy.

terraform destroy 는 그 반대입니다. 승인하면 인프라가 삭제됩니다.

Terraform Format

Terraform에는 코드 포맷터/클리너가 내장되어 있습니다. 모든 여백과 목록 들여쓰기를 깔끔하고 깔끔하게 만들 수 있습니다. 아름다움이 더 잘 작동합니다.

terraform fmt

*.tf 파일이 포함된 디렉토리에서 실행하기만 하면 코드가 정리됩니다.

Terraform Data Source

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }
  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"] # Canonical
}

데이터 소스는 자체적으로 사용할 수 있도록 해당 매개변수에 액세스할 수 있도록 공급자에게 쿼리하여 기존 리소스를 반환하는 방법입니다.

Terraform Dependence Mapping

Terraform은 자동으로 종속성을 추적할 수 있습니다. 아래의 두 리소스를 살펴보십시오. aws_instance 리소스에서 강조 표시된 줄을 확인하십시오. 이것은 terraform에서 한 리소스가 다른 리소스를 참조하도록 지시하는 방법입니다.

resource aws_key_pair "my-keypair" {
  key_name   = "my-keypair"
  public_key = file(var.public_key)
}
resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
  key_name      = aws_key_pair.my-keypair.key_name
}

Terraform Code Configure

Terraform은 확장자로 끝나는 작업 공간의 모든 파일을 읽지 .tf만 관례는 main.tf, variables.tf 및 outputs.tf를 갖는 것입니다. 원하는 경우 더 많은 tf 파일을 추가할 수 있습니다.

main.tf
variables.tf
outputs.tf

각 파일을 자세히 살펴보겠습니다.

Main 파일

첫 번째 파일은 main.tf입니다. 이것은 일반적으로 terraform 코드를 저장하는 곳입니다. 더 크고 더 복잡한 인프라를 사용하면 이를 여러 파일로 나눌 수 있습니다.

# This is the main.tf file.
resource aws_vpc "main" {
  cidr_block       = var.cidr_block
  instance_tenancy = var.instance_tenancy
}
resource aws_subnet "main" {
  vpc_id     = aws_vpc.main.id
  cidr_block = var.cidr_block
  }
}
...

Variable

Terraform 변수는 Terraform 구성에서 재사용할 수 있는 값을 저장합니다. 변수의 기능은 다음과 같습니다.

변수를 함수 인수로 입력하므로 사용자는 소스를 편집하지 않고도 동작을 사용자 정의할 수 있습니다.

출력 값은 Terraform 모듈의 반환 값과 같습니다.

로컬 값은 표현식에 짧은 이름을 할당하기 위한 편리한 기능입니다.

Varialbe 파일

두 번째 파일은 variables.tf입니다. 여기에서 변수를 정의하고 선택적으로 일부 기본값을 설정합니다.

variable "cidr_block" {
  description = "The address space that is used within the VPC. Changing this forces a new resource to be created."
}
variable "instance_tenancy" {
  description = "A tenancy option for instances launched into the VPC. Acceptable values are 'dedicated' and ''"
  default     = "dedicated"
}

Input 파일

입력 변수는 변수 블록에 선언됩니다. 이름, 유형, 기본값, 설명 등 변수 블록에 선언된 다음 인수가 있습니다.

Variable <variable name> {
description = "updating instance type" - - - Give a meaningful description
type = string - - - - - - - - - - - - - ex: string, number, bool, list, map
default = "t2.micro" - - - - - - - - - - variable default value

Input 파일 유형

문자열, 숫자 또는 부울과 같은 변수 값의 유형인 몇 가지 간단한 변수 파일을 만들어 보겠습니다.

  • 문자열 — 일부 텍스트를 나타내는 일련의 유니코드 문자
  • 숫자 — 정수 또는 분수 값을 포함하는 숫자 값입니다.
  • Bool — TRUE 또는 FALSE입니다. 부울 값입니다.

Input - Map

맵은 하나의 값을 사용하여 다른 값을 조회하려는 상황에 사용되는 연관 배열입니다. 예를 들어 EC2 인스턴스를 생성하기 위한 AMI는 지역별로 고려해야 합니다.

지역을 변경하려면 입력 변수 Map of strings를 사용하여 새 AMI를 조회해야 합니다.

Input - List

각 값은 목록의 해당 인덱스로 호출될 수 있습니다. 다음은 목록 변수 정의의 예입니다. 또한 목록에는 찾고 있는 인덱스 값을 표시해야 합니다.

입력 변수에 값 할당

아래 나열된 대로 입력 변수에 값을 할당하는 방법에는 여러 가지가 있습니다.

💡명령줄 옵션에서 | 💡변수 정의 파일에서 | 💡환경 변수로

명령줄 옵션:

terraform plan -var 'aws_region=us-west-1'

명령줄에서 특정 개별 변수를 언급하려면 terraform plan 및 terraform apply 명령을 실행하는 동안 –var 옵션을 사용할 수 있습니다. 예: 명령줄에서 지역을 지정하겠습니다.

아래와 같이 명령줄에서 액세스 키와 비밀 키의 인증을 수행할 수 있는 것과 동일합니다.

terraform 적용 – var = "AWS_ACCESS_KEY=<액세스 키>"
terraform 적용 – var = "AWS_SECRET_KEY=<비밀 키>"

CLI 변수:

다음과 같이 "terraform Apply"에서 –var-file을 사용하여 명령줄 옵션에서 동일한 파일을 언급할 수 있습니다 .

terraform apply -var = "image_id=ami-xyz234"

Tfvars 파일

단일 변수 파일에 해당 값을 지정하여 많은 변수를 설정하려면 .tfvars로 끝나는 변수 정의 파일을 사용할 수 있으므로 편리합니다 . 생성된 파일의 이름은 아래와 같이 terraform.tfvars 또는 terraform.tfvars.json 입니다.

terraform apply –var-file="sample.tfvars"

auto tfvars files:

또 다른 파일 이름은 .auto.tfvars 또는 .auto.tfvars.json 입니다. –var-file 플래그를 지정하지 않고 추가한 .auto 파일이 자동으로 로드됩니다.

환경 변수:

Terraform은 기본적으로 TF_VAR_ 이라는 환경 변수와 선언된 변수 이름을 검색합니다. 환경 변수 이름은 대소문자를 구분하며 구성에 지정된 변수 이름과 정확하게 일치합니다.

Export TF_VAR_AWS_REGION=us-east-1

Output 파일

outputs 파일은 terraform 적용 종료 시 표시할 메시지 또는 데이터를 구성하는 위치입니다.

output "catapp_url" {
  value = "http://${aws_route53_record.hashicat.fqdn}"
}
output "private_key" {
  value = "${tls_private_key.hashicat.private_key_pem}"
}

local value:

Terraform 로컬 값은 임시 로컬 변수와 같습니다. 동일한 모듈 내에서 여러 번 사용할 수 있도록 로컬 값으로 할당된 표현식 이름입니다. 모듈 구성에서 동일한 값이 반복되는 것을 방지하는 데 도움이 됩니다.

center

Terraform의 메타 인수

메타 인수는 리소스가 생성, 업데이트 및 삭제되는 방법을 제어하는 ​​데 사용됩니다. 리소스의 동작을 제어합니다.

🎯count
🎯count.index
🎯for_each
🎯depends_on
🎯provider
🎯lifecycle

Terraform의 메타 인수 : count

값이 정수인 Count 인수를 사용하면 Terraform은 구성 실행 시 그만큼의 리소스를 생성합니다. 인수는 각 유형의 리소스 블록에 사용할 수 있습니다.

resource "aws_instance" "sample" {
Count = 4
Ami = "ami-ID"
Instance_type = "t2.micro"
}

Terraform의 메타 인수 : count-index

Count.Index 각 인스턴스 또는 기타 리소스를 수정하려면 여기에서 count 인수가 선언된 모든 블록의 구성에서 count.index ${count.index}를 사용할 수 있습니다. 인덱스 번호는 항상 0부터 시작합니다.

resource "aws_instance" "linux_server" {
count = 4 - - - - - - - creates four similar EC2 instances
ami = "ami-ID"
instance_type = "t2.micro"
tags = {
Name = "linux_server ${count.index}"
}
}

그러면 이름이 "linux_server_0", "linux_server_1"인 4개의 인스턴스가 최대 4개 생성됩니다.

Terraform의 메타 인수 : For_Each

For_Each 루프는 값이 맵 또는 문자열 집합일 때 사용할 수 있습니다. 유형은 동일하지만 속성이 다른 n개의 리소스를 생성할 수 있습니다. 아래 예에서 리소스 블록은 변수의 입력을 for_each 인수로 가져와 vars.tf 구성에 선언된 값에서 EC2 인스턴스를 생성합니다.

resource "aws_instance" "webserver" {
for_each =var.webservers
ami = "ami-ID"
instance_type ="t2.micro"
tags = {
name = each.value["name"]
}
}

Terraform의 메타 인수 : Depends_on

Depends_on은 리소스가 다른 리소스에 종속되도록 지정하는 데 사용됩니다. 이는 Auto Scaling 그룹에 의존하는 로드 밸런서와 같이 다른 리소스가 먼저 존재해야 하는 리소스를 생성할 때 유용할 수 있습니다.

Terraform의 메타 인수 : Lifecycle

수명주기 는 구성 파일에 있는 리소스의 전체 수명주기를 관리하는 데 사용됩니다. 생성, 파괴 또는 변경 시기를 처리합니다. 이러한 하위 인수의 예로는 create_before_destroy, Prevent_destroy,ignore_changes 가 있습니다 .

Resource "aws_instance" "example" {
Lifecycle {
Create_before_destroy = true
}
}

Terraform 종속성 그래프

terraform 리소스 그래프는 리소스 간의 종속성을 시각적으로 보여줍니다.

리소스 그룹을 만들려면 지역 및 접두사 변수가 필요하며, 이는 다시 가상 네트워크를 구축하는 데 필요합니다.

👩‍💻 실습: Terraform Apply

Terraform을 사용하여 AWS 리소스를 구축, 관리 및 삭제해 봅니다. 이 실습에서는 terraform apply 명령을 실행하여 HashiCat 애플리케이션 스택을 빌드합니다.

📝 챕터 3 리뷰

이 장에서 우리는:

  • Terraform 리소스에 대해 알아보았습니다.
  • Terraform 계획, 그래프, 적용 및 파괴를 실행했습니다.
  • 종속성에 대해 배웠습니다.
  • 실험실의 그래프를 보았습니다.
  • main.tf, variables.tf 및 outputs.tf를 살펴보았습니다.
  • Meow World 애플리케이션 구축

4장

AWS 인스턴스 프로비저닝 및 구성

Terraform 프로비저너 사용

Terraform을 사용하여 가상 머신이나 컨테이너를 세우고 나면 운영 체제와 애플리케이션을 구성할 수 있습니다. 프로비저너가 들어오는 곳입니다. Terraform은 Bash, Powershell, Chef, Puppet, Ansible 등을 포함한 여러 유형의 프로비저너를 지원합니다.

https://www.terraform.io/docs/provisioners/index.html

Fiel Provisioner

Terraform 파일 프로비저너는 원격 시스템에 파일을 복사합니다.

provisioner "file" {
  source        = "files/"
  destination   = "/home/${var.admin_username}/"
  connection {
    type        = "ssh"
    user        = var.username
    private_key = file(var.ssh_key)
    host        = ${self.ip}
  }
}

제공자 블록 내부의 코드 연결 블록 에 유의하십시오. 파일 프로비저너는 SSH 및 WinRM 연결을 모두 지원합니다.

Remote Run Provisioner

원격 실행 프로비저너를 사용하면 대상 호스트에서 스크립트 또는 기타 프로그램을 실행할 수 있습니다. 무인으로 실행할 수 있는 것(예: 소프트웨어 설치 프로그램)인 경우 원격 실행으로 실행할 수 있습니다.

provisioner "remote-exec" {
  inline = [
    "sudo chown -R ${var.admin_username}:${var.admin_username} /var/www/html",
    "chmod +x *.sh",
    "PLACEHOLDER=${var.placeholder} WIDTH=${var.width} HEIGHT=${var.height} PREFIX=${var.prefix} ./deploy_app.sh",
  ]
...
}

이 예제에서는 일부 권한 및 소유권을 변경하고 일부 환경 변수로 스크립트를 실행하기 위해 몇 가지 명령을 실행하고 있습니다.

Terraform 및 Configuration Tool

center

Terraform은 Chef, Puppet 또는 Ansible과 같은 일반적인 구성 관리 도구와 잘 작동합니다.

'local-exec'로 Puppet 실행:
https://www.terraform.io/docs/provisioners/local-exec.html

Terraform 및 Ansible - 더 나은 조합:
https://github.com/scarolan/ansible-terraform

Terraform Provisioner Tip

remote-exec와 같은 Terraform 프로비저너는 몇 가지 간단한 명령이나 스크립트를 실행해야 할 때 유용합니다. 보다 복잡한 구성 관리를 위해서는 Chef 또는 Ansible과 같은 도구가 필요합니다.

프로비저너는 Terraform 실행이 처음 실행될 때만 실행됩니다. 이런 의미에서 이들은 멱등성이 아닙니다. 수명이 긴 VM 또는 서버의 지속적인 상태 관리가 필요한 경우 구성 관리 도구를 사용하는 것이 좋습니다.

반면에 변경 불가능한 인프라를 원한다면 Packer 도구 사용을 고려해야 합니다.

👩‍💻 실습: 제공자, 변수 및 출력

랩의 2부에서는 프로비저너를 사용하여 새 소프트웨어 패키지를 설치합니다. 변수와 출력도 살펴보겠습니다.

📝 4장 복습

이 장에서 우리는:

  • Terraform 프로비저너에 대해 알아보기
  • 파일 및 원격 실행 프로 비저너 탐색
  • 새로운 프로비저닝 단계로 웹 서버 재구축

5장

Terraform State

Terraform State

Terraform은 상태 저장 애플리케이션 입니다. 이는 상태 파일 내부에 구축한 모든 것을 추적한다는 의미입니다 . 작업 디렉토리 안에 나타나는 terraform.tfstate 및 terraform.tfstate.backup 파일을 보았을 것입니다. 상태 파일은 Terraform이 알고 있는 모든 기록의 소스입니다.

{
  "terraform_version": "0.12.7",
  "serial": 14,
  "lineage": "452b4191-89f6-db17-a3b1-4470dcb00607",
  "outputs": {
    "catapp_url": {
      "value": "http://go-hashicat-5c0265179ccda553.workshop.aws.hashidemos.io",
      "type": "string"
    },
  }
}

Terraform Refresh

때로는 인프라가 Terraform의 제어 범위를 벗어나 변경될 수 있습니다.

상태 파일은 인프라의 마지막으로 알려진 상태를 나타냅니다. 상태 파일이 빌드한 파일과 여전히 일치하는지 확인하려면 terraform refresh 명령을 사용할 수 있습니다.

이는 인프라를 업데이트 하지 않고 단순히 상태 파일을 업데이트합니다.

terraform refresh

기존 인프라 변경

계획을 실행하거나 적용할 때마다 Terraform은 세 가지 다른 데이터 소스를 조정합니다.

  1. 코드에 작성한 내용
  2. 상태 파일
  3. 실제로 존재하는 것

Terraform은 *.tf 파일에 있는 내용을 기반으로 기존 리소스를 추가, 삭제, 변경 또는 대체하기 위해 최선을 다합니다. 다음은 계획/적용 중에 각 리소스에 발생할 수 있는 네 가지 일입니다.

+   create
-   destroy
-/+ replace
~   update in-place

Terraform 상태 퀴즈

구성 상태 현실 작업
aws_instance ???
aws_instance aws_instance ???
aws_instance aws_instance aws_instance ???
aws_instance aws_instance ???
aws_instance ???
aws_instance ???

각 시나리오에서 어떤 일이 발생합니까? 논의하다.

Terraform 상태 퀴즈

구성 상태 현실 작업
aws_instance 만들다
aws_instance aws_instance 만들다
aws_instance aws_instance aws_instance 무작동
aws_instance aws_instance 삭제
aws_instance 무작동
aws_instance 업데이트 상태

각 시나리오에서 어떤 일이 발생합니까? 논의하다.

6장

Terraform 클라우드

Terraform 클라우드


Terraform Cloud는 Terraform을 사용하여 코드형 인프라를 작성하고 구축하기 위한 최상의 워크플로우를 제공하는 무료 SaaS 애플리케이션입니다.
  • 상태 저장 및 관리
  • Terraform 실행 보기 및 승인을 위한 웹 UI
  • 개인 모듈 레지스트리
  • 버전 제어 시스템(VCS) 통합
  • CLI, API 또는 GUI 기반 작업
  • 실행 이벤트 알림
  • 자동화를 위한 전체 HTTP API

Terraform Cloud 또는 Terraform Enterprise?

Terraform Cloud 는 원격 상태 관리, API 기반 실행, 정책 관리 등과 같은 기능을 제공하는 호스팅된 애플리케이션입니다. 많은 사용자가 클라우드 기반 SaaS 솔루션을 선호하는 이유는 이를 실행하기 위한 인프라를 유지하고 싶지 않기 때문입니다.

비즈니스용 Terraform Cloud 는 Terraform Cloud와 동일한 호스팅 환경을 활용하지만 대규모 팀에 더 적합한 기능을 사용할 수 있습니다. Single Sign-On, 감사 로깅, 에이전트 를 사용하여비공개 환경에 배포하고 Run Tasks를 통해 외부 도구와 통합하는 기능.

Terraform Enterprise 는 동일한 애플리케이션이지만 자체 클라우드 환경 또는 데이터 센터에서 실행됩니다. 일부 사용자는 Terraform Cloud 애플리케이션에 대한 더 많은 제어가 필요하거나 회사 방화벽 뒤에 있는 제한된 네트워크에서 실행하기를 원합니다.

이러한 오퍼링의 기능 목록은 거의 동일합니다. 오늘 실습을 위해 Terraform Cloud 계정을 사용할 것입니다.

Terraform Remote State

기본적으로 Terraform은 랩톱 또는 워크스테이션의 작업 공간 디렉터리에 상태 파일을 저장합니다. 개발 및 실험에는 괜찮지만 프로덕션 환경에서는 상태 파일을 안전하게 보호하고 저장해야 합니다.

Terraform에는 상태 파일을 원격으로 저장하고 보호하는 옵션이 있습니다. Terraform Cloud 계정은 이제 오픈 소스 사용자에게도 무제한 상태 파일 스토리지를 제공합니다.

모든 상태 파일은 암호화되어(HashiCorp Vault 사용) Terraform Cloud 계정에 안전하게 저장됩니다. 다시는 상태 파일을 잃어버리거나 삭제하는 것에 대해 걱정할 필요가 없습니다.

Terraform 클라우드 실행 모드

  • 로컬 실행 - Terraform 명령은 노트북이나 워크스테이션에서 실행되며 모든 변수는 로컬로 구성됩니다. terraform 상태만 원격으로 저장됩니다.

  • 원격 실행 - Terraform 명령은 Terraform Cloud 컨테이너 환경에서 실행됩니다. 모든 변수는 원격 작업 공간에 저장됩니다. 코드는 Version Control System 리포지토리에 저장할 수 있습니다. 프리 티어 사용자의 동시 실행은 1회로 제한됩니다.

  • 에이전트 실행 (Enterprise 전용) - Terraform Cloud Agents를 사용하면 Terraform Cloud 및 Enterprise가 격리된 프라이빗 또는 온프레미스 인프라와 통신할 수 있습니다. 에이전트 아키텍처는 풀 기반이므로 인바운드 연결이 필요하지 않습니다. 프로비저닝하는 모든 에이전트는 작업을 위해 Terraform Cloud 또는 Enterprise를 폴링하고 해당 작업을 로컬에서 실행합니다.

👩‍💻 실습: Terraform Cloud

두 번째 실습의 마지막 부분에서는 무료 Terraform Cloud 계정을 만들고 상태 파일의 원격 저장소를 활성화합니다.

축하합니다. 워크숍을 완료했습니다!

center

# 슬라이드 데크 <center>자신의 컴퓨터에서 다음 링크를 따라 가십시오.<center> https://git.io/JerH6 ---

# 왜 Terraform인가? ![center width:900px height:500px](./images/1password_terraform.png) https://blog.1password.com/terraforming-1password/ ---

# 👩‍💻 Instruqt 시작하기 Instruqt 는 HashiCorp 교육 플랫폼입니다. 짧은 자습서를 보려면 아래 링크를 방문하십시오. Instruqt에 이미 익숙하다면 다음 슬라이드로 건너뛸 수 있습니다. https://instruqt.com/instruqt/tracks/getting-started-with-instruqt ---

강사가 실습 환경의 URL을 제공합니다. 🛑 두 번째 퀴즈를 완료한 후 중지합니다.

🛑 세 번째 퀴즈를 완료한 후 중지합니다.

교육 랩으로 돌아가 중단한 부분부터 계속합니다. 🛑 네 번째 퀴즈를 완료한 후 중지합니다.

교육 랩으로 돌아가 중단한 부분부터 계속합니다.