DevOps 환경에서 인프라 관리의 효율성을 높이기 위해 많은 기업이 인프라 코드(Infrastructure as Code, IaC) 도구를 사용하고 있습니다. 그 중 하나가 바로 테라폼(Terraform)입니다. 테라폼은 HashiCorp에서 개발한 오픈 소스 도구로, 다양한 클라우드 서비스 제공자와의 연동이 뛰어나고 인프라를 코드로 정의하여 쉽게 배포하고 관리할 수 있도록 도와줍니다. 이번 포스트에서는 AWS 인프라를 테라폼으로 구축하면서 느낀 유용성과 시행착오에 대해 공유해 보겠습니다.

테라폼 시작하기

테라폼을 사용하기 위해서는 먼저 설치가 필요합니다. 각 운영 체제에 맞는 패키지를 다운로드하여 설치할 수 있습니다. 설치 후, terraform 명령어를 통해 정상적으로 설치되었는지 확인할 수 있습니다.

terraform -v

AWS와 통합하기 위해 AWS IAM 사용자 및 인증 정보를 설정해야 합니다. 아래 단계에 따라 IAM 사용자를 생성하고 키를 발급받습니다.

  1. AWS Management Console에 로그인합니다.
  2. IAM 서비스를 선택합니다.
  3. '사용자 추가'를 선택하고, 사용자에게 필요한 권한(예: AdministratorAccess)을 부여합니다.
  4. 접근 키를 생성하고, Access Key ID와 Secret Access Key를 안전하게 저장합니다.

이제 테라폼을 사용할 준비가 되었습니다.

테라폼으로 AWS EC2 인스턴스 배포하기

아래는 기본적인 AWS EC2 인스턴스를 테라폼으로 배포하는 예제입니다. 먼저, 작업할 디렉토리를 만들고 테라폼 구성 파일(main.tf)을 생성합니다.

provider "aws" {
  region = "ap-northeast-2"  # 서울 리전
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2 AMI
  instance_type = "t2.micro"

  tags = {
    Name = "MyExampleInstance"
  }
}

이제, 아래 명령어를 사용하여 테라폼을 초기화하고 배포합니다.

terraform init
terraform apply
terraform apply 명령을 실행하면 배포 계획이 출력됩니다. 확인 후 yes를 입력하면 인스턴스가 생성됩니다.

유용했던 점

테라폼의 가장 큰 장점 중 하나는 인프라 변경 관리가 용이하다는 점입니다. 코드로 인프라를 정의하기 때문에 버전 관리가 가능하며, 팀원 간 협업이 수월합니다. 또한, 여러 환경(개발, 테스트, 운영)에서 동일한 인프라를 재현할 수 있어 일관성을 유지할 수 있습니다.

테라폼의 상태 파일(terraform.tfstate)은 현재 인프라의 상태를 저장하고 관리하는 데 중요한 역할을 합니다. 이 파일 덕분에 테라폼은 어떤 리소스가 생성되었는지 추적할 수 있습니다. 또한, terraform plan 명령을 통해 변경 사항을 미리 확인할 수 있어, 원치 않는 변경을 방지할 수 있습니다.

시행착오 경험

하지만 테라폼 사용 중 시행착오도 있었습니다. 처음 설정할 때, IAM 권한 부족으로 인해 리소스가 생성되지 않거나, 생성된 리소스를 삭제하는 데 실패하는 경우가 있었습니다. 이 문제를 해결하기 위해 IAM 사용자에게 필요한 권한을 추가하고, 자주 사용하는 리소스의 권한을 명확히 설정하는 것이 중요하다는 것을 깨달았습니다.

또한, 상태 파일 관리에도 주의해야 합니다. 로컬 환경에서 작업할 때는 상태 파일을 안전한 위치에 두는 것이 중요하며, 팀원과 협업할 경우에는 원격 상태 백엔드를 사용하는 것이 좋습니다. AWS S3와 DynamoDB를 함께 사용하여 상태 파일을 관리하면 충돌을 방지할 수 있습니다.

마무리

테라폼을 사용하여 AWS 인프라를 구축하는 과정은 매우 유익했습니다. 코드로 정의된 인프라는 일관성을 제공하고, 팀 간 협업을 용이하게 만들었습니다. 하지만 IAM 권한 및 상태 파일 관리와 같은 시행착오도 겪으면서, 인프라 관리의 복잡성을 더욱 깊이 이해할 수 있었습니다. 앞으로도 테라폼을 활용하여 더 많은 클라우드 리소스를 관리하고, DevOps 환경에서의 효율성을 더욱 높여 나가고자 합니다.