Terraform

[Terraform] LocalStack 연동

비번변경 2025. 11. 13. 09:45

개요

Terraform 학습을 위한 테스트를 진행하고 싶은데, 보통 Terraform 튜토리얼은 AWS 등의 CSP를 활용하고 있어 테스트 발생했다. (프리티어를 사용하면 되지만, 프리티어 계정을 계속 만드는 것도 번거로운 상황이었다.) 때문에 AWS 에뮬레이션 서비스인 LocalStack과 Terraform을 연동해 학습 환경을 구성해보고자 한다.

 

 

AWS provider

2025.10.28-[LocalStack] AWS - 사용 설정에서 알아봤지만, AWS CLI 수행 요청을 LocalStack으로 보낼 때에는 AWS 엔드포인트를 변경했었다. Terraform에서도 비슷하게 AWS provider의 인증 정보와 엔드포인트를 변경함으로써 Terraform 적용 요청을 AWS가 아닌 Localstack으로 보낼 수 있다.

 

- 인증 정보

먼저 AWS 모의 자격 증명을 정의한다.

provider "aws" {
  access_key = "test"
  secret_key = "test"
  region     = "us-east-1"
}

 

- 추가 매개변수 지정

라우팅이나 인증 문제를 방지하기 위한 매개변수를 지정한다. 지정한 매개변수는 다음과 같다.

provider "aws" {
  # 생략
  
  # only required for non virtual hosted-style endpoint use case.
  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs#s3_use_path_style
  s3_use_path_style           = true
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true
}

 

  • s3_use_path_style : S3 클라이언트는 기본적으로  가상 호스팅 버킷 주소(https://BUCKET.s3.amazonaws.com/KEY)를 사용하나, 이를 https://s3.amazonaws.com/BUCKET/KEY 형식을 사용할지 결정한다.
  • skip_credentials_validation : STS 자격 검증 증명을 건너뛸지 결정한다. 테스트 및 STS가 없는 API 구현에 유용하다.
  • skip_metadata_api_check : AWS 메타데이터 API 검사를 건너뛸지 결정한다. 메타데이터 API 엔드포인트가 없는 API 구현에 유용하며, true로 설정하면 Terraform이 메타데이터 API를 통해 인증할 수 없으므로 정적 자격 증명, 환경 변수 등과 같은 다른 인증 방법을 사용해야 한다.
  • skip_requesting_account_id : 계정 ID 요청을 건너뛸지 결정한다. STS, 메타데이터 API가 없는 API 구현에 유용하다.

 

- 서비스 구성

서비스가 LocalStack을 사용하도록 구성한다. S3의 경우에는 다음과 같다.

endpoints {
  s3             = "http://s3.localhost.localstack.cloud:4566"
}

 

 

 

최종 구성

추가 서비스 엔드포인트를 위한 전체 구성 예시는 다음과 같다.

provider "aws" {
  access_key = "test"
  secret_key = "test"
  region     = "us-east-1"

  s3_use_path_style           = true
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true

  endpoints {
    apigateway     = "http://localhost:4566"
    apigatewayv2   = "http://localhost:4566"
    cloudformation = "http://localhost:4566"
    cloudwatch     = "http://localhost:4566"
    dynamodb       = "http://localhost:4566"
    ec2            = "http://localhost:4566"
    es             = "http://localhost:4566"
    elasticache    = "http://localhost:4566"
    firehose       = "http://localhost:4566"
    iam            = "http://localhost:4566"
    kinesis        = "http://localhost:4566"
    lambda         = "http://localhost:4566"
    rds            = "http://localhost:4566"
    redshift       = "http://localhost:4566"
    route53        = "http://localhost:4566"
    s3             = "http://s3.localhost.localstack.cloud:4566"
    secretsmanager = "http://localhost:4566"
    ses            = "http://localhost:4566"
    sns            = "http://localhost:4566"
    sqs            = "http://localhost:4566"
    ssm            = "http://localhost:4566"
    stepfunctions  = "http://localhost:4566"
    sts            = "http://localhost:4566"
  }
}

 

 

 

참고 문서

https://docs.localstack.cloud/aws/integrations/infrastructure-as-code/terraform/#manual-configuration

 

 

728x90