production.log

株式会社リブセンスでエンジニアをやっている星直史のブログです。

LocalStackのインストールからDocker Composeで動かすまでの手順

概要

以前ServerlessFrameworkでLambdaからDynamoDBを呼び出す処理を書いていました。しかしServerlessFramework単体だと修正, デプロイ, 動作確認のビルドライフサイクルが遅くなる問題があります。 今回は、その問題を解消すべく、LocalStackのインストールからDocker Composeで動かすまでの手順について紹介します。

LocalStackとは

LocalStackは、AWSの主要サービスのモックをローカル環境で動作させるツールです。

現在モックとして提供できるサービスはこちらです。

API Gateway, Kinesis, DynamoDB, DynamoDB Streams, Elasticsearch, S3, Firehose, Lambda, SNS, SQS, Redshift, ES (Elasticsearch Service), SES, Route53, CloudFormation, CloudWatch, SSM, SecretsManager

AWSのモックサービスをローカルに立てることで下記のようなメリットがあります。

  • ローカルでビルドライフサイクルを回すことができるため、コードの修正とテストの反復を高速に行える
  • AWS利用料を支払わなくて済む

インストール

Dockerのインストール

今回はLocalStackをDocker(Docker Compose)で動かします。

docs.docker.com

Docker for Macの場合、Dockerのインストールと共にDocker Composeが使用可能になります。

プロファイル設定

LocalStack用のクレデンシャル情報を作成します。アクセスキーとシークレットアクセスキーは"dummy"のような感じで問題ありません。

$ aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-east-1
Default output format [None]: text

$ cat ~/.aws/credentials
[localstack]
aws_access_key_id = dummy
aws_secret_access_key = dummy

$ cat ~/.aws/config
[profile localstack]
region = us-east-1
output = text

LocalStackのインストールと設定

LocalStackは単純にgit cloneを行うだけです。

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

Macを使用している場合、起動時に共有パスの設定をする必要があります。具体的なエラーは下記の通りです。

ERROR: for localstack Cannot start service localstack: b'Mounts denied: The path /var/folders/dx/dnnz2ft55rn2j7s6m0mbzkl80000gn/Tis not shared from OS X and is not known to Docker.You can configure shared paths from Docker -> Preferences... -> File Sharing.See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info..'

f:id:watasihasitujidesu:20181031084345p:plain

このエラーが出た場合はDockerマークをクリック => Preference => File Sharing => /var/foldersを設定し、Docker再起動で解決します。

また、LambdaがDocker環境で動作させるための環境変数を設定します。 .envファイルを作成し、下記の通り設定します。

#!/usr/bin/env bash
export LAMBDA_EXECUTOR=docker

編集が終わったらsource .envで環境変数を設定します。

動作確認

ブラウザ

最後Docker Composeで起動します。

docker-compose up

LocalStackの起動確認はブラウザからでも確認できます。 http://0.0.0.0:8080

aws コマンド

ブラウザからだけでなく、awsコマンドを実行した場合にLocalStackで起動したモックに対して操作ができるか確認します。

aws --endpoint-url=http://localhost:4569 dynamodb list-tables
{
    "TableNames": []
}

上記はDynamoDBのテーブル一覧を取得するコマンドですが、--endpoint-urlオプションを指定してローカルに向けています。 基本的には他のAWSサービスも--endpoint-urlを指定するだけです。

まとめ

git cloneして多少設定するだけで、AWSのモック環境がすぐに手に入りました。手軽にモック環境が手に入るのは、ローカルでスクリプトの修正と確認をするサイクルの高速化につながります。また、単純にAWS利用料金もかからないので、サクッと動作確認などしたい場合は有用なツールだと感じました。

ただ、デメリットとしてはAWS各サービスの操作は全てCLIとなります。 そのため、awsコマンドに慣れていなかったり知らない場合は、awsコマンド自体を覚えたり調べる時間がかかってしまいます。 AWSの公式ドキュメントを参照すればわかるのですが、結構な手間になると感じました。 継続的に使用する場合は、CloudFormationを使って自動化しておくと良いでしょう。