Terraform을 이용한 AWS EC2 인스턴스 프로비저닝 및 관리 가이드
Terraform을 사용하여 AWS EC2 인스턴스를 안전하고 효율적으로 생성, 구성 및 관리하는 방법을 안내합니다. IaC 실천을 위한 필수 가이드입니다.
Terraform이란?
Terraform은 HashiCorp에서 개발한 오픈소스 인프라스트럭처 코드(Infrastructure as Code, IaC) 도구입니다. HCL(HashiCorp Configuration Language)이라는 선언적 구성 언어를 사용하여 클라우드 및 온프레미스 환경의 인프라를 코드로 정의하고 프로비저닝하며 관리할 수 있습니다. 이는 인프라의 버전 관리, 자동화, 재현성을 가능하게 합니다.
왜 Terraform을 사용하는가?
- 자동화: 반복적인 인프라 생성 및 변경 작업을 자동화하여 시간과 노력을 절약합니다.
- 버전 관리: 인프라 구성을 코드로 관리하므로 Git과 같은 버전 관리 시스템을 사용하여 변경 이력을 추적하고 협업을 용이하게 합니다.
- 재현성: 동일한 코드로 언제든지 동일한 환경을 프로비저닝할 수 있어 개발, 테스트, 프로덕션 환경 간의 일관성을 보장합니다.
- 상태 관리: Terraform은 현재 인프라의 상태를
tfstate파일에 기록하여, 이전 상태와 현재 정의된 상태를 비교하고 필요한 변경 사항만을 적용합니다. - 다양한 클라우드 지원: AWS, Azure, GCP 등 다양한 클라우드 제공업체와 온프레미스 환경을 지원하는 프로바이더를 통해 멀티 클라우드 전략을 쉽게 구현할 수 있습니다.
Terraform을 이용한 EC2 인스턴스 프로비저닝 단계
1. Terraform 설치
운영체제에 맞는 Terraform 실행 파일을 다운로드하여 시스템 PATH에 추가합니다. 공식 Terraform 웹사이트에서 최신 버전을 다운로드할 수 있습니다.
2. AWS 프로바이더 설정
Terraform이 AWS와 통신할 수 있도록 AWS 프로바이더를 설정해야 합니다. Access Key ID와 Secret Access Key를 환경 변수, 공유 자격 증명 파일 또는 IAM 역할을 통해 제공할 수 있습니다. 보안을 위해 환경 변수나 IAM 역할을 사용하는 것이 권장됩니다.
main.tf 또는 provider.tf 파일에 다음과 같이 AWS 프로바이더를 정의합니다.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 4.0"
}
}
}
provider "aws" {
region = "ap-northeast-2" # 예: 서울 리전
}
3. EC2 인스턴스 정의
main.tf 파일에 EC2 인스턴스 리소스를 정의합니다. 여기에는 인스턴스 타입, AMI ID, 보안 그룹, 키 페어 등이 포함됩니다.
resource "aws_instance" "example_instance" {
ami = "ami-0c55b159cbfafe1f0" # 예: Amazon Linux 2 AMI ID (리전에 따라 다름)
instance_type = "t2.micro"
key_name = "my-ec2-key" # 미리 생성된 EC2 키 페어 이름
tags = {
Name = "TerraformExampleInstance"
}
}
# 보안 그룹 및 네트워크 설정 (생략 가능, 기존 사용 시)
# resource "aws_security_group" "allow_ssh" {
# name = "allow_ssh"
# description = "Allow SSH inbound traffic"
# vpc_id = "vpc-xxxxxxxxxxxxxxxxx" # VPC ID
# ingress {
# description = "SSH from anywhere"
# from_port = 22
# to_port = 22
# protocol = "tcp"
# cidr_blocks = ["0.0.0.0/0"]
# }
# egress {
# from_port = 0
# to_port = 0
# protocol = "-1"
# cidr_blocks = ["0.0.0.0/0"]
# }
# }
# resource "aws_instance" "example_instance" {
# # ... 이전 설정 ...
# vpc_security_group_ids = [aws_security_group.allow_ssh.id]
# }
참고: AMI ID는 AWS 리전마다 다르므로, 사용하려는 리전의 최신 Amazon Linux 2 AMI ID 등을 AWS 콘솔에서 확인하여 입력해야 합니다.
4. Terraform 초기화 (terraform init)
프로젝트 디렉토리에서 terraform init 명령을 실행하여 Terraform을 초기화하고 필요한 프로바이더 플러그인을 다운로드합니다.
5. 실행 계획 확인 (terraform plan)
terraform plan 명령을 실행하여 Terraform이 생성하거나 변경할 리소스 목록을 확인합니다. 이를 통해 의도하지 않은 변경이 발생하는 것을 미리 방지할 수 있습니다.
6. 인프라 적용 (terraform apply)
terraform apply 명령을 실행하면 plan에서 확인한 내용을 실제로 AWS에 프로비저닝합니다. 실행 전 다시 한번 확인 절차를 거칩니다.
7. 인프라 상태 확인 및 관리
terraform state list: 현재 관리 중인 리소스 목록을 확인합니다.terraform state show <resource_address>: 특정 리소스의 상세 상태 정보를 확인합니다.terraform destroy: 프로비저닝된 모든 인프라를 삭제합니다.
주의사항 및 모범 사례
- 민감 정보 관리: EC2 키 페어, SSH 키 등 민감한 정보는 코드에 직접 포함하지 말고, AWS Secrets Manager, HashiCorp Vault와 같은 보안 도구나 환경 변수를 사용하세요.
- AMI ID 관리: AMI ID는 리전별로 다르므로,
data소스를 사용하여 동적으로 조회하거나, 변수를 사용하여 관리하는 것이 좋습니다. - 보안 그룹: SSH 포트(22)는 필요한 IP 대역만 허용하도록 제한하여 보안을 강화하세요.
0.0.0.0/0은 모든 IP에서 접근 가능하므로 프로덕션 환경에서는 절대 사용하지 않아야 합니다. - 상태 파일 (tfstate):
tfstate파일은 매우 중요하며, 팀원 간 공유 시에는 S3와 같은 원격 백엔드를 사용하여 잠금(locking) 기능을 활성화하는 것이 좋습니다. - 모듈 활용: 반복적으로 사용되는 인프라 패턴은 Terraform 모듈로 만들어 재사용성을 높이세요.
- 롤백: Terraform은 상태 기반으로 동작하므로, 이전 상태로의 직접적인 '롤백'은 지원하지 않습니다. 변경 사항을 이전 버전의 코드로 되돌린 후
terraform apply를 다시 실행하여 원하는 상태로 복구합니다.
Terraform을 사용하면 AWS EC2 인스턴스를 포함한 클라우드 인프라를 효율적이고 안정적으로 관리할 수 있습니다. IaC 문화는 DevOps 환경에서 필수적인 요소이며, Terraform은 그 핵심 도구 중 하나입니다.