LocalStack Terraform 코드를 개선해보았다

wonjun_choi·2024년 11월 25일

LocalStack

목록 보기
3/3
post-thumbnail

들어가며

이전에 LocalStack에서 EC2를 Terraform으로 생성했었다.
이번에는 더 나아가 github에서 코드 변경이 있을 때마다 LocalStack의 EC2 서버에 반영이 되게끔 해보려 한다.
그래야 LocalStack으로 테스트 서버를 돌리는 의미가 있다고 생각했다.

그 전에, Terraform 코드를 개선하고, ssh로 EC2에 접속하는 것 부터 정리해보았다.

Terraform 코드 업데이트

먼저 이전에 만들었던 Terraform 코드를 조금 변경했다.

ssh 접속 key pair 생성

이전에는 LocalStack으로 EC2를 생성하기 전, CLI 명령어로 pem key를 생성해 주었었다.

awslocal ec2 create-key-pair --key-name my-key --query 'KeyMaterial' --output text > my-key.pem
chmod 400 my-key.pem

다만 LocalStack이 초기화되었다 다시 시작되는 경우 이전에 생성한 pem key가 사라지는 경우가 있었고, Terraform 코드에 ssh 접속을 위한 key pair를 생성해 주는 로직을 추가해 주었다.
(그리고 이전 글에서 만든 Terraform 코드에서는 EC2 생성할 때 pem key를 넣어주지 않아 ssh 접속되지 않았었다)

# main.tf
resource "tls_private_key" "this" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

resource "aws_key_pair" "this" {
  key_name   = var.key_name
  public_key = tls_private_key.this.public_key_openssh
}

resource "local_file" "private_key" {
  content  = tls_private_key.this.private_key_pem
  filename = "${path.module}/${var.key_name}"
  file_permission = "0600"
}

resource "aws_instance" "example" {
  count         = var.instance_count
  ami           = var.ami_id
  instance_type = var.instance_type
  key_name      = var.key_name

  tags = {
    Name = "${var.instance_name}-${count.index + 1}"
  }
}

tflocal 명령어 사용

LocalStack 공식 문서를 보던 중 Terraform에 대한 설명이 있는 것을 발견하고, tflocal 명령어에 대해서 알게 되었다. (좀 더 빨리 찾아볼걸…. 모르는 게 있을 땐 공식 문서부터 보자)
기본 Terraform 명령어를 사용하는 경우 provider에 LocalStack endpoints를 추가해 주어야 하는데, 이 endpoints 없이도 Terraform이 LocalStack 참조할 수 있도록 tflocal 명령어를 사용할 수 있다.

tflocal 명령어를 먼저 설치해준다.

brew install terraform-local

이제 LocalStack endpoints가 필요하지 않으므로 provider.tf 파일을 수정해주었다.

# provider.tf

provider "aws" {
  access_key                  = var.aws_access_key
  secret_key                  = var.aws_secret_key
  region                      = var.aws_region
  skip_credentials_validation = var.skip_credentials_validation
  skip_metadata_api_check     = var.skip_metadata_api_check
  skip_requesting_account_id  = var.skip_requesting_account_id
}

ssh EC2 접속

Terraform 코드를 수정해 주고, 실행하여 LocalStack에 EC2가 생성되는지 확인해 보고, ssh로 EC2에 접속할 수 있는지 확인해 보았다.
ssh 접속은 아래 명령어로 하면 된다.

ssh -i key.pem root@127.0.0.1

정상적으로 동작하는 것을 확인했다.

코드

# main.tf
resource "tls_private_key" "this" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

resource "aws_key_pair" "this" {
  key_name   = var.key_name
  public_key = tls_private_key.this.public_key_openssh
}

resource "local_file" "private_key" {
  content  = tls_private_key.this.private_key_pem
  filename = "${path.module}/${var.key_name}"
  file_permission = "0600"
}

resource "aws_instance" "example" {
  count         = var.instance_count
  ami           = var.ami_id
  instance_type = var.instance_type
  key_name      = var.key_name

  tags = {
    Name = "${var.instance_name}-${count.index + 1}"
  }
}
# provider.tf
provider "aws" {
  access_key                  = var.aws_access_key
  secret_key                  = var.aws_secret_key
  region                      = var.aws_region
  skip_credentials_validation = var.skip_credentials_validation
  skip_metadata_api_check     = var.skip_metadata_api_check
  skip_requesting_account_id  = var.skip_requesting_account_id
}
# variable.tf
variable "aws_access_key" {
  description = "AWS access key"
  type        = string
}

variable "aws_secret_key" {
  description = "AWS secret key"
  type        = string
}

variable "aws_region" {
  description = "AWS region"
  type        = string
  default     = "ap-northeast-2"
}

variable "skip_credentials_validation" {
  description = "Skip AWS credentials validation"
  type        = bool
  default     = true
}

variable "skip_metadata_api_check" {
  description = "Skip AWS metadata API check"
  type        = bool
  default     = true
}

variable "skip_requesting_account_id" {
  description = "Skip requesting AWS account ID"
  type        = bool
  default     = true
}

variable "ami_id" {
  description = "The AMI to use for the instance"
  type        = string
  default     = "ami-df5de72bdb3b"
}

variable "instance_type" {
  description = "The type of instance to start"
  type        = string
  default     = "t2.micro"
}

variable "key_name" {
  description = "Pem key of instance to start"
  type        = string
  default     = "ec2-key"
}

variable "instance_name" {
  description = "The name to give the instance"
  type        = string
  default     = "example-instance"
}

variable "instance_count" {
  description = "Number of instances to launch"
  type        = number
  default     = 1
}

마무리

처음 사용하는 기술이 있을 때는 모든 공식 문서를 다 보지 않더라도 어떤 문서들이 있는지 확인해 보는 것이 중요하다는걸 다시 한번 느끼게 되었다.

다음 글에서는 이렇게 생성한 EC2를 Github Actions와 어떻게 연동했는지 정리하려 한다.

참고

localstack/terraform

0개의 댓글