Serverless Frameworkを使って構築したLambda関数のローカル開発環境で、LambdaからS3を操作する関数を開発したい。AWS上のS3を直接操作してもいいが、せっかくなのでローカルで完結する環境を構築する。
ローカルでS3をエミュレートするためのツール
ローカルでS3をエミュレートするためのツールとしては、
- LocalStack
- MinIO
- S3rver
あたりがあるようだが、今回はLocalStackを使用する。
事前準備
Dockerが必要なので事前に使えるようにしておく。
自宅で使っているPCはWindows 10 Homeのため、Docker Desktop for Windowsが使えない。調べてみたらDocker Tookboxというツールを使えばいいようなので、インストールする。(参考:@idani氏のwindows 10 home で docker を導入するメモ)
LocalStackを使用するための設定
プロジェクトディレクトリの直下にdocker-compose.ymlを作成し、LocalStackのDockerイメージの定義を記述する。
version: '3'
services:
localstack:
image: localstack/localstack
ports:
- "4572:4572"
environment:
- SERVICES=s3
- DATA_DIR=/var/localstack/data
volumes:
- "./.localstack/data:/var/localstack/data:rw"
LocalStackは様々なAWSのコンポーネントをエミュレートできるが、今回はS3だけ使うのでS3に限定した定義にする。
portsはS3の使用ポート4572のみ、SERVICESもS3のみにする。
データの永続化のためDATA_DIRを定義する。
LocalStackの実行
Docker Toolboxの「Docker Quickstart Terminal」を起動し、そこからdocker-compose.ymlがあるディレクトリに移動し、docker-compose up
を実行して起動する。初回はlocalstackが自動でダウンロードされる。
$ docker-compose up
Creating network "helloworld_default" with the default driver
Pulling localstack (localstack/localstack:)...
(略)
Status: Downloaded newer image for localstack/localstack:latest
(略)
localstack_1 | Starting mock S3 (http port 4572)...
(略)
localstack_1 | 2020-02-14T13:43:37:WARNING:infra.py: Service "s3" not yet available, retrying...
本当はReady.
と表示されて起動完了のはずだが、なぜかWARNINGが。
とりあえず、CLIでアクセスできるか試してみる。
なお、エンドポイントの「192.168.99.100」はDocker Toolboxが動いているVirtualBox仮想マシンのIPアドレス。
Docker Desktopの場合は「localhost」でアクセスできる。
>aws --endpoint-url=http://192.168.99.100:4572 s3 mb s3://sample-bucket
make_bucket: sample-bucket
>dir > hoge.txt
>aws --endpoint-url=http://192.168.99.100:4572 s3 cp hoge.txt s3://sample-bucket
upload: .\hoge.txt to s3://sample-bucket/hoge.txt
>aws --endpoint-url=http://192.168.99.100:4572 s3 ls s3://sample-bucket
2020-02-14 22:58:13 2641 hoge.txt
問題なく、バケットの作成、ファイルの保存ができた。
(ちなみに、2回目に起動したら相変わらずWARNINGは出たが、Ready.も出た。)