Posted at

ローカル上にLocalStackをDockerで実行


はじめに

開発用にAWSのサービスをローカル環境に構築できる、LocalStackというプロジェクトがあります。

https://github.com/localstack/localstack

今回はDockerを使ったLocalStackの実行方法をまとめます。


環境

OS: macOS Mojave 10.14.5

Docker: 18.09.0

Docker Compose: 1.23.2


プロジェクトをプル

git clone https://github.com/localstack/localstack.git

cd localstack/


サービスの指定

環境変数 SERVICES にカンマ区切りでサービス名を指定することで起動させたいサービスを選ぶことができます。

指定がない場合、全て指定と同意です。

指定できるサービスは以下の通り

サービス
サービス名
エンドポイント

API Gateway
apigateway
http://localhost:4567

Kinesis
kinesis
http://localhost:4568

DynamoDB
dynamodb
http://localhost:4569

DynamoDB Streams
dynamodbstreams
http://localhost:4570

Elasticsearch
elasticsearch
http://localhost:4571

S3
s3
http://localhost:4572

Firehose
firehose
http://localhost:4573

Lambda
lambda
http://localhost:4574

SNS
sns
http://localhost:4575

SQS
sqs
http://localhost:4576

Redshift
redshift
http://localhost:4577

ES (Elasticsearch Service)
es
http://localhost:4578

SES
ses
http://localhost:4579

Route53
route53
http://localhost:4580

CloudFormation
cloudformation
http://localhost:4581

CloudWatch
cloudwatch
http://localhost:4582

SSM
ssm
http://localhost:4583

SecretsManager
secretsmanager
http://localhost:4584

StepFunctions
stepfunctions
http://localhost:4585

CloudWatch Logs
logs
http://localhost:4586

STS
sts
http://localhost:4592

IAM
iam
http://localhost:4593

EC2
ec2
http://localhost:4597

※ サービス名はaws cliのリファレンスから

http://docs.aws.amazon.com/cli/latest/reference/#available-services


注意点: Dockerに割り当てるメモリが少ないと正しく起動しない

Dockerへのメモリ割り当てが少ないと、指定した全てのサービスが正しく実行されないことがあります。

例えば、以下のような elasticsearch の起動で実行エラーが発生します。

...

WARNING:infra.py: Service "elasticsearch" not yet available, retrying...
ERROR:infra.py: Error checking state of local environment (after some retries): Traceback (most recent call last):
...

だいたいメモリを 4 GB にすれば全てのサービスが実行できました。

多くのサービスを実行させたいときは、割り当ての量を増やすか、増やせないときは最小のサービスを指定して実行が必要です。


Dockerで実行


Docker Composeを実行

TMPDIR=/private$TMPDIR \

DATA_DIR=/tmp/localstack/data \
SERVICES=apigateway,kinesis,dynamodb,dynamodbstreams,elasticsearch,s3,\
lambda,sns,sqs,redshift,es,ses,route53,cloudformation,cloudwatch,\
ssm,secretsmanager,stepfunctions,logs,sts,iam,ec2 \
docker-compose up -d

TMPDIR : Macの場合は指定が必須

DATA_DIR : データの永続化のために指定

SERVICES : 実行するサービスを指定 (全てのサービスを実行する際は指定はいらない。上ではサンプルとして全てを列挙)

バックグランドで実行のために -d オプションをつけています。

ログの最後に Ready と出れば、起動完了です。

すると、デフォルトではDocker上に localstack_localstack_1 という名前でプロセスが実行されていると思います。


ホストOS起動時に自動で実行するように設定

ホストOSが再起動した際も自動で実行されるよう設定値を変更します。

docker update --restart=always localstack_localstack_1


まとめ

これでAWSサービスをローカルで利用できる環境が整いました。

あとは、CLIやSDKで、各サービスのエンドポイントをLocalStackへ向けることで利用可能となります。