ローカルPCでどうしてもAWS環境を作りたい(LocalStack)
はじめに
表題通りで、アカウント作るわけではないけどAWS環境を作ってイジイジしたいという欲があったのでLocalStackを触ってみました。
LocalStackとは
LocalStackとはローカルマシン上にAWS環境をエミュレートできるという素敵なクラウドサービスエミュレーターです。
料金を気にせず使えるのでとても嬉しいです。
環境を作る前に前提
いくつか遊び方はあるのですが、大きく分けると
-
awscli-localを入れて、各サービスを作っていく -
terraformでサービスを作成する
があるかと思います。今回は2番でやってみましょう!
始める前に、ローカル環境に
-
Docker/Docker Composeが使える環境がある -
Terraformが使える
が前提になります!
今回はS3のバケットを作るところまでやってみます。
フォルダ構成
こんな感じの構成にします。
.
├── terraform/
│ ├── main.tf
│ ├── provider.tf
│ └── variables.tf
├── docker-compose.yml
└── .env
Dockerコンテナの作成
一応公式のGithubにdocker composeファイルがあります。
これを参考にしつつ、今回用に作成します。
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があるのでそれを利用します。
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