Terraform Cloud Architecture : AWS EC2 on Brainboard

MZC_Global
Cloud Villains
Published in
19 min readOct 20, 2023

--

개요

저는 Terraform을 주로 신속하게 환경을 구축 할 수 있도록 Template를 만들고 저장할 때에 이용 합니다. 하지만 템플릿이 많아짐에 따라 관리에 대해 고민하게 되었습니다. 예를 들어 코드를 작성해도 Cloud 구성 검토하는 것을 잊거나 코드를 읽고 이해하는 데에 시간이 낭비되고 있는 것 같았습니다. 그래서 Terraform을 시각화하기 위해 Graph Command를 사용했지만 코드가 증가함에 따라 시각화가 어려운 경우도 있었습니다. (이건 취향에 따른 문제도 있을 것 같긴 합니다) 이러한 경험을 통해 Terraform Visualize등으로 검색하였는데, 그러던 중 Brainboard 라는 도구를 우연히 발견했습니다.

Brainboard란?

Brainboard는 2019년에 출시되었고, 프랑스 기업에서 제공하는 도구입니다. 이 도구는 엔지니어가 Cloud Infra를 시각적으로 설계하고 관리할 수 있는 공동 작업 솔루션으로 그 특징은 다음과 같습니다.

  • Brainboard는 한 번의 작업으로 시각적이고 직관적인 솔루션을 제공합니다.
  • Multi Cloud를 지원합니다.
  • Cloud Architecture를 효율적으로 구축하고 유지할 수 있습니다.
  • 사내 표준을 수립하고 유지하고 Best Practice 기반 프로세스를 단순화하는 데 도움이 됩니다.

Diagram만으로 어디까지 관리할 수 있는지 궁금해서 시험삼아 확인 해 보았는데요, 보안 및 요금 플랜을 확인한 결과 문제는 없는 것 같습니다. 보안에 관해서는, SOC2(※)를 취득하고 있고, 요금은 Pro 플랜으로 21일간 무료로 사용할 수 있었습니다.

※ SOC2를 간단히 설명하면 Cloud Provider 등의 조직이 고객 데이터를 안전하게 관리하고 있는지 여부 등의 보안 체제(내부 통제)를 ‘Trust 서비스 원칙과 표준’이라는 기준에 따라 평가하고 보증 하기 위한 틀이나 평가 내용을 정리한 보증 보고서입니다. SOC2는 일정 기간(반년 이상)에 걸쳐 내부 통제가 적절히 운영되고 있음을 보장합니다.

Hands-on

다음의 간단한 AWS EC2 구성을 Brainboard를 이용하여 Cloud Architecture 생성, Terraform Code 자동 생성, Terraform Plan/Apply/Destroy까지 진행 해 보도록 하겠습니다.

설명의 흐름은 각 Resource의 절차를 설명드린 후, Brainboard 작업과 관련된 부분을 보충 설명 하도록 하겠습니다. (동일한 내용은 생략합니다.)

Top Page

먼저 Brainboard에 Login하면 다음과 같은 Top Page로 이동합니다.
AWS Template 생성 절차는 다음과 같습니다.

① Cloud 선택란에서 AWS를 선택합니다.

② New Architecture를 클릭합니다.

③ Template, Blank, Import의 Modal이 나타나면, Blank를 선택합니다.

④ Architecture Name을 입력 하고 이하의 CREATE 버튼을 클릭합니다.

AWS EC2 구성도 생성

Region

Region 생성 순서는 다음과 같습니다.

① 왼쪽 사이드 메뉴에서 AZ를 선택합니다.
② ①의 Resource를 Drag합니다.
③ Region: Tokyo로 설정합니다.

Resource를 Drag하고 오른쪽 사이드 메뉴에 나타나는 항목은 Terraform 각 Resource의 Options가 됩니다. 또한 해당 항목에 입력하면 자동 저장됩니다.

VPC

VPC 생성 절차는 다음과 같습니다.

① 왼쪽 사이드 메뉴에서 VPC를 선택하고 Template에 Drag합니다.
② Resource name : main (eg Terraform code resource name)
③ Advanced configuration > Cidr Block : var.vpc_cidr (이 변수명은 Variables & localls에 자동 생성됩니다.)

VPC의 변수 생성 절차는 다음과 같습니다.

① 왼쪽 사이드 메뉴에서 Variables를 선택하면 Variables & localals Modal이 나타납니다.
② vpc_cidr을 선택합니다.
③ type : String
④ default : “10.0.0.0/16”
⑤ UPDATE 버튼을 클릭합니다.

VPC와 변수까지 설정할 수 있으며, Template로 돌아가서 오른쪽의 작은 화살표를 클릭하면 Terraform Code를 확인 할 수 있습니다.
참고로 Tags는 이전의 Variables & locals Modal에서 자동으로 생성되며 수정이 가능하지만 Terraform Code는 Read Only입니다.

이와 같이 대상의 Resource를 Template에 Drag하고 Options와 변수를 설정하면 Terraform Code가 자동 생성되는 구조를 이해할 수 있을 것입니다.

Internet Gateway

IGW 작성 절차는 다음과 같습니다.

① IGW를 Template로 Drag합니다.
② Resource name : main
③ Advanced configuration > Vpc id : aws_vpc.main.id

그러면 VPC와 마찬가지로 Terraform Code도 확인할 수 있습니다.

Availability Zone

AZ를 만드는 절차는 다음과 같습니다.

① AZ를 Template로 Drag합니다.
② Advanced configuration > Availability Zone : ap-northeast-1a (Region내에 Drag하면 Region은 마음대로 설정됩니다.)

Subnet

Subnet을 만드는 절차는 다음과 같습니다.

① Subnet을 Template로 Drag합니다.
② Resource name : main
③ Vpc id : aws_vpc.main.id
④ Advanced configuration > Availability Zone : ap-northeast-1a
⑤ Advanced configuration > Cidr Block : var.sb_cidr

Subnet의 변수 작성 순서는 다음과 같습니다.

① sb_cidr 선택합니다.
② type : String
③ default : “10.0.10.0/24”
④ UPDATE 버튼을 클릭합니다.

Subnet Terraform Code가 생성되었습니다.

Route Table

Route Table을 만드는 절차는 다음과 같습니다.

① Route Table을 Template로 Drag합니다.
② Resource name : main
③ Vpc id : aws_vpc.main.id
④ Advanced configuration > Cidr Block : var.rt_cidr
⑤ Advanced configuration > Gateway id : aws_internet_gateway.main.id

Route Table의 변수 작성 순서는 다음과 같습니다.

① rt_cidr 선택합니다.
② type : String
③ default : “10.0.10.0/24”
④ UPDATE 버튼을 클릭합니다.

Route Table Association을 만드는 절차는 다음과 같습니다.

① Route Table Association을 Template로 Drag합니다.

② Resource name : main
③ Route Table id : aws_route_table.main.id
④ Advanced configuration > Subnet id : aws_subnet.main.id

Route Table Association까지 설정했으므로 Terraform Code를 확인합니다.

Security Group

Security Group을 생성하는 절차는 다음과 같습니다.

① Security Group을 Template로 Drag합니다.
② Resource name : main
③ Advanced configuration > Vpc id : aws_vpc.main.id

계속하여 Options에서 다음과 같이 Egress와 Ingress를 설정합니다.

④ Advanced configuration > Egress > Cidr Blocks : “0.0.0.0/0”
⑤ Advanced configuration > Egress > From Port : 0
⑥ Advanced configuration > Egress > Protocol : “-1”
⑦ Advanced configuration > Egress > To Port : 0
⑧ configuration > Ingress > Cidr Blocks : “0.0.0.0/0”
⑨ Advanced configuration > Ingress > From Port : 80
⑩ Advanced configuration > Ingress > Protocol : “tcp”
⑪ Advanced configuration > Ingress > To Port : 80
⑫ Advanced > Cidr Blocks : “0.0.0.0/0”
⑬ Advanced configuration > Ingress > From Port : 22
⑭ Advanced configuration > Ingress > Protocol : “tcp”
⑮ Advanced configuration > Ingress > To Port : 22

Security Group의 Terraform Code를 검토합니다.

추가로, Drag하여 Template를 조정하는 것도 가능합니다.

Key Pair

Key Pair의 생성 순서는 다음과 같습니다.

① Key Pair를 Template로 Drag합니다.
② Resource name : main
③ Public Key : var.pub_key (Local에서 SSH Key 생성 해 둡니다.)
④ Advanced configuration > Key Name : var.key_name

③, ④는 위에서 했듯이 Variables&locals에서 각 Type과 Default를 입력해 주세요.

EC2

EC2 생성 절차는 다음과 같습니다.

① EC2(t2)를 Template로 Drag합니다.

계속해서 Options에서 다음과 같이 설정합니다.

② Resource name : main
③ Advanced configuration > Ami : var.ami (eg “ami-04a735b489d2a0320”)
④ Advanced configuration > Associate Public Ip Address : TRUE
⑤ Advanced configuration > Key Name : var.key_ce
⑥ Advanced configuration > Instance Type : t2.micro
⑦ Advanced configuration > Security Groups : aws_security_group.main.id
⑧ Advanced configuration > Subnet id : aws_subnet.main.id
⑨ Extra Attributes > Depends On : aws_key_pair.main.id

EC2 Terraform Code도 확인해 봅시다.

EIP

EIP 생성 절차는 다음과 같습니다.

① DIP를 Template로 드래그합니다.
② Resource name : main
③ Advanced configuration > instance : aws_instance.main.id

Terraform Code

여기까지 Brainboard를 사용하여 생성한 AWS EC2의 구성도입니다. 이 구성도를 생성함으로 인하여 Terraform Code 생성이 매우 간단해졌습니다. 또한 Terraform 초보자도 사용하기 쉬운 도구라고 생각됩니다.

resource "aws_vpc" "main" {
tags = merge(var.tags, {})
cidr_block = var.vpc_cidr
}

resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = merge(var.tags, {})
}

resource "aws_subnet" "main" {
vpc_id = aws_vpc.main.id
tags = merge(var.tags, {})
cidr_block = var.sb_cidr
availability_zone = "ap-northeast-1a"
}

resource "aws_route_table" "main" {
vpc_id = aws_vpc.main.id
tags = merge(var.tags, {})

route {
gateway_id = aws_internet_gateway.main.id
cidr_block = var.rt_cidr
}
}

resource "aws_route_table_association" "main" {
subnet_id = aws_subnet.main.id
route_table_id = aws_route_table.main.id
}

resource "aws_security_group" "main" {
vpc_id = aws_vpc.main.id
tags = merge(var.tags, {})

egress {
to_port = 0
protocol = "-1"
from_port = 0
cidr_blocks = [
"0.0.0.0/0",
]
}

ingress {
to_port = 80
protocol = "tcp"
from_port = 80
cidr_blocks = [
"0.0.0.0/0",
]
}
ingress {
to_port = 22
protocol = "tcp"
from_port = 22
cidr_blocks = [
"0.0.0.0/0",
]
}
}

resource "aws_key_pair" "main" {
tags = merge(var.tags, {})
public_key = var.pub_key
key_name = var.key_name
}

resource "aws_instance" "main" {
tags = merge(var.tags, {})
subnet_id = aws_subnet.main.id
key_name = var.key_name
instance_type = "t2.micro"
availability_zone = "ap-northeast-1a"
associate_public_ip_address = true
ami = var.ami

depends_on = [
aws_key_pair.main,
]

security_groups = [
aws_security_group.main.id,
]
}

resource "aws_eip" "main" {
vpc = true
tags = merge(var.tags, {})
instance = aws_instance.main.id
}

AWS EC2 Deploy

Terraform Code가 완성되었기때문에 Terraform deploy까지 해보겠습니다.
그 전에 Cloud Provider를 설정해야 합니다.

Cloud Provider 설정

Cloud Provider 설정 페이지로 이동하는 방법은 다음과 같습니다.

① 오른쪽 상단의 계정을 클릭합니다.
② Cloud Providers를 클릭합니다.

AWS Credentials 설정 절차는 다음과 같습니다.

① AWS를 선택하고 + 버튼을 클릭합니다.
② Modal에 있는 NAME, AWS ACCESS KEY ID, AWS SECRET ACCESS KEY를 입력하고 SUBMIT을 클릭합니다.

이제 Cloud Provider 설정을 완료했으므로 Terraform Command를 실행 해 보겠습니다.

Terraform Plan

Template의 Terraform이 표시되는 부분에 있는 Plan 버튼을 클릭합니다. 그러면 Local에서 Command를 실행하는 것처럼 Plan 결과가 표시됩니다.
참고로 무료 플랜의 경우, tfstate의 관리는 Brainboard의 백엔드에서 이루어집니다. S3 등으로 관리하려는 경우 플랜을 변경해야 합니다.

Terraform Apply

Terraform Plan이 문제없이 움직이기 때문에 Terraform Apply하여 AWS에 Deploy해 보겠습니다.

Deploy가 완료되었습니다. AWS 콘솔에 들어가서 EC2를 확인하면 제대로 배포할 수 있는지 확인 할 수 있습니다.

SSH 연결도 확인 가능합니다.

Brainboard에서 생성된 Terraform Code로 Deploy 할 수 있는 곳까지 확인하였으므로, 다음으로는 Destroy를 해 보겠습니다.

Terraform Destroy

Destroy 버튼을 클릭하여 AWS Resource를 삭제합니다.

EC2가 Terminated로 되어있는지도 확인할 수 있습니다.

그 외기능

이번에는 간단한 Cloud Architecture를 만들어 Deploy를 수행했지만, 그 외에도 다양한 기능이 있었습니다. 무료 플랜이어서 세세한 부분까지는 확인할 수 없었지만, 간단하게 설명하면 이하의 기능이 가능 한 것 같습니다.

  • 프로젝트 관리

Multi Cloud Architecture의 버전 관리

멤버 관리(RBAC)

  • Pull Request

Azure Devops, Bitbucket, Gitlab에 Pull Request 가능

  • CI/CD Design

YAML 지식이 없어도 파이프 라인을 시각화 할 수 있습니다.

  • Terraform

*.tf files 자동 생성

Module, Cloud Architecture의 버전 관리

Import 가능

Import는 한번 해 보고 싶어져서, 방금 생성된 Terraform Code를 이용 하여 Import해 보았습니다.

아래 그림의 위는 Hands-on에서 만든 Architecture이고, 아래쪽은 Import한 것입니다. Terraform에 있는 Resource는 어느 정도 생성 된 것 같지만, 역시 세세한 연결 부분까지는 이해하기 어렵다고 느꼈습니다. Import 할 때는 조정이 필요하다 생각되네요.

Template생성한 것

Import한 것

마지막으로

IT 업계에서는 Front-End, Back-End, Cloud Infra 등 다양한 팀과 협력하면서 커뮤니케이션 오해와 같은 문제로 진행이 멈추는 경우도 있습니다. 예를 들어, API에 관한 최신 문서가 필요한 경우, 다수의 Microservice 문서를 어떻게 관리하고 제공하는지 등이 있을 수 있습니다. 텍스트 파일을 만들 때 YAML보다 Markdown이 더 오래 걸린다거나, IaC를 만드는 것보다 Architecture를 만드는 것이 더 오래 걸릴 수 있습니다. 문서가 최신버전이 아니라면, 전체의 효율이 저하되는 일도 있고, 복잡한 Architecture 문서화는 영원한 도전 과제 중 하나일 수 있습니다.

Brainboard 도구는 Diagram as Code를 구현합니다. 종이에 Architecture를 그린 것과 같은 시각화, 관리 및 Terraform Code를 자동 생성할 수 있습니다. 이를 통해 정보를 최신 상태로 팀 구성원에게 제공하고 Architecture에 집중할 수 있습니다. 하지만 IaC의 출력은 Terraform만 지원하므로 예를 들어 Azure 사용자가 Bicep를 원하는 경우 도구를 사용할 수 없다는 단점도 있습니다.

개인적으로는 매우 흥미로운 툴이라고 생각하고, 업무에 활용할 수 있는 경우가 생긴다면 이 툴을 사용해 보고자 합니다.

지금까지 Brainboard에 관한 게시글 이었습니다. 읽어주셔서 감사드립니다.

원문게시글 : https://zenn.dev/megazone_japan/articles/311faef395881d

메가존 일본 법인 블로그에 업로드 중인 게시글로 작성자 정재윤님의 동의를 얻어 번역한 게시글 입니다.

번역 : 메가존클라우드 Cloud Techonolgy Center 박지은 매니저

--

--

MZC_Global
Cloud Villains

A blog post will be posted from the global branch of MegazoneCloud