2018/11/06 - 13:27

Localstack/Minioを使ってAWS Kinesis Firehose/S3のローカル開発環境をdockerで構築する

:

:

:

kamui trackerのエンジニアのkawashigeです。

kamui trackerでは現在アプリケーションの更改の設計を進めており、その中でAWS Kinesis Firehoseを利用することになりました。
AWSのマネージメントサービスは便利なのですが、ローカルでの開発環境をどう構築するかという点が課題になります。
そこで今回はLocalstackとMinioを使ってFirehoseの開発環境をローカルで構築することにしました。

Localstackとは?

LocalstackはAWSのサービスのモックをCIや開発環境で構築するためのツールで、Firehose以外にもLambdaなど色々なサービスのモックを起動することができます。
Atlassianが開発しているので今後の機能拡充やサポートも期待できそうです。

https://github.com/localstack/localstack

Minioとは?

Minioはクラウドストレージのサービスを構築できるツールで、S3互換のストレージサーバーを起動できるツールです。
データを参照できるUIがキレイなのも好印象です。

https://www.minio.io/

LocalstackにもS3のモックツールはあるのですが、データを永続化させた場合の方法がRecord&Replayによる方式である点がローカルの開発環境として利用する際に目的に合わないと考え、今回はMinioをS3のモックツールとして使用することにしました。

構築方法

Localstack、Minioともにdockerイメージが存在するためそちらをもとにdocker-compose.ymlで起動の設定を記述します。

version: '2'
volumes:
  minio:
    driver: 'local'
services:
  minio:
    container_name: minio
    image: minio/minio
    tty: true
    environment:
      - MINIO_ACCESS_KEY=1234
      - MINIO_SECRET_KEY=12345678
    command: server /data
    expose:
      - 9000
    ports:
      - 9000:9000
    volumes:
      - minio:/data
  firehose:
    container_name: firehose
    image: localstack/localstack
    environment:
      - SERVICES=firehose,s3:9000
      - HOSTNAME=minio
      - AWS_ACCESS_KEY_ID=1234
      - AWS_SECRET_ACCESS_KEY=12345678
    ports:
      - 8080:8080
      - 4573:4573
  • Minioのデータは永続化するためローカルのvolumeを設定
  • LocalstackはS3をSERVICESにMinioのポートを指定し、HOSTNAMEにMinioのホスト名を指定する

LocalstackのS3の設定は最初S3_BACKENDで外部のエンドポイントのURLを指定できると記載があったので、その設定で試行錯誤していたのですがうまく行かなかったため、SERVICES/HOSTNAMEを用いて設定を行うようにしました。

疎通確認

上記設定ファイルからdocker-composeでdockerを起動し疎通確認を行います。

Minioにバケットを作成

Minioにデータ連携用のバケットを作成します。
エンドポイントはdocker上のMinioを指定します。
認証情報はdocker-domposeで設定したACCESS_KEY/SECRET_KEYを設定します。

aws s3api create-bucket \
  --bucket=test-bucket \
  --profile=minio \
  --endpoint-url=http://localhost:9000 

Forehoseの設定

Localstack上のFirehoseに配信ストリームを設定します。
エンドポイントはdocker上のLocalstackのFirehoseを指定します。 認証情報はダミーでOKです。

aws firehose create-delivery-stream \
  --endpoint=http://localhost:4573 \
  --delivery-stream-name localstack-test \
  --profile=localstack \
  --region=ap-northeast-1 \
  --s3-destination-configuration=file://./firehose_s3_destination.json

firehose_s3_destination.jsonには配信先S3の情報を入れておきます。

{
  "BucketARN": "test-bucket",
  "Prefix": "firehose",
  "RoleARN": "arn:aws:iam::dummy:role/dummy"
}

Firehoseにデータ投入

docker上のFirehoseにデータを投入します。

aws firehose put-record \
  --delivery-stream-name=localstack-test \
  --record Data="test data" \
  --endpoint=http://localhost:4573 \
  --profile=localstack \
  --region=ap-northeast-1

上記コマンドを実行後、Minioで確認するとデータが連携されていることが確認できます。

所感

ステージング環境でAWSでのテストを行うとはいえ、開発環境でAWSのモックを利用して開発できるのは便利です。
localstackは今回使用したFirehose以外にもAWSのサービスに対応しているので、そちらを利用する際には積極的に利用していきたいと思います。