awsのPaaSを使う開発をしたいときにローカルでの開発環境構築やCI等のために localstack を使うことが多いのでメモがてらミニマムな設定を書いておく。
やりたいこと
- インストールや手動でのコマンド実行無しで必要な環境が構築できること
- ローカルPCやCIなど実行環境に依存せず同じものが同じ手順で起動できること
ひつようなもの
- docker, docker-compose(v2)
やっていること
まずlocalstackの設定。
古い記事を見るとs3やkinesisなどサービスごとにポートが設定されておりそれぞれでポートを開けてあげると書いてあったりするが、2022.03月時点においてはすべてのエンドポイントが4566番ポートに集約されているので最低限では4566番だけでよい。
version: "3" services: localstack: image: localstack/localstack:0.12.17 environment: - AWS_ACCESS_KEY_ID=dummy - AWS_SECRET_ACCESS_KEY=dummy - DEFAULT_REGION=ap-northeast-1 - SERVICES=kinesis,dynamodb,cloudwatch ports: - 4566:4566
意図的にサービスごとにポートを分けたいなら以下のように環境変数を設定しつつ同じ番号でポート開放の設定を書いてあげればよい。
environment: - S3_PORT_EXTERNAL=3333 - KINESIS_PORT_EXTERNAL=4444 ports: - 3333:3333 - 4444:4444
さらに、大抵の開発においてはawsのローカル環境があるだけだとダメでリソースも作成する必要がある。
その際には以下のように localstack
に依存する形で aws cliコンテナ でリソースを作成するとよい。以下例はkinesisのstreamを作成するもの。
ENTRYPOINTが /usr/local/bin/aws
になっているため COMMANDにはaws cliの引数を与える形となっている。
localstackに接続したいので --endpoint-url
にlocalstackのコンテナホストとポートを指定している。
またlocalstackが起動してからhttpリクエストを受け付けられうようになるまでラグがあるので deploy
を指定し成功するまでコマンドを叩き続けるような挙動になっている。もしかしたらlocalstackコンテナのヘルスチェック設定とかを書くほうがスマートかもしれない。またこの書き方をしている場合、docker-composeのv2以上が必要となる。
localstack-aws-cli-create-kinesis: # localstackにkinesis streamを作成する image: amazon/aws-cli environment: - AWS_ACCESS_KEY_ID=dummy - AWS_SECRET_ACCESS_KEY=dummy - AWS_DEFAULT_REGION=ap-northeast-1 depends_on: - localstack deploy: restart_policy: condition: on-failure delay: 1s max_attempts: 10 window: 10s command: --endpoint-url=http://localstack:4566 kinesis create-stream --stream-name awesome_stream --shard-count 1
もっと複雑なことがしたかったら create_local_resource.sh
みたいなbashスクリプトを作成しておき、entrypointに当該スクリプトを指定してあげるのが良いと思われる。