/var/log/jsoizo

メモ帳 技術とか趣味とか

localstackを使って開発するときのテクニック

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に当該スクリプトを指定してあげるのが良いと思われる。

参考

docs.localstack.cloud