👟

LocalStackを起動するときに初期化処理を行う(Initialization hooksについて)

2023/04/29に公開

LocalStack を起動するときに初期化処理を行う(Initialization hooks について)

みなさん、LocalStack を使ってますか?
LocalStack はローカル環境で擬似的な AWS 環境を作成し、開発、動作確認ができるツールです。
そんな便利な LocalStack ですが、例えば Docker 起動時に自分でカスタマイズをして何らかの処理を挟んだ状態で起動したい場合がありました。
そんな時は、LocalStack の Initialization hooks 機能を利用できます。
結論、基本的な使い方などドキュメントを見れば載っているのですが、あまり日本語の記事を見つけられなかったので、自分のユースケースでの実行方法などを共有できればと思います。

公式ドキュメント
https://docs.localstack.cloud/references/init-hooks/

Initialization hooks とは

LocalStack は4つのライフサイクルフェーズを持っています。

  • BOOT:コンテナは起動してるが LocalStack はまだ開始していない状態
  • START:Python が起動し、LocalStack も起動してる状態
  • READY:LocalStack がリクエストを受け取る準備ができた状態
  • SHUTDOWN:LocalStack がシャットダウンしてる状態

Initialization hooks は上記それぞれのタイミングで任意のシェルスクリプト、もしくは Python スクリプトを実行できる機能です。

使い方

各ライフサイクルにおける実行 Script は /etc/localstack/init に配置されています。なのでコンテナを起動するときに自分が操作したいフェーズに対してスクリプトをマウントすると起動時に実行してくれます。

例えば自分がやりたかったこととしては、起動時に SNS のトピック作成をしてほしい、というものでした。

トピック作成をする場合は、例えば下記のコマンドを実行する必要があります。

awslocal sns create-topic --name test-topic

なので、今回のケースで言うと READY 状態の時に上記コマンドが実行できると良さそうです。

1. 初期化処理のスクリプトを配置する

今回は開発してるプロジェクト内に以下のような構成でスクリプトを配置しました。

├── docker
│   └── localstack
│       └── init-aws.sh

スクリプトの中身は下記のように、トピック作成のみを行なっています。

#!/bin/bash

echo "SNS setup start"

awslocal sns create-topic --name test-topic

echo "SNS setup done"

2. docker-compose.yml を修正

docker-compose.yml に以下の記載を追記します。下記はREADY状態の時に実行されるディレクトリに配置しております。

volumes:
      - ./docker/localstack/init-aws.sh:/etc/localstack/init/ready.d/init-aws.sh

3. Docker を起動

そして Docker を起動します。この時、ドキュメントにもあるのですが、実行権限がないとエラーになってしまいます。

Make sure the script is executable: run chmod +x init-aws.sh on the file first.

なので、作成したファイルに実行権限を与えておき、Docker を起動します。
起動後、Docker のログを見ると下記のように表示されており、自身が作成したスクリプトが実行されていることがわかります。

SNS setup start
<!-- 起動時のログ -->
2023-04-29T05:25:49.846564266Z 2023-04-29T05:25:49.846  INFO --- [   asgi_gw_0] localstack.request.aws     : AWS sns.CreateTopic => 200
2023-04-29T05:25:49.851384449Z {
2023-04-29T05:25:49.851642194Z     "TopicArn": "arn:aws:sns:ap-northeast-1:000000000000:test-topic"
2023-04-29T05:25:49.851660568Z }
2023-04-29T05:25:49.917789120Z SNS setup done

これで、Docker 起動時にトピック作成を自動で行うことができました 🙌

まとめ

今回は LocalStack における Initialization hooks の使い方の一部を紹介しました。
ドキュメントには他にもいろんな使い方が載ってるので、一通り眺めてみると自身にあった使い方が見つかるかもしれません。
やっぱりドキュメント読むの大事、と言うのを改めて実感しました。

参考

https://zenn.dev/dove/articles/c0bc8aca695f07

Discussion