Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Current »


이 문서는 https://learn.hashicorp.com/terraform/  자료를 기반으로 간단히 만든 문서입니다.

Terraform 이 무엇인가요?

https://www.hashicorp.com/products/terraform : Provision any infrastructure for any application

https://www.terraform.io/intro/index.html : Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions.


클라우드 뿐만 아니라 다양한 인프라스트럭처 리소스를 지원합니다.

https://www.terraform.io/docs/providers/


실습하기 : https://learn.hashicorp.com/terraform/ 

Getting Started

Terraform 설치

https://www.terraform.io/downloads.html 에서 OS에 맞는 파일 다운로드 (zip 파일) 하고 PATH 설정

mac 에서 brew로 설치 가능

brew install terraform

terraform 버전이 다른 경우 실행을 할 때 에러가 날 수 있음. 해당 provider 의 릴리즈 노트를 참고해야 하는 경우도 있음. 

빌드 인프라스트럭처

AWS 환경설정

terraform에서 AWS credentials(access_key, secret_key)를 설정하지 않으면 terraform에서는 자동으로  ~/.aws/credentials 등의 디렉토리에서 API credentails를 찾거나 IAM instance profile credentials 에서 찾는다. Terraform 코드에서 IAM credentials를 저장하지 않는 것이 보안상으로 안전하다.

https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws-access-keys-best-practices.html


여러 개의  AWS Account  를 가지고 있는 경우  Named Profiles 를 이용하면 편리하다.

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-profiles.html


aws cli 를 설치하여 정상 작동하는지 확인을 한다. 

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-install.html

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-configure.html


example.tf 

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

resource "aws_instance" "example" {
  ami           = "ami-a414b9ca" # Canonical, Ubuntu, 16.04 LTS, amd64 xenial image build on 2018-03-06
  instance_type = "t2.micro"

  tags = {
    Name = "your_name"
    Owner = "your_name"
    Environment = "staging"
  }
}

terraform init

terraform plan

terraform apply

terraform show


terraform.tfstate : terraform 을 통해서 생성한 리소스 기록을 하고 있음. terraform 을 실행할 때 함께 있어야 하며 remote state 설정을 하여 원격에 둘 수도 있다.


provisioning : ec2 instance 올린 후 스크립트 실행 등

변경 인프라스트럭처

소스 변경 후 terraform apply

삭제

terraform destroy

리소스 의존성

example.tf 에 다음 코드 추가하고 terraform 실행하

resource "aws_eip" "ip" {
  instance = "${aws_instance.example.id}"
}


명시적/비명시적 의존성

depends_on argument

# New resource for the S3 bucket our application will use.
resource "aws_s3_bucket" "example" {
  # NOTE: S3 bucket names must be unique across _all_ AWS accounts, so
  # this name must be changed before applying this example to avoid naming
  # conflicts.
  bucket = "terraform-getting-started-guide"
  acl    = "private"
}

# Change the aws_instance we declared earlier to now include "depends_on"
resource "aws_instance" "example" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"

  # Tells Terraform that this EC2 instance must be created only after the
  # S3 bucket has been created.
  depends_on = ["aws_s3_bucket.example"]
}


Provision

instance 올리고 초기화 작업. provisioner를 통해 파일 업로드, 쉘스크립트 실행, 소프트웨어 설치 등 작업 진행할 수 있음

여러 개의 provisioner 블락을 지원함. (chef, local-exec, remote-exec, salt-masterless). salt, ansible 연동 등. https://www.terraform.io/docs/provisioners/index.html

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

resource "aws_instance" "example" {
  ami           = "ami-a414b9ca" # Canonical, Ubuntu, 16.04 LTS, amd64 xenial image build on 2018-03-06
  instance_type = "t2.micro"

  provisioner "local-exec" {
    command = "echo ${aws_instance.example.public_ip} > ip_address.txt"
  }

  tags = {
    Name = "your_name"
    Owner = "your_name"
    Environment = "staging"
  }
}

Input 변수

variables.tf  파일에 다음의 내용을 담는다.

variable "region" {
  default = "ap-northeast-2"
}


example.tf 에서 region 설정을 변경한다.

provider "aws" {
  region     = "${var.region}"
}


변수할당하기 : 커맨드 라인 플래그, 파일, 환경변수(TF_VAR_name), UI input. default 를 설정한 경우 기본값 사용.


Lists

# implicitly by using brackets [...]
variable "cidrs" { default = [] }

# explicitly
variable "cidrs" { type = "list" }


Maps

variable "amis" {
  type = "map"
  default = {
    "us-east-1" = "ami-b374d5a5"
    "us-west-2" = "ami-4b32be2b"
  }
}

resource "aws_instance" "example" {
  ami           = "${lookup(var.amis, var.region)}"
  instance_type = "t2.micro"
}


Output 변수

리소스의 다양한 속성값이 있다. 그중 필요한 값을 출력할 수 있다. terraform apply 를 호출할 때 출력이 되고 terraform output 명령을 통해서도 질의할 수 있다.

*.tf 파일에 다음 내용 추가하고 확인. (terraform output ip)

output "ip" { value = "${aws_eip.ip.public_ip}" }


Modules

지금까지는 Terraform 설정을 직접 수정하여 작업을 하였다. 인프라스트럭처가 커짐에 따라서 여러가지 문제가 발생한다. 조직화의 부족, 재사용성 부족, 티 차원에서의 관리가 힘든 것 등. 


Terraform Modules 는 그룹으로 관리할 수 있는 테라폼 설정을 담은 패키지이다. Modules는 재사용 가능한 컴포넌트 생성, 조직화 개선, 인프라스터럭쳐를 블랙 박스로 취급하는데 사용을 한다.


Terraform Registry https://registry.terraform.io/browse?provider=aws


source, version


Terraform Remote

지금까지는 로컬 컴퓨터에서 인프라스트럭쳐를 만들고 생성하였다. 실환경에서는 인프라스트럭쳐 관리에 대한 책임을 공유할 필요가 있다. 가장 좋은 방법은 state 를 공유해서 접근할 수 있는 원격 환경에서  Terraform 을 실행하는 것이다. 

Terraform  은 remote backends 라고 알려진 티 기반의 워크플로우를 지원한다.  remote backends를 통해 Terraform 에서 state 데이터를 위한 공유 스토리지를 사용한다. 그래서 Terraform 을 함께 사용하는 팀원들이 동일한 인프라스트럭쳐를 관리할 수 있다.

지원하는 backends는 s3, consul 등이 있다.  consul 은 state storage, locking, environments 를 지원하며 s3는 state storage만 지원한다.

terraform {
  backend "consul" {
    address = "demo.consul.io"
    path    = "getting-started-RANDOMSTRING"
    lock    = false
  }
}

Next Steps

Documentation

Examples

Import : 현재 있는 인프라스트럭쳐를 terraform 으로 가져오는 방법. 현재는 오직 리스소를 state 파일로만 임포트하는 것만 가능하며 설정 파일은 직접 만들어야 한다. A future version of Terraform will also generate configuration.

Advanced Tracks

Developer

자동으로 Terraform 실행하기

커스텀 providers 만들기

Operations

Terraform으로 여러 개의 환경(Environments) 관리하기 : remote state, workspaces, sensitive data

 Packer 이미지 활용

AWS Provider

AWS EKS Introduction

AWS IAM Policy Documents

Serverless Applications with AWS Lambda and API Gateway

참고자료

책 : terraform up and running  https://www.terraformupandrunning.com/ https://github.com/brikis98/terraform-up-and-running-code

  • No labels