이 문서는 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
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
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
Add Comment