OPS

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

2024.06.05

本記事のポイント

クラウド環境でのアプリケーション開発が当たり前になりつつある現代において開発、検証プロセスの高速化、検証環境の低コスト化はチームの生産性向上、企業の利益拡大においてとても重要です。
本記事ではAWS検証環境をローカルに用意することができるLocalStackをTerraformとDockerを用いて使用する方法についてご紹介します。

 

はじめに

Amazon Web Services(以下、AWS)を利用している皆様の中には検証環境を用意する工数や費用にお困りの方や、簡単な検証なのに逐一マネジメントコンソールに接続しリソース作成をしなければならないのが手間と感じている方は多くいらっしゃるのではないでしょうか。
そこで今回は、AWS検証環境をローカル環境に簡単に用意することができるLocalStackを
ご紹介いたします!

記事前半ではLocalStackの概要・メリットを、後半では実際にLocalStackを使用して
ローカル環境にAWS検証環境を作成する方法についてお伝えします。
また今回検証環境の作成にはTerraform、Dockerを使用いたしますのでそれらのサービスにご興味がある方もぜひご覧ください。

AWSが8%OFFになる請求代行

LocalStackとは?

まず、LocalStackの概要についてお伝えします。
LocalStackはローカル環境に検証用のAWSリソースを用意することができるモックフレームワークです。
Lambda関数やS3バケットなどの主要なAWSリソースの多くを無料で用意することができ、ローカル環境で動作の確認を行うことができます。※一部有料のリソースも存在します。

LocalStackのメリット

続いて、LocalStackのメリットについてご紹介したいと思います。
メリットは大きく以下の三つです。

  • AWSアカウントの登録が不要。
  • ローカル環境に構築するためAWS利用料金を気にせず検証や動作確認が可能。
  • CI/CDパイプラインを利用して環境、リソースの構築が可能。

  • 具体的には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の利用料が割引でご利用いただけます。

    AWSが8%OFFになる請求代行 利用料の割引だけでなく様々な無料特典もつき、システム構築や監視・運用、セキュリティサポートなど各種オプションサービスもご用意しておりますので、まずはお気軽にご相談ください。

    JIG-SAW OPS AWS