
LocalStack × Terraform × DockerでAWSローカル環境を作成する方法とは?
はじめに

Amazon Web Services(以下、AWS)を利用している皆様の中には検証環境を用意する工数や費用にお困りの方や、簡単な検証なのに逐一マネジメントコンソールに接続しリソース作成をしなければならないのが手間と感じている方は多くいらっしゃるのではないでしょうか。
そこで今回は、AWS検証環境をローカル環境に簡単に用意することができるLocalStackを
ご紹介いたします!
記事前半ではLocalStackの概要・メリットを、後半では実際にLocalStackを使用して
ローカル環境にAWS検証環境を作成する方法についてお伝えします。
また今回検証環境の作成にはTerraform、Dockerを使用します。いずれのツールもローカル環境の整備に大きく貢献するため、これらのサービスにご興味がある方も、ぜひご覧ください。
ローカル環境を整備するメリット
ローカル環境の整備は、コスト削減の面で注目されています。有料のアカウント機能を使用することなく、クラウド環境と同様の使い方ができるため、機能テストなどを行う際に活躍します。
また、本来はオンライン上での運用が必須なクラウド環境を、ローカルで使えるようになる点も魅力です。毎回クラウドに接続する面倒や時間的負担の発生を回避できるので、開発パフォーマンスの向上を進められるでしょう。これから本格的にクラウドを用いて環境を整備したいと考えている場合、まずはローカルでのテストを挟むのがおすすめです。
LocalStackとは?

まず、LocalStackの概要についてお伝えします。
LocalStackはローカル環境に検証用のAWSリソースを用意することができるモックフレームワークです。
Lambda関数やS3バケットなどの主要なAWSリソースの多くを無料で用意することができ、ローカル環境で動作の確認を行うことができます。※一部有料のリソースも存在します。
LocalStackを使用することで、すでに稼働しているクラウド環境への影響を与えることがないのも特徴です。互換性やセットアップに伴う不具合などのリスクを回避しながら、導入を進められるでしょう。
LocalStackのメリット
続いて、LocalStackのメリットについてご紹介したいと思います。
メリットは大きく以下の三つです。
- AWSアカウントの登録が不要。
- ローカル環境に構築するためAWS利用料金を気にせず検証や動作確認が可能。
- CI/CDパイプラインを利用して環境、リソースの構築が可能。
具体的にはLocalStack用のDockerイメージが公開されているため、環境の構築が容易です、また、用意したコンテナにTerraformを利用してAWSリソースを構築することができるため、複数人で同一のテスト環境を再現することや、リソースの作成、削除などビルドサイクルの高速化も可能となります。
Terraformとは
Terraformは、インフラの構築を効率化、あるいは自動化するためのツールです。Go言語によって開発されたオープンソースのサービスで、インフラ構成をソースコードで管理し、構造化されたファイルの管理を効率化することができます。
一度Terraformを使って環境を構築すれば、以降は別の環境に対しても同じものを適用できるので、使えば使うほど管理効率は高まる仕組みです。設定の変更についても、履歴を追いかけられるようになる点が評価されています。
Dockerについて
Dockerは一台のサーバーで多様なアプリケーションを同時に起動・管理できるようにするための仮想環境プラットフォームです。一般的な仮想マシンとは異なり、アプリケーションごとのゲストOS導入の必要がなく、ホストOSを使ってアプリを動かせる点が強みです。
このおかげで、Docker上で動作するアプリは高速で快適に動かせることから、負荷の小さな運用体制を構築できます。サーバーリソースを効率的に運用し、サーバー導入のコストが膨らんでしまうことを防げるツールというわけです。
LocalStack×Terraform×Docker実践

それでは実際にLocalStackを利用してみましょう。
今回はまずDocker-Composeを利用してコンテナ上にLocalStack環境を構築します。
次に構築したLocalStack環境にTerraformでS3バケットを作成し
最後にAWS CLI,Pythonを使って動作検証を実施してみます。
①前提事項
今回使用する環境、パッケージは以下です。
Virtual Box | 6.1 |
OS | AlmaLinux 8.6 |
Python | 3.12.2 |
LocalStack | 3.3.0 |
Docker | 26.0.0 |
Docker-Compose | 2.25.0 |
Terraform | 1.7.5 |
②環境構築
まずはLocalStack環境をDockerコンテナを使用して構築します。
今回dockerコンテナの作成にはDocker-Composeを使用します。
②-1.LocalStackのインストール
Python3.11.4を導入後以下のコマンドでLocalStackをインストールします。
※pythonのインストールにはpyenvを使用し一般ユーザーに仮想環境を立ち上げています。
$ pip install localstack
②-2.Dockerのインストール
以下のコマンドでdnfリポジトリを追加し、Dockerをインストールします。
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
インストール完了後Dockerサービスを起動します。
# systemctl start docker
次にDockerコマンドをsudoコマンドなしで実行可能にするために一般ユーザーをdockerグループに追加します。今回一般ユーザーはdeveloperとします。
※予めdeveloperユーザーはsudo権限が付与されています。
$ sudo gpasswd -a developer docker
追加後ログアウト、再接続し以下のコマンドが実行できることを確認します。
$ docker ps -a
②-3. Docker-ComposeでLocalStack環境用コンテナを起動
以下のコマンドでdocker-compose.ymlファイル作成します。
ファイルは公式のサンプルを参考に作成しました。
$ mkdir $HOME/localstack
$ vi localstack/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" # LocalStack Gateway
- "127.0.0.1:4510-4559:4510-4559" # external services port range
environment:
# LocalStack configuration: https://docs.localstack.cloud/references/configuration/
- DEBUG=${DEBUG:-0}
volumes:
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
ファイル作成後以下のコマンドでコンテナを起動します。
$ docker compose -f localstack/docker-compose.yml up -d
以上でDockerコンテナにLocalStack環境の構築が完了しました。
③LocalStackにAWSリソースを作成
続いて②で作成したLocalStack環境にAWSリソースを作成していきたいと思います。今回リソースの作成にはTerraformを使用していきます。
③-1.Terraformのインストール
以下のコマンドでdnfリポジトリを追加し、Terraformをインストールします。
# dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
# dnf install terraform -y
インストール完了後tflocalをインストールします。 tflocalはterraformコマンドのラッパースクリプトです。このコマンドを使用することでTerraform構成ファイルに各AWSサービスのエンドポイントを記載しなくても自動で構成できるようになります。
$ pip install terraform-local
③-2. TerraformでS3バケットを作成
それではいよいよリソースを作成してみます。まずはS3バケット作成用のTerraform定義ファイルを作成します。 今回認証情報は不要なためダミーを指定します。
$ mkdir $HOME/terraform
$ vi terraform/main.tf
provider "aws" {
access_key = "dummy_access_key"
secret_key = "dummy_secret_key"
region = "ap-northeast-1"
s3_use_path_style = true
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
endpoints {
s3 = "http://s3.localhost.localstack.cloud:4566"
}
}
resource "aws_s3_bucket" "test-bucket" {
bucket = "local-bucket"
}
次にtflocalコマンドでプロビジョニングします。
$ cd terraform
$ tflocal init
$ tflocal apply
以上でLocalStack環境にS3バケットの構築が完了しました。
④動作検証
作成したS3バケットの確認をしていきます。
今回検証にはAWS CLIとpythonのboto3ライブラリを使用していきます。
④-1.AWS CLI
以下のコマンドでAWS CLIをインストールします。
$ pip install awscli
続いて構成プロファイルを作成します。
③-2でmain.tfに記載したダミーの認証情報を使用します。
$ aws configure --profile default
AWS Access Key ID [None]: dummy_access_key
AWS Secret Access Key [None]: dummy_secret_key
Default region name [None]: ap-northeast-1
Default output format [None]:
それではLocalStack環境にS3バケットが構築できているか確認してみましょう。
エンドポイントはlocalhost:4566を指定します。
$ aws --endpoint-url=http://localhost:4566 s3 ls
YYYY-MM-DD HH:MM:SS local-bucket
③-2で作成したmain.tfに記載したバケット名が出力されていれば成功です!
④-2. Python: boto3
続いてboto3でも確認してみます。
boto3をインストールしS3バケット名一覧を表示するスクリプトを作成します。
$ pip install boto3
$ mkdir $HOME/test_script
$ vi $HOME/test_script/s3_commander.py
import boto3
class S3_List_Bucket():
def __init__(self):
self._s3_client = boto3.client(
"s3",
aws_access_key_id="dummy_access_key",
aws_secret_access_key="dummy_secret_key",
region_name="ap-northeast-1",
endpoint_url="http://localhost:4566/"
)
def _list_buckets(self):
res = self._s3_client.list_buckets()
for bucket in res["Buckets"]:
print(f'{bucket["Name"]}')
if __name__ == "__main__":
s3 = S3_List_Bucket()
s3._list_buckets()
実行権限を付与し実行します。
$ chmod 755 $HOME/test_script/s3_commander.py
$ python $HOME/test_script/s3_commander.py
local-bucket
こちらも③-2で作成したmain.tfに記載したバケット名が出力されていれば成功です!
まとめ

今回はLocalStackを使用してAWS検証環境をローカル環境に用意する方法についてご紹介いたしました。またDocker、Terraformを駆使することで検証環境をスピーディに用意できることもご紹介させていただきました。
環境構築さえできてしまえば、後はTerraform定義ファイルを更新することでリソースの追加や削除をすることができます。AWSマネジメントコンソールを使った運用も可能ですが、ここからリソースを追加、削除するよりも何倍も速く作成でき、非常に効率的です。皆さんもAWS環境での検証、動作確認などには、LocalStackの導入を検討してみてはいかがでしょうか?