♻️

ローカルPCでどうしてもAWS環境を作りたい(LocalStack)

に公開

はじめに

表題通りで、アカウント作るわけではないけどAWS環境を作ってイジイジしたいという欲があったのでLocalStackを触ってみました。

LocalStackとは

LocalStackとはローカルマシン上にAWS環境をエミュレートできるという素敵なクラウドサービスエミュレーターです。
料金を気にせず使えるのでとても嬉しいです。

https://app.localstack.cloud/sign-in

環境を作る前に前提

いくつか遊び方はあるのですが、大きく分けると

  1. awscli-localを入れて、各サービスを作っていく
  2. terraformでサービスを作成する

があるかと思います。今回は2番でやってみましょう!
始める前に、ローカル環境に

  • Docker/Docker Composeが使える環境がある
  • Terraformが使える

が前提になります!
今回はS3のバケットを作るところまでやってみます。

フォルダ構成

こんな感じの構成にします。

.
├── terraform/
│   ├── main.tf
│   ├── provider.tf
│   └── variables.tf
├── docker-compose.yml
└── .env

Dockerコンテナの作成

一応公式のGithubにdocker composeファイルがあります。

https://github.com/localstack/localstack/blob/master/docker-compose.yml

これを参考にしつつ、今回用に作成します。

version: '3.8'

services:
  localstack:
    image: localstack/localstack:latest
    container_name: localstack
    environment:
      - SERVICES=s3
      - DEFAULT_REGION=${REGION}
      - EDGE_PORT=4566
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
    ports:
      - "4566:4566"

.envファイルは以下です。

AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
REGION=us-east-1

作成したら起動しましょう!

$ docker-compose up -d 

きちんとコンテナができていますね!

$ docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                    PORTS                                             NAMES
adaa3f6bd7f8   localstack/localstack:latest   "docker-entrypoint.sh"   54 seconds ago   Up 52 seconds (healthy)   4510-4559/tcp, 5678/tcp, 0.0.0.0:4566->4566/tcp   localstack

また使えるサービス一覧も確認できます。

curl -s "http://127.0.0.1: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.4.1.dev5"
}

少し解説します!

imageについて

ここは公式のDocker Imageがあるのでそれを利用します。

https://hub.docker.com/r/localstack/localstack

environmentについて

Dockerコンテナで使用する環境変数を入れています。
key情報などは、envファイルから持ってくるようにしています。

一応設定した環境変数が設定されていることがわかります。

$ docker exec -it localstack env
...
AWS_SECRET_ACCESS_KEY=test
SERVICES=s3
DEFAULT_REGION=us-east-1
EDGE_PORT=4566
AWS_ACCESS_KEY_ID=test
...

portsについて

4566について

  • 公式で4566がデフォルトのポートとして設定されている
  • 多くのドキュメントがこのポートになっているため今回も4566に設定

tfファイルの作成

provider.tf

プロバイダー設定(AWS)を定義するファイルで、LocalStackのAWSエミュレーション環境を指定してます。
var.XXXは後段のvariable.tfで定義したものを使用しています。

また認証系のskipを入れないと、実際のAWSアカウントを取得しに行ったりするので、skipの設定を入れておきます。

provider "aws" {
  region  = var.region
  access_key = var.access_key
  secret_key = var.secret_key
  endpoints {
    s3 = "http://localhost:4566"
  }
  
  # 認証情報の検証を skip
  skip_credentials_validation = true
  # AWSアカウントIDを取得を skip
  skip_requesting_account_id  = true
  # S3のエンドポイントを直接指定する設定を追加
  s3_use_path_style           = true
}

variable.tf

変数を定義するファイル

variable "region" {
  default = "us-east-1"
}

variable "access_key" {
  default = "test"
}

variable "secret_key" {
  default = "test"
}

main.tf

メインのリソース定義ファイル。今回はS3のバケットを作成するためのコードになっている。

resource "aws_s3_bucket" "test_bucket" {
  bucket = "test-bucket"
}

resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.test_bucket.bucket
  versioning_configuration {
    status = "Enabled"
  }
}

実行

いざスタート。

$ terraform init
$ terraform plan

> ...
> Plan: 2 to add, 0 to change, 0 to destroy.

$ terraform apply

確認

コンテナの中に入って確認します。確認する際はaws コマンドが awslocalになります。

$ docker exec -it localstack bash

$ awslocal s3 ls
2025-05-10 04:13:31 test-bucket

バケットできてる!

おわりに

こんな感じでお手軽にAWS環境をローカルに作れて練習できます!!

Discussion