LocalStackとTerraformでお手軽IaCしてみる
はじめに
AWSの動作検証などを行いたい時に、アカウントや支払い情報の準備が少し億劫だったりすると思いますが、LocalStackを使えば簡単にローカル環境で検証が出来ます。
そこで、本記事では一緒にTerraformも使って、LocalStackとTerraformによるお手軽IaCを試してみようと思います。
LocalStackとは
LocalStackは、AWSの主要なサービス(S3,Lambdaなど)をローカル環境でエミュレートできるツールです。有償プランがあり、データの永続化やよりよい機能の利用にはそれぞれのプランへのサブスクリプションが必要です。本記事では、community-editionをDocker環境で利用します。
すべての機能が完全に提供されているわけではないようですが、以下のページから対応状況が確認できるので、自身の用途が対応しているか事前に確認しておくことが出来ます。
Terraform
Terraformは、専用の定義ファイルを使用してインフラをコードで管理するツールです。ファイルでインフラの構成管理が行えるので、手順書の簡略化やリソース管理の効率化に便利です。
本記事での環境
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をインストールしてください。
Terraformをインストール
tfenvを使用して、最新バージョンをインストール・有効化します。
brew install tfenv
tfenv install latest && tfenv use latest
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での設定はドキュメントから確認できます。
docker compose up -d
terraformのファイルを作成
任意のプロジェクト用ディレクトリを作成し、その配下に terraform
ディレクトリを作成します。
mkdir terraform
terraformディレクトリ配下に main.tf
ファイルを作成します。 main.tf
には基本的に構成したいリソースの情報を記載します。今回はS3だけ作成するので、S3バケットの情報のみを記載します。
resource "aws_s3_bucket" "s3-bucket" {
bucket = "localstack-test-bucket"
}
続いて、 provider.tf
ファイルを作成します。 provider.tf
には、どのクラウドプロバイダーを使用するか、どの認証情報やリージョンを選択するかなど設定するための情報を記載します。エンドポイントの指定などもここで行えます。
ここで設定する endpoints
に向けて terraform apply
時にTerraformは処理を行います。特に指定がない場合は、AWSの実環境に向けて処理をします。
また、 access_key
secret_key
なども記載するべきですが、ローカル環境での検証なので今回は記載しなくても大丈夫です。
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 のようなものがあるので、適材適所で選んでいきたいところです。
ちょっと株式会社(chot-inc.com)のエンジニアブログです。 フロントエンドエンジニア募集中! カジュアル面接申し込みはこちらから chot-inc.com/recruit/iuj62owig
Discussion