☁️

LocalStackとTerraformでお手軽IaCしてみる

2024/12/06に公開

はじめに

AWSの動作検証などを行いたい時に、アカウントや支払い情報の準備が少し億劫だったりすると思いますが、LocalStackを使えば簡単にローカル環境で検証が出来ます。
そこで、本記事では一緒にTerraformも使って、LocalStackとTerraformによるお手軽IaCを試してみようと思います。

LocalStackとは

LocalStackは、AWSの主要なサービス(S3,Lambdaなど)をローカル環境でエミュレートできるツールです。有償プランがあり、データの永続化やよりよい機能の利用にはそれぞれのプランへのサブスクリプションが必要です。本記事では、community-editionをDocker環境で利用します。

https://www.localstack.cloud/pricing

すべての機能が完全に提供されているわけではないようですが、以下のページから対応状況が確認できるので、自身の用途が対応しているか事前に確認しておくことが出来ます。

https://docs.localstack.cloud/user-guide/aws/feature-coverage/

Terraform

Terraformは、専用の定義ファイルを使用してインフラをコードで管理するツールです。ファイルでインフラの構成管理が行えるので、手順書の簡略化やリソース管理の効率化に便利です。

https://www.terraform.io/

本記事での環境

MacBook Pro M3
macOS Sonoma 14.6.1

aws --version
aws-cli/2.22.12
docker -v
Docker version 27.3.1
terraform -v
Terraform v1.10.1

環境構築

awscliをインストール

brew install awscli

Dockerをインストール

特に理由がなければDocker Desktopをインストールしてください。

https://www.docker.com/ja-jp/products/docker-desktop/

Terraformをインストール

tfenvを使用して、最新バージョンをインストール・有効化します。

brew install tfenv
tfenv install latest && tfenv use latest

docker-compose.ymlの作成と起動

公式のサンプルを参考に、以下のような docker-compose.yml ファイルを作成します。

docker-compose.yml
version: "3.8"
services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}"
    image: localstack/localstack
    ports:
      - "127.0.0.1:4566:4566"
    environment:
      - DEBUG=${DEBUG:-0}
      - SERVICES=s3 # S3サービスのみ有効化
    volumes:
      - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

その他のenvironmentでの設定はドキュメントから確認できます。

https://docs.localstack.cloud/references/configuration/

docker compose up -d

terraformのファイルを作成

任意のプロジェクト用ディレクトリを作成し、その配下に terraform ディレクトリを作成します。

mkdir terraform

terraformディレクトリ配下に main.tf ファイルを作成します。 main.tf には基本的に構成したいリソースの情報を記載します。今回はS3だけ作成するので、S3バケットの情報のみを記載します。

main.tf
resource "aws_s3_bucket" "s3-bucket" {
  bucket = "localstack-test-bucket"
}

続いて、 provider.tf ファイルを作成します。 provider.tf には、どのクラウドプロバイダーを使用するか、どの認証情報やリージョンを選択するかなど設定するための情報を記載します。エンドポイントの指定などもここで行えます。

ここで設定する endpoints に向けて terraform apply 時にTerraformは処理を行います。特に指定がない場合は、AWSの実環境に向けて処理をします。

また、 access_key secret_key なども記載するべきですが、ローカル環境での検証なので今回は記載しなくても大丈夫です。

provider.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"

  endpoints {
    s3 = "http://localhost:4566" # LocalStackのS3のエンドポイントを指定
  }

  # LocalStackを利用するため、以下の設定を追加
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true
  # S3のエンドポイントを直接指定する設定を追加
  s3_use_path_style           = true
}

terraformディレクトリで以下のコマンドを実行します。事前に docker compose up -d 等でDockerコンテナの起動を行っておいてください。

terraform init && terraform apply -auto-approve

以下の表示があれば、 terraform apply が正常に完了しています。

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

現在の状態の確認

awscliがインストールされている環境であれば、以下のコマンドでバケットが作成されているか確認できます。

aws --endpoint-url=http://localhost:4566 s3 ls

以下のLocalStackが提供するヘルスチェックAPIも便利です。今回はS3のみ有効にしているので、S3以外が "disabled" となっていることが確認できます。

curl http://localhost:4566/_localstack/health
{"services": {"acm": "disabled", "apigateway": "disabled", "cloudformation": "disabled", "cloudwatch": "disabled", "config": "disabled", "dynamodb": "disabled", "dynamodbstreams": "disabled", "ec2": "disabled", "es": "disabled", "events": "disabled", "firehose": "disabled", "iam": "disabled", "kinesis": "disabled", "kms": "disabled", "lambda": "disabled", "logs": "disabled", "opensearch": "disabled", "redshift": "disabled", "resource-groups": "disabled", "resourcegroupstaggingapi": "disabled", "route53": "disabled", "route53resolver": "disabled", "s3": "running", "s3control": "disabled", "scheduler": "disabled", "secretsmanager": "disabled", "ses": "disabled", "sns": "disabled", "sqs": "disabled", "ssm": "disabled", "stepfunctions": "disabled", "sts": "disabled", "support": "disabled", "swf": "disabled", "transcribe": "disabled"}, "edition": "community", "version": "4.0.4.dev16"}

動作確認

画像をアップロードしてみる

これといった画像が手元にないので、placehold.jp様から画像を取得します。

curl -o sample-image.png https://placehold.jp/150x150.png

取得した画像を、そのままawscliを使用してアップロードします。

aws --endpoint-url=http://localhost:4566 s3 cp sample-image.png s3://localstack-test-bucket/

アップロードできたら、以下のURLから確認してみます。

http://localhost:4566/localstack-test-bucket/sample-image.png

まとめ

LocalStackを使ってTerraformの練習を手軽にすることが出来ました。今後も、Terraformを触る必要があるときはLocalStackを活用していきたいと思います。
また、Dockerコンテナが終了したと同時にデータは削除されてしまうので、開発環境として使うには少し工夫が必要かもしれません。

余談ですが、S3の代替であれば MinIO のようなものがあるので、適材適所で選んでいきたいところです。
https://min.io/

chot Inc. tech blog

Discussion