Judaeng
Terraform Up & Running (3) - 테라폼 시작하기 본문
위 제목의 책을 통해 테라폼의 기본 개념, 정의 등을 공부하고 설치에서 운영까지 알아보자.
테라폼은 배우기 쉬운 도구라고 한다.
테라폼 명령어를 통해 서버, 트래픽 로드 밸런서(loadbalancer)등의 클러스터를 구성하는 법을 파악한다고 한다.
또한, 이번 실습에서 다룰 인프라를 통해서 확장성과 고가용성을 갖는 웹 서비스와 마이크로서비스를 알아보자.
테라폼은 아마존 웹 서비스, 마이크로소프트 애저, 구글 클라우드, 디지털오션(Digital Ocean)등 잘 알려진 공용 클라우드 공급자뿐 아니라 오픈스택, VM웨어 등의 사설 클라우드와 가상화 플랫폼도 지원한다.
이후에 코드 예제는 아마존 웹 서비스에서 사용할 예정이다.
테라폼을 학습하는 데는 아마존 웹 서비스가 가장 좋은 선택지라고 한다.
이유는 아래 설명한다.
아마존 웹 서비스는 시장에서 가장 대중적인 퍼블릭 클라우드 공급자이며, 다른 클라우드 공급자(마이크로소프트, 구글, IBM)의 규모보다 더 크다고 한다.
아마존 웹 서비스는 EC2(Elastic Compute Cloud)처럼 신뢰성 있고 확장성 있는 다양한 서비스들을 제공하며, ASG(Auto Scaling Group)처럼 가상 서버의 클러스터를 손쉽게 관리할 수 있도록 한다.
또한, ELB(Elastic Load Balancer)를 통해 가상 서버의 클러스터에 트래픽 부하를 분산시키는 서비스도 제공한다
아마존 웹 서비스는 프리 티어(free tier)(https://aws.amazon.com/free/)를 제공하며, 이 책에서 다루는 예제 역시 프리 티어로 사용할 수 있다.
만약 프리 티어를 이미 사용하였다면 예제를 따라 하기 위해 약간의 비용이 발생한다고 한다.
아직 아마존 웹 서비스 계정이 없거나 테라폼을 사용해 보지 않았다 하더라도 걱정할 필요는 없다.
아래 순서대로 사전 작업부터 실제 실습까지 따라 하면 된다.
1. 아마존 웹 서비스 계정 설정하기
2. 테라폼 설치하기
3. 단일 서버 배포하기
4. 단일 웹 서버 배포하기
5. 설정 가능한 웹 서버 배포하기
6. 웹 서버 클러스터 구성하기
7. 로드 밸런서 배포하기
8. 정리
아마존 웹 서비스 계정 설정하기
만약 아직 아마존 웹 서비스 계정이 없다면 여기를 들어가 가입하고 처음이라면 루트 사용자(root user)로 로그인된다.
이 사용자 계정은 모든 것을 할 수 있는 권한을 가지므로 보안 관점에서 보면 루트 사용자를 사용하는 것이 매우 좋지 않다.
그러므로 제한된 사용 권한을 갖는 다른 사용자 계정을 만들고 해당 계정으로 접속하게 해야 한다.
예상치 못한 비용이 발생되는 것을 방지하기 위해 비용에 대한 알람을 설정해 놓도록 한다.
제한된 사용자 계정을 만들기 위해서는 IAM(사용자 액세스 및 암호화 키 관리, Identity and Access Management)을 사용해야 한다.
IAM 사용자 계정뿐 아니라 사용자에게 권한을 부여할 수도 있다.
새로운 IAM 사용자를 생성하려면 IAM 콘솔(여기)로 들어가 '사용자'를 클릭하고 새로운 사용자를 만들기 위해 파란색의 '새로운 사용자'버튼을 클릭한다.
그 후에 사용자 이름을 입력하고, 아마존 웹 서비스 액세스 유형으로 '프로그래밍 방식 액세스'를 선택한다.
- (내 생각) 위 책의 내용과 다르다, 당황하지 말고 비슷하게 따라가보도록하자.
'다음: 권한' 버튼을 클릭하면 추가할 사용자에 대한 권한을 설정할 수 있다.
이 부분은 사용자를 생성 완료한 다음 부여할 예정이기 때문에 아래와 같이 지금은 아무 것도 선택하지 않고 바로 '다음: 태그' 버튼을 클릭한다.
태그에 대한 부분도 별도의 설정을 추가하지 않고 바로 '다음: 검토'버튼을 클릭한다.
- (내 생각) 태그라는 부분도 없다.
2023.07.05 (수정)
위에 프로그래밍 방식 액세스가 없고 IAM 만들기를 한다면, AWS Management Console에 대한 사용자 액세스 권한 제공은 주지 않아도 된다.
콘솔에서 EC2를 직접 만들 수 있는 권한을 안준다고 생각하면 된다.
하지만 나는 권한을 주었다.🤪
이후 검토 단계 화면에서 아직 사용자에게 권한을 부여하지 않았기 때문에 '이 사용자에게는 권한이 없습니다.'라는 경고 메세지를 아래 그림처럼 볼 수 있다.
- (내 생각) 그런 경고가 뜨지 않는다, 설정이 잘못된 것일수도 있다. 일단 따라해본다.
- (내 생각) 태그 설정은 여기로 옮겨진 모양이다.
사용자 생성 후에 권한 부여를 진행할 예정이므로 바로 '사용자 만들기' 버튼을 클릭해 사용자를 생성하면 아래 그림과 같이 해당 사용자의 보안 자격 증명을 보여준다.
이 자격 증명은 액세스 키 ID와 비밀 액세스 키로 구성된다.
이 키는 다시 표시되지 않으므로, CSV로 내려받거나 복사한 후 즉시 안전한 곳(예: 1Password, LastPass 또는 macOS 키 체인 액세스 같은 암호 관리자)에 보관해야 한다고 한다.
- (내 생각) 닫기는 없고 '사용자 목록으로 돌아가기' 버튼이 존재한다.
자격 증명을 저장했으면 '닫기' 버튼을 클릭한다.
IAM 사용자 목록에 방금 생성된 사용자를 확인할 수 있으며, 해당 사용자 이름을 클릭한 후 아래 그림과 같이 '권한' 탭을 확인한다.
아직 만들어진 새 IAM 사용자는 권한이 없으므로 아마존 웹 서비스 계정에서는 아무것도 할 수 없다고한다.
IAM 사용자에게 수행할 수 있는 권한을 부여하기 위해서는 하나 이상의 IAM 정책(policy)을 해당 사용자의 계정에 추가해야 한다.
IAM 정책은 다음과 같은 JSON 문서이며, 사용자가 수행할 수 있는 작업과 허용되지 않는 작업을 정의한다.
직접 IAM 정책을 만들거나 기존(관리되는) IAM 정책을 사용할 수 있다.
이 책의 예제를 실행하기 위해서는 아래처럼 IAM 사용자에게 다음과 같이 기존 정책을 직접 추가(연결)해야 한다고 한다.
1. AmazonEC2FullAccess
2. AmazonS3FullAccess
3. AmazonDynamoDBFullAccess
4. AmazonRDSFullAccess
5. CloudWatchFullAccess
6. IAMFullAccess
- (내 생각) 권한 추가 버튼을 눌러주자
기본(Default) VPC
기존 아마존 웹 서비스 계정을 사용하는 경우 기본의 가상 사설 클라우드(VPC, Virtual Private Cloud)가 존재하며, 이것은 아마존 웹 서비스 계정의 격리된 영역이자 자체 가상 네트워크 및 IP 주소 공간이다.
거의 모든 리소스가 VPC 상에 배포되며, VPC를 명시적으로 지정하지 않으면 리소스가 기본 VPC에 배치된다.
이 책의 모든 예제는 기본 VPC를 사용하며, 기본 VPC를 삭제한 경우 VPC 콘솔에서 기본 VPC 생성 작업을 통해 다시 생성할 수 있지만, 생성에 어려움이 있다면 다른 지역의 기본 VPC를 사용하거나 아마존 웹 서비스 고객 지원팀에 문의하여 기본 VPC를 다시 작성할 수 있다(VPC에 수동으로 Default 태그를 설정하더라도 동작하지 않는다).
만약 그렇지 않다면, 모든 예제에 대해서 vpc_id와 subnet_id를 직접 변수로 지정해야 한다.
테라폼 설치하기
테라폼 공식 홈페이지(여기)에서 테라폼 실행 파일을 내려받을 수 있다.
다운로드 링크를 통해 운영체제에 맞는 패키지를 선택하여 zip 파일을 내려받고 수행하고자 하는 위치에 테라폼의 압축을 푼다.
'terraform'이라는 단일 파일로 압축이 풀릴 것이며, 필요에 따라서는 환경 변수(PATH)에 추가한다.
동작 여부를 확인하기 위해 테라폼 명령어를 수행하여 사용법을 확인한다.
> terraform
Usage: terraform [global options] <subcommand> [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
(...)
아마존 웹 서비스 계정에서 테라폼을 원활하게 사용하기 위해서는 앞에서 발급받은 IAM 사용자의 권한 자격(credential) 정보 즉, AWS_ACCESS_KEY와 AWS_SECRET_ACCESS_KEY의 설정을 해야 한다.
유닉스(Unix), 리눅스(Liunx), 맥(macOS)에서는 다음과 같이 설정한다.
> export AWS_ACCESS_KEY_ID=(액세스 키 ID)
> export AWS_SECRET_ACCESS_KEY=(비밀 액세스 키)
이 환경 변수 설정 값은 현재 수행한 셸 터미널에서만 유용하며, 만약 새로운 터미널이나 서버를 재시작하였다면 다시 환경 변수를 설정해야 한다.
- (내 생각) 책에 내용처럼 액세스키가 따로 생성되지 않았다.
직접 액세스 키를 만들어주면 비밀 키도 따로 생성된다.
IAM -> 사용자 -> 보안 자격 증명 -> 액세스 키(액세스 키 만들기 클릭) -> CLI -> 태그 값 입력 x, 액세스 키 만들기 클릭
인증 옵션
환경 변수와 관련해서 추가로 테라폼은 AWS CLI와 SDK 도구의 인증 관리 방법을 같이 사용한다.
그러므로, 아마존 웹 서비스 CLI를 통해 configure 명령어로 $HOME/.aws/credentials에 권한 정보가 등록되어 있거나 아마존 웹 서비스 리소스에 IAM 역할을 사용하고 있다면 동일하게 사용할 수 있다.
아마존 웹 서비스 CLI에 대해 추가적인 정보가 필요하다면 공식 사용자 가이드 페이지를 참고하면 된다(여기).
단일 서버 배포하기
테라폼 코드는 tf 확장자인 하시코프 설정 언어(HCL, HashiCorp Configuration Language)로 작성되어 있다.
테라폼은 구성하고자 하는 인프라를 설명할 수 있도록 선언형 언어로 구성되어 있으며, 테라폼이 구성정보에 따라 각 인프라 제공자의 API를 사용하여 리소스를 생성하고 구성하는 단계를 지원한다.
또한, 테라폼은 아마존 웹 서비스, 애저, 구글 클라우드, 디지털오션 등 다양한 플랫폼에 종속적이지 않게 인프라를 생성할 수 있다.
테라폼 코드는 VIM, 이맥스(EMACS), 서브라임 텍스트(SublimeText), 아톰(Atom), 비주얼 스튜디오 코드(Visual Studio Code) 및 인텔리제이(IntelliJ)(리팩토링, 사용법 그리고 선언문 이동까지 지원)등을 선호하는 문서편집기를 통해서 작성할 수 있으며, 해당 편집기에서 문법 하이라이트 기능을 지원하는지 확인할 수 있다('terraform' 대신 'HCL'로 찾아야 할 수도 있다).
테라폼 사용의 첫 번째 단계는 원하는 공급자를 설정하는 것이다.
새로운 디렉터리를 생성한 후 main.tf 파일을 만들고 다음의 내용을 작성한다.
provider "aws" {
region = "us-east-1"
}
앞의 선언을 통해 테라폼은 제공자로 아마존 웹 서비스를 사용하고 인프라를 배포하고자 하는 지역이 us-east-1이라고 인지한다.
아마존 웹 서비스는 전 세계에 데이터 센터를 가지고 있으며, 여러 가용 영역들을 지역으로 묶어서 제공한다.
아마존 웹 서비스 지역은 지리학적인 위치로 나누어져 있으며, us-east-1(북부 버지니아), eu-west-1(아일랜드), ap-northeast-2(서울) 등이 있다.
각 지역에서 가용 영역으로 불리는 각각 독립된 여러 개의 데이터 센터를 가지고 있으며, ap-northeast-2a, ap-northeast-2c로 선언되어 있다.
또한, 각 제공자 환경에 따라서 각각 다른 리소스를 생성할 수 있다.
예를 들면 서버, 데이터베이스, 로드 밸런서 등이 있으며, 아마존 웹 서비스에서 EC2 Instance와 같은 단일 서버를 생성하고자 한다면 aws_instance 리소스를 main.tf에 추가하면 된다고 한다.
resource "aws_instance" "example" {
ami = "ami-40d28157"
instance_type = "t2.micro"
}
기본적인 테라폼 리소스의 문법은 다음과 같다.
resource "PROVIDER_TYPE" "NAME" {
[CONFIG ...]
}
PROVIDER는 아마존 웹 서비스처럼 공급자의 이름이며, TYPE은 instance와 같이 생성하고자 하는 리소스의 종류다.
NAME은 테라폼 코드에서 해당 리소스를 지칭하는 식별자이며, CONFIG는 해당 리소스에 선언할 수 있는 하나 이상의 설정 변숫값들로 구성되어 있다(e.g, ami = "ami-40d28157").
aws_instance 리소스에는 다양한 설정 변숫값이 있으며, 지금은 다음에 명시된 변수만 사용하면 된다.
- aws_instance 구성 매개 변수의 전체 목록 확인하기
AMI
AMI(Amazon Machine Image, 아마존 머신 이미지)는 EC2 인스턴스를 구동시키는 골드 이미지다.
아마존 웹 서비스 마켓플레이스를 통해 무료와 유로 AMI를 찾을 수 있으며, 패커로 직접 제작할 수도 있다.
사용할 예제는 ami 변수는 us-east-1의 ubuntu 16.04 AMI 값이다.
instance_type
EC2 인스턴스를 구동시키기 위한 필수 정보다.
각 EC2 인스턴스 타입은 각기 다른 CPU, 메모리, 디스크 용량, 네트워크 수용량을 갖고 있으며, 아마존 웹 서비스 페이지에서 모든 가능한 목록을 확인할 수 있다.
예제에서는 t2.micro로 활용할 예정이며, 하나의 가상 CPU, 1GB 메모리로 아마존 웹 서비스 프리 티어에 속하는 타입이다.
터미널에서 main.tf 파일이 있는 디렉터리로 이동하여 terraform init 명령어와 plan 명령어를 순서대로 수행한다.
Init 명령어는 테라폼을 수행하기 위한 공급자의 플러그인들을 초기 설정하는 명령어이며, 실습에서는 해당 명령어를 통해 아마존 웹 서비스의 최신 버전 플러그인이 설정된다.
plan 명령어는 테라폼을 통해 실제로 생성되고 변경되는 내역을 보여준다고 한다.
실제 환경에 적용하기 전에 검증할 수 있게 하는 중요한 수단이라고 한다.
plan의 결괏값은 유닉스, 리눅스와 깃의 diff 명령어와 비슷하다고 한다.
더하기(+) 기호는 생성한다는 의미이며, 빼기(-) 기호는 제거한다는 의미, 물결(~) 기호는 변경한다는 의미라고 한다.
이 결괏값을 통해 정의한 대로 테라폼이 EC2 인스턴스를 생성하는지 알 수 있다.
실제로 인스턴스를 생성하기 위해 terraform apply 명령어를 수행하고 변경 내역을 확인(yes)하면 다음과 같이 실행된다.
> terraform apply
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.example will be created
+ resource "aws_instance" "example" {
...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: [말해 Yes Or No]
테라폼을 통해 생성한 서버는 해당 지역(실습 기준 N.Vriginia)의 EC2 대시보드를 통해서도 확인할 수 있으며, 아래에서도 확인할 수 있다.
지금까지는 서버가 정상적으로 생성되었으나 흥미로운 예제는 아니었다고 한다.
지금부터는 더욱더 흥미로운 예제를 만들어 볼 것이다.
첫째로 EC2 인스턴스에 이름을 정의해 본다.
다음과 같이 aws_instance 리소스에 태그(tag)를 추가한다.
- (내 생각) 난 흥미로웠음😎
resource "aws_instance" "example" {
ami = "ami-40d28157"
instance_type = "t2.micro"
tags {
Name = "terraform-example"
}
}
# 위에 코드는 사용 x, 사용 불가
# 공식 홈페이지 참고
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-06b09bfacae1453cb"
instance_type = "t2.micro"
tags = {
Name = "terraform-example"
}
}
plan 명령어를 통해 무엇이 수행되는지 확인해 보자.
> terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.example will be created
+ resource "aws_instance" "example" {
+ ami
...
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
테라폼은 이미 생성된 설정 파일의 세트를 지속해서 관리한다.
이를 통해 EC2 인스턴스가 기존에 생성되었는지(plan 명령어를 수행할 때 'Refreshing state...'가 해당하는 의미이다) 알 수 있으며, 현재 배포된 내역과 신규로 변경되는 사항도 알 수 있다(이것이 선언형 언어의 장점이다).
원하는 내역이이 테라폼을 통해 Name이라는 단일 태그를 생성하는 것을 확인할 수 있으며, apply를 수행하여 실제로 적용한다.
EC2 대시보드 화면을 새로 고치면 아래 내용을 확인할 수 있다.
간단한 테라폼 코드의 동작 방법을 알 수 있었다.
또한, 버전 관리 도구를 쓴다면 다른 사람들과 코드를 공유하고 인프라 변경 사항을 꾸준히 파악할 수 있으며, 커밋 로그를 통해 디버깅할 수 있다.
예를 들어, 현재 깃 저장소를 통해 다음과 같이 테라폼 설정 값을 저장할 수 있다.
- (내 생각) 아마 인스턴스를 태그로 찾을 단어를 설정해주는 것 같다.
위에처럼 example만 쳐도 인스턴스가 검색된다.
git init
git add main.tf
git commit -m "Initial commit"
.gitignore를 통해서 깃에 추가할 때 실수로 특정 파일이 추가되지 않도록 설정할 수 있다.
.terraform
*.tfstate
*.tfstate.backup
앞의 .gitignore 파일은 깃 저장소에 추가되지 않아야 할 파일들을 명시하고 있으며, 테라폼 상태를 저장하고 있는 *.tfstate 파일과 같은 경우 .gitignore 파일에 역시 커밋해 놓아야 한다.
git add .gitignore
git commit -m "Add a .gitignore file"
이 코드를 동료들과 공유하려면 모두가 접근할 수 있는 공유 깃 저장소를 만들어야 한다.
한 가지 방법은 깃허브를 사용하는 것이며, 깃허브(github.com) 계정이 없다면 계정을 만들고 새 저장소를 만들어야 한다.
다음과 같이 새로운 깃허브 저장소를 origin이라는 원격 엔드 포인트로 사용하도록 로컬 깃 저장소에 설정한다.
git remote add origin
git@github.com:<YOUR_USERNAME>/<YOUR_REPO_NAME>.git
이제 팀원과 공유하고 싶을 때마다 커밋 내용을 원격 저장소에 업데이트할 수 있다.
git push origin master
# 또는 main
또한, 팀원이 변경한 사항을 보고 싶을 때마다 origin에서 업데이트된 내역을 받을 수 있다.
git pull origin master
# 또는 main
일반적으로 테라폼을 사용할 때 정기적으로 커밋하고 깃을 사용하여 변경 사항을 적용해야 한다.
이렇게 하면, 이 코드로 팀 구성원과 함께 작업할 수 있을 뿐 아니라 모든 인프라 변경 사항이 커밋 로그에 캡처되므로 디버깅에 매우 편리하다.
내용이 많아 단일 웹 서버 배포하기, 설정 가능한 웹 서버 배포하기는 한번에 하고, 웹 서버 클러스터 구성하기는 따로 정리하는 것으로 했다.
📝 이번 게시물을 만들기 위해 참고한 사이트
1. 테라폼 공식 홈페이지
'DevOps > Terraform' 카테고리의 다른 글
Terraform Up & Running (3-2) - 테라폼 시작하기(웹 서버 클러스터 구성하기, 로드 밸런서 배포하기) (0) | 2023.07.19 |
---|---|
Terraform Up & Running (3-1) - 테라폼 시작하기(단일 웹 서버 배포하기, 설정 가능한 웹 서버 배포하기) (0) | 2023.07.12 |
Terraform Up & Running (2) - 왜 테라폼인가? (0) | 2023.07.02 |
Terraform Up & Running (1) (0) | 2023.06.26 |