이번 실습에서는 AWS EC2 인스턴스를 활용해 Terraform으로 인프라를 구축하고, 웹서버를 배포한 후 최종적으로 리소스를 삭제하는 과정을 다루었다.
1. 시스템 업데이트 및 필수 패키지 설치
먼저, Learner Lab 환경에서 시스템 업데이트와 필수 패키지 설치를 진행하였다.
sudo yum update && sudo yum install jq unzip
2. Terraform 설치
Terraform 버전 1.3.2를 설치하기 위해 install_terraform.sh 파일에 아래 스크립트를 작성하였다.
TERRAFORM_VERSION="1.3.2"
RESP=$(curl -sS https://api.releases.hashicorp.com/v1/releases/terraform/${TERRAFORM_VERSION})
BINARY_URL=$(echo $RESP | jq -r '.builds[] | select (.os == "linux" and .arch == "amd64") | .url')
sudo wget $BINARY_URL
sudo unzip -o terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d /usr/local/bin
아래 명령으로 스크립트에 실행 권한을 부여하였다.
chmod +x install_terraform.sh
3. Terraform 초기화 및 IaC 구성 실행
Learner Lab 내에서 아래 내용으로 main.tf 파일을 생성하고,
random provider를 이용한 무작위 문자열 생성 리소스를 정의하였다.
terraform {
required_version = "~> 1.0"
required_providers {
random = {
source = "hashicorp/random"
version = "3.5.1"
}
}
}
resource "random_string" "random" {
length = 16
}
output "random" {
value = random_string.random.result
}
이후 다음 명령어들을 순차적으로 실행하였다.
terraform init
- 작업 디렉토리를 초기화하고 provider 플러그인을 설치
terraform plan
- 실행 계획을 미리 확인해 생성되는 요소들을 점검한다.
terraform apply
- 실행 계획에 따라 리소스를 생성하고, 명령 실행중 yes를 입력을 통해 적용한다.
4. tfenv를 통한 Terraform 버전 관리
Learner Lab 환경에서 여러 Terraform 버전을 테스트하기 위해 tfenv를 설치하였다.
sudo yum install git
git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
이후 tfenv install 1.1.9 나 tfenv install 1.9.5 등의 명령어로 다양한 버전을 설치할 수 있고,
tfenv use 1.9.5
해당 명령으로 기본 버전을 전환해주었다.
5. HashiCorp 학습용 리포지토리 클론 및 AWS 설정
Learner Lab 환경에서 HashiCorp의 learn-terraform-lifecycle-management 리포지토리를 클론해 예제구성을 가져왔다.
git clone https://github.com/hashicorp/learn-terraform-lifecycle-management
cd learn-terraform-lifecycle-management
aws configure
이후 aws configure 명령어로 aws 자격증명을 설정하고,
vi ~/.aws/credentials
현재 AWS Academy 환경이기에 해당 파일에 token도 작성해준다.
aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query \
'Reservations[*].Instances[*].[InstanceId,InstanceType,PublicIpAddress,State.Name,Tags[?Key==`Name`].Value[]]' --output table
해당 명령으로 실행중인 인스턴스 정보를 확인할 수 있다.
Learner Lab의 제한된 IAM 권한으로 인해 일부 작업에서는 권한 부족 에러가 발생할 수 있음을 확인하였다.
6. Terraform 버전 변경 및 초기화
예제(Lifecycle management)의 구성파일의 required_version이 "~>0.14"로 지정되어 있어,
기본 Terraform 버전과 호환되지 않는 문제가 발생하였다.
따라서
tf install 0.14.11
해당 명령으로 Terraform 0.14.11 버전을 설치한 후 tfenv use 0.14.11으로 버전을 전환하여 문제를 해결하였다.
이후 terraform init명령을 통해 성공적으로 초기화를 완료하였다.
7. Terraform을 이용한 웹서버 구축 및 배포
이 단계에서는 AWS EC2 인스턴스를 생성하고 웹서버를 배포하였다.
아래와같이 terraform.tfvars 파일을 작성해준다.
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0
region = "us-east-1"
main.tf 파일은 아래와 같이 작성되었다.
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 3.24.1"
}
}
required_version = "~> 0.14"
}
provider "aws" {
region = var.region
}
resource "aws_instance" "example" {
ami = "ami-0e86e20dae9224db8"
instance_type = "t2.micro"
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install -y apache2
sed -i -e 's/80/8080/' /etc/apache2/ports.conf
echo "Hello World" > /var/www/html/index.html
systemctl restart apache2
EOF
tags = {
Name = "terraform-learn-state-ec2"
drift_example = "v1"
}
}
terraform apply
명령을 입력하면
인스턴스 ID와 퍼블릭IP를 알려준다.
하지만 현재 설정상 8080포트를 열어야하기 때문에,
아래처럼 AWS EC2 인스턴스 보안 설정에서 포트를 열어줘야 접속이 가능하다.
설정 후 브라우저를 통해 해당 IP에 접속하면 Hello World를 확인할 수 있다.
8. 생성된 인프라 리소스 삭제
실습이 완료되어 아래 명령을 실행해 생성된 인프라 리소스를 삭제하였다.
terraform destroy