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