# output.tf
output "private_ip" {
value = aws_instance.default.private_ip
}
# main.tf 부모 모듈
provider "aws" {
region = "ap-southeast-1"
}
provider "aws" {
alias = "seoul"
region = "ap-northeast-2"
}
module "ec2_singapore" {
source = "../modules/terraform-aws-ec2"
}
module "ec2_seoul" {
source = "../modules/terraform-aws-ec2"
providers = {
aws = aws.seoul // 다른 프로바이더 지정
}
instance_type = "t3.small"
}
# output.tf
output "module_output_singapore" {
value = module.ec2_singapore.private_ip
}
output "module_output_seoul" {
value = module.ec2_seoul.private_ip
}
모듈마다 다른 프로바이더 설정을 해주더라도 정상적으로 동작하는 것을 확인 할 수 있다.
B. [실습] 모듈의 반복문
모듈 또한 반복문을 사용해서 원하는 수량을 프로비져닝 할 수 있다.
모듈 없이 구성하는 것에 대비해 리소스 종속성 관리와 유지보수에 큰 도움이 된다.
provider "aws" {
region = "ap-northeast-2"
}
module "ec2_seoul" {
count = 2 // 카운트로 2개 생성
source = "../modules/terraform-aws-ec2"
instance_type = "t3.small"
}
output "module_output" {
value = module.ec2_seoul[*].private_ip
}
일관된 구조일때는, count를 사용하지만, 필요한 인수값이 다른 경우는 for_each를 활용하면 된다.
해당 tf 구문을 실행하면 다음과 같은 결과를 얻을 수 있다.
locals { // 원하는 다른 인수값에 따른 선언을 해주면 된다.
env = {
dev = {
type = "t3.micro"
name = "dev_ec2"
}
prod = {
type = "t3.medium"
name = "prod_ec2"
}
}
}
module "ec2_seoul" {
for_each = local.env
source = "../modules/terraform-aws-ec2"
instance_type = each.value.type
instance_name = each.value.name
}
output "module_output" {
value = [
for k in module.ec2_seoul: k.private_ip
]
}
이 외에도 Terraform cloud 와 terraform enterprise와 같은 비공개 테라폼 모듈을 사용할 수 있다.
module "vpc" {
source = "terraform-aws-modules/vpc/aws" // 네임스페이스/이름/프로바이더 형태
version = "5.1.0"
}
d. 깃허브를 경로 지정하기
# main.tf // github repository에 저장할 tf 파일
provider "aws" {
region = "ap-southeast-1"
}
module "ec2_seoul" {
source = "github.com/jivebreaddev/terraform-module-repo/terraform-aws-ec2"
instance_type = "t3.small"
}
이렇게 github에서 가져오게 된다.
e. 이러한 모듈을 사용하는 이유는 무엇일까?
이미 생성된 천줄 이상 복잡한 구성을 논리적으로 구성 요소화 가능합니다.
별개의 논리적 구성 요소로 캡슐화가 가능합니다.
잘 작성된 모듈을 재사용 할 수 있습니다.
일관성이 있습니다.
f. [실습] 다른 모듈을 가져와서 사용하기
git clone https://github.com/hashicorp/learn-terraform-modules-use.git
cd learn-terraform-modules-use
- terraform.tf : 테라폼 블록 확인
- main.tf : 모듈 블록 확인(모듈 소스, 버전) - arguments 확인 , ec2 count 2 확인
다음과 같은 리소스의 input 섹션에서 어떻게 리소스를 생성할지 알 수 있습니다.
input variable들을 variable.tf 에서 확인하고 수정해서 사용하면 됩니다.
저같은 경우에는
variable "vpc_enable_nat_gateway" {
description = "Enable NAT gateway for VPC"
type = bool
default = false
}
variable "vpc_azs" {
description = "Availability zones for VPC"
type = list(string)
default = ["ap-northeast-2c"]
}
provider "aws" {
region = "ap-northeast-2c"
default_tags {
tags = {
hashicorp-learn = "module-use"
}
}
}
# 프로바이더 위치랑 리소스 위치를 전부 변경해줬습니다.
cat .terraform/modules/modules.json| jq 해당 커맨드로 init 이후 모듈 구조도 확인 가능합니다.
다음과 같이 리소스들이 정상 삭제가 되는것을 확인할 수 있습니다.
ec2의 버전이 낮아서 해당 부분은 최신버전으로 변경해서 진행했습니다.
2. Terraform Runner
2.1 Atlantis
Atlantis는 Terraform을 관리하기 위한 runner 이자 workflow로 다음과 같은 플로우로 관리됩니다.
Github으로 PR 이 MERGE가 됩니다.
WEB HOOK을 ATLANTIS로 전송하고
PLAN 결과를 PR 코멘트에 등록합니다.
PR comment에 apply 하게 되면 web hook이 atlantis로 전송됩니다.
apply 의 결과가 github에 전시됩니다.
편한 방법으로 개발자들의 리뷰를 통한 리소스 할당과 설정이 가능합니다.
2.2 설치 관련 주의점
주의점
Locking 에 대한 이해를 정확히 해야한다.
Security에 대해서 취약한 지점을 정확히 알고 대비해둬야한다.
알아야 하는 전략들
atlantis. 설정 파일
pre workflow hook의 shell 보안 취약 주의
post workflow hook 도 확인가능하다.
prometheus로 메트릭 수집이 가능하다.
slack 알람 설정도 hook 설정 가능하다.
2.3 [실습] 직접 설치하고 자원 배포해보기
a. aws ec2 생성
EC2에 다음 스크립트를 돌리면 설정이 된다.
AWS CONFIGURE도 설정해주면 된다.
외부 통신도 가능해야하니깐, 해당 EC2 의 OUTBOUND도 확인해주면 된다.
4141 TCP 통신을 위해 포트 오픈도 해둬야 GITHUB 과 ATLANTIS의 웹훅 통신이 가능하다.