非同期アーキテクチャでシステム構築を行う場合、メッセージブローカを導入するケースが多いと思います。最近では、クラウドのマネージドサービスとしてもメッセージブローカが提供されています。その一つにGCPのCloud Pub/Subがあります。今回は、Cloudデプロイ前にローカル開発をしやすくする方法として、Pub/SubエミュレータをPodとして動かす方法について紹介します。

Pub/Subエミュレータとは

GCPのドキュメントでも紹介されていますが、gcloudコマンドを使って、pubsub-emulatorをすることでローカルでの利用ができるようになります。Pod化しなくてよいケースは、こちらの方法を利用することで、そのまま利用が可能となります。こちらは、以前の記事を参照ください。

Pod化するためにコンテナを作る(探す)

kubernetsのPod化するためには、コンテナとして動作させる必要があります。1から作ってもよいのですが、今回は、Docker Hubで公開されている下記イメージを利用します。

https://hub.docker.com/r/singularities/pubsub-emulator

マニュフェスト例

マニュフェスト例を下記に示します。
※ 下記例は、Helmで管理しているファイルの一部です。

{{- $containerPort := 8432 -}}
apiVersion: v1
kind: Service
metadata:
  name: pubsub-emulator
spec:
  type: LoadBalancer
  selector:
    app: pubsub-emulator
  ports:
    - protocol: TCP
      port: 8085
      targetPort: {{ $containerPort }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub-emulator
spec:
  selector:
    matchLabels:
      app: pubsub-emulator
  template:
    metadata:
      labels:
        app: pubsub-emulator
    spec:
      containers:
        - name: pubsub-emulator
          image: singularities/pubsub-emulator
          imagePullPolicy: Always
          ports:
          - containerPort: {{ $containerPort }}
          env:
          - name: PUBSUB_PROJECT_ID
            value: local
          - name: PUBSUB_LISTEN_ADDRESS
            value: 0.0.0.0:8432
※1.環境変数(PUBSUB_PROJECT_ID, PUBSUB_LISTEN_ADDRESS)については、GCPのドキュメントで公開されているものと同じになります。
※2.こちらのPodは、永続化ディスクをマウントしていないので、Podを停止するとメッセージは、削除されます。メッセージを永続化したい場合には、/opt/dataにボリュームをマウントする必要があります。詳しくは、ドキュメントを参考にしてください。

注意事項

gcloudコマンドでは、pubsubエミュレータの挙動を制御することはできません。そのため、アプリケーション側でトピック、サブスクライバーがある前提でソースコードを書いている場合には、予め作成しておく必要があります。初期化するジョブのマニュフェスト例を下記に示します。

apiVersion: batch/v1
kind: Job
metadata:
  name: pubsub-emulator-init
spec:
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - image: {{ .Values.init.container.image }}:{{ .Values.container.tag }}
        name: pubsub-emulator-init
        env:
        - name: PUBSUB_EMULATOR_HOST
          value: 'pubsub-emulator:8085'
        - name: PUBSUB_PROJECT_ID
          value: 'local'
        - name: PROJECT_ID
          value: 'local'
        - name: TOPIC_ID
          value: "test-msg-topic"
        - name: SUBSCRIPTION_ID
          value: "test-msg-subscription"

今回は、GCPでよく利用されるメッセージブローカサービスの一つであるPub/SubをPod化する方法について紹介しました。PubSubをシンプルにPod化しておくことで、ローカルでの開発がやりやすくなります。クラウド上でいきなり開発を開始するよりも、手軽にコストをかけずに利用できるので、興味があるかたは、導入してみてください。