MacOS環境にてvirtualbox+dockerでlocalstackを設定してみた

localstackを使ったテストをするため、MacOS環境上でVirtualBoxを使ったDocker環境のセットアップを行いました。VirtualBoxを利用した際のホストOSからゲストOSへのアクセスは結構なハマりどころで、アクセス方法も含めてまとめました。
2020.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSを利用したロジックのテストにlocalstackを使おうと試していましたが、MacOS上での設定がドキュメント通りにはうまくいかず、port mapping等でなかなか進まない状態でした。

結構な時間振り回されたものの無事設定が完了したので、実際の手順を備忘録含めて残すことにしました。

localstackのリポジトリについて

以下の2つのリポジトリの存在を確認していますが、推奨されるのは後者です。

  • atlassian/localstack
  • localstack/localstack

atlassian/localstackのREADMEにも

This repository is no longer actively maintained.

とあります。アップデートに追従するために大事なことです。

localstack/localstackのセットアップ

Dockerを使うかどうかで変わります。使わない場合にはpypiのライブラリの導入となります。その際に問題点として考えられるのは、CICDを外部サービスに依存している場合に実行毎にlocalstackのインストールも実施した結果、大幅に時間が延びる可能性です。

今回はDockerを使うケースにて行います。既にDockerをセットアップ済みの場合はDockerComposeを実行まで飛ばしても構いません。

HomeBrewでの依存ライブラリインストール

brew update
brew cask install virtualbox docker-toolbox

docker関連のライブラリはdocker-toolboxでインストールされます。

VirtualBox上にマシンを作成

docker-machine create --driver virtualbox default

DockerComposeを実行

以下の内容でdocker-compose.ymlを作成します。記事執筆時点でのlocalstack/localstackのdocker-compose.ymlの中身をそのまま持ってきています。

version: '2.1'
services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
    image: localstack/localstack
    ports:
      - "4566-4599:4566-4599"
      - "${PORT_WEB_UI-8080}:${PORT_WEB_UI-8080}"
    environment:
      - SERVICES=${SERVICES- }
      - DEBUG=${DEBUG- }
      - DATA_DIR=${DATA_DIR- }
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
      - KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- }
      - DOCKER_HOST=unix:///var/run/docker.sock
      - HOST_TMP_FOLDER=${TMPDIR}
    volumes:
      - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

docker-compose.ymlのあるフォルダ内にて実行します。

% 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

ゲストOSのlocalstackにアクセス

手順としてlocalhost0.0.0.0へのアクセスにしているケースもありますが、VirtualBoxを経由しているためdocker-machineにてvirtualboxのIPを確認する必要があります。

% docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5

今回はhttp://192.168.99.100:8080/にて、専用のWebUIにアクセスが可能となります。

また、localstackを通じたawsのテストについては、0.11.0よりportが4566に統一されています。これについても、今回はhttp://192.168.99.100:4566となります。

% curl http://192.168.99.100:4566
{"status": "running"}

あとがき

localstackのセットアップを行う中でDocker内へのアクセスが全く上手く行かない状態が続き、

  • ポートマッピングがうまく行っているか
  • Docker内では正常にアクセスができるのか
  • ポート指定はあっているのか

等只管確認をしていましたが、中々うまくいきませんでした。その中で以下の記事にたどり着き、VirtualBoxの存在を忘れていたことに気が付きました。

Macでdockerを使う際にlocalhostでcontainerに繋げない問題の調査 - Qiita

Docker環境構築でうまく行かない場合の参考になれば幸いです。