はじめに

開発用に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へ向けることで利用可能となります。

元記事はこちら

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