概要
以前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)で動かします。
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..'
このエラーが出た場合は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を使って自動化しておくと良いでしょう。