LocalStack × Terraform × DockerでAWSローカル環境を作成する方法とは?
2024.06.05
クラウド環境でのアプリケーション開発が当たり前になりつつある現代において開発、検証プロセスの高速化、検証環境の低コスト化はチームの生産性向上、企業の利益拡大においてとても重要です。
本記事ではAWS検証環境をローカルに用意することができるLocalStackをTerraformとDockerを用いて使用する方法についてご紹介します。
はじめに
Amazon Web Services(以下、AWS)を利用している皆様の中には検証環境を用意する工数や費用にお困りの方や、簡単な検証なのに逐一マネジメントコンソールに接続しリソース作成をしなければならないのが手間と感じている方は多くいらっしゃるのではないでしょうか。
そこで今回は、AWS検証環境をローカル環境に簡単に用意することができるLocalStackを
ご紹介いたします!
記事前半ではLocalStackの概要・メリットを、後半では実際にLocalStackを使用して
ローカル環境にAWS検証環境を作成する方法についてお伝えします。
また今回検証環境の作成にはTerraform、Dockerを使用いたしますのでそれらのサービスにご興味がある方もぜひご覧ください。
LocalStackとは?
まず、LocalStackの概要についてお伝えします。
LocalStackはローカル環境に検証用のAWSリソースを用意することができるモックフレームワークです。
Lambda関数やS3バケットなどの主要なAWSリソースの多くを無料で用意することができ、ローカル環境で動作の確認を行うことができます。※一部有料のリソースも存在します。
LocalStackのメリット
続いて、LocalStackのメリットについてご紹介したいと思います。
メリットは大きく以下の三つです。
具体的にはLocalStack用のDockerイメージが公開されているため環境の構築が容易かつ
用意したコンテナにTerraformを利用してAWSリソースを構築することができるため
複数人で同一のテスト環境を再現することや、リソースの作成、削除などビルドサイクルの
高速化が可能です。
LocalStack×Terraform×Docker実践
それでは実際にLocalStackを利用してみましょう。
今回はまずDocker-Composeを利用してコンテナ上にLocalStack環境を構築します。
次に構築したLocalStack環境にTerraformでS3バケットを作成し
最後にAWS CLI,Pythonを使って動作検証を実施してみます。
4-1.前提事項
今回使用する環境、パッケージは以下です。
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 |
4-2.環境構築
まずはLocalStack環境をDockerコンテナを使用して構築します。
今回dockerコンテナの作成にはDocker-Composeを使用します。
4-2-1.LocalStackのインストール
Python3.11.4を導入後以下のコマンドでLocalStackをインストールします。
※pythonのインストールにはpyenvを使用し一般ユーザーに仮想環境を立ち上げています。
$ pip install localstack
4-2-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
4-2-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環境の構築が完了しました。
4-3.LocalStackにAWSリソースを作成
続いて4-2で作成したLocalStack環境にAWSリソースを作成していきたいと思います。今回リソースの作成にはTerraformを使用していきます。4-3-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
4-3-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バケットの構築が完了しました。
4-4.動作検証
作成したS3バケットの確認をしていきます。
今回検証にはAWS CLIとpythonのboto3ライブラリを使用していきます。
4-4-1.AWS CLI
以下のコマンドでAWS CLIをインストールします。
$ pip install awscli
続いて構成プロファイルを作成します。
4-3-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
4-3-2で作成したmain.tfに記載したバケット名が出力されていれば成功です!
4-4-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
こちらも4-3-2で作成したmain.tfに記載したバケット名が出力されていれば成功です!
参考サイト
LocalStack公式ドキュメント
Docker公式ドキュメント
Terraform公式ドキュメント
まとめ
今回はLocalStackを使用してAWS検証環境をローカル環境に用意する方法についてご紹介いたしました。またDocker、Terraformを駆使することで検証環境をスピーディに用意できることもご紹介させていただきました。
環境構築さえできてしまえば後はTerraform定義ファイルを更新することでリソースの追加や削除をすることができます。AWSマネジメントコンソールでリソースを追加、削除するよりも何倍も速く作成することが可能ですので皆さんもAWS環境での検証、動作確認などにLocalStackの導入を検討してみてはいかがでしょうか?
また、JIG-SAWからAWSをご契約いただくとAWSの利用料が割引でご利用いただけます。
利用料の割引だけでなく様々な無料特典もつき、システム構築や監視・運用、セキュリティサポートなど各種オプションサービスもご用意しておりますので、まずはお気軽にご相談ください。