これは旧eviry tech blogから移行した記事です。
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がキレイなのも好印象です。
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のサービスに対応しているので、そちらを利用する際には積極的に利用していきたいと思います。