ElasticMQ+Minioの活用について

本稿はJCB Advent Calendar 2022の12/22の記事です。

JCBデジタルソリューション開発部の森口です。アプリチームに所属しており、担当するサービスの開発・保守運用を行っています。

今回はElasticMQとMinioの活用についてご紹介します。

はじめに

私が関わっているプロジェクトでは、社内の別システムとデータ連携するために、JDEP外に構築された非同期ファイル連携基盤(Amazon SQS+Amazon S3で実装)を使用します。 開発環境では、直接この環境を利用できないため、ElasticMQとMinionを使い、擬似的にAmazon SQSとAmazon S3を使用できるようにしました。

ElasticMQとは

Amazon SQSと互換性のあるメッセージキューイングサービスです。

Minioとは

Amazon S3と互換性のあるストレージサービスです。

構成について

今回GKE内のPodからアクセスしたい為、GKE上に構築しました。
GKEマニフェストについては、以下になります。

Deployment

ElasticMQ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticmq
spec:
  selector:
    matchLabels:
      app: elasticmq
  template:
    metadata:
      labels:
        app: elasticmq
    spec:
      containers:
        - name: elasticmq
          imagePullPolicy: Always
          image: elasticmq
          ports:
            - containerPort: 9324
          resources:
            limits:
              cpu: 800m
              memory: 512Mi
            requests:
              cpu: 200m
              memory: 512Mi
          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 20"]
      terminationGracePeriodSeconds: 30

Minio

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticmq
spec:
  selector:
    matchLabels:
      app: elasticmq
  template:
    metadata:
      labels:
        app: elasticmq
    spec:
      containers:
        - name: elasticmq
          imagePullPolicy: Always
          image: elasticmq
          ports:
            - containerPort: 9324
          resources:
            limits:
              cpu: 800m
              memory: 512Mi
            requests:
              cpu: 200m
              memory: 512Mi
          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 20"]
      terminationGracePeriodSeconds: 30

Service

ElasticMQ

apiVersion: v1
kind: Service
metadata:
  name: elasticmq
spec:
  selector:
    app: elasticmq
  type: ClusterIP
  ports:
    - name: app
      port: 9324
      targetPort: 9324
    - name: manage
      port: 9325
      targetPort: 9325

Minio

apiVersion: v1
kind: Service
metadata:
  name: minio
spec:
  selector:
    app: minio
  type: ClusterIP
  ports:
    - name: app
      port: 9000
      targetPort: 9000
    - name: manage
      port: 9001
      targetPort: 9001

使用したDockerfileは以下になります。

Dockerfile

ElasticMQ

FROM softwaremill/elasticmq:latest

Minio

FROM minio/minio:latest

ENV MINIO_ROOT_USER=minio
ENV MINIO_ROOT_PASSWORD=password

ENTRYPOINT ["minio", "server", "/data", "--console-address", ":9001"]

動作確認

実際にPodへポートフォワードを行い、下記のコマンドで動作確認しました。

ElaticMQにメッセージの登録

# クレデンシャル
export AWS_ACCESS_KEY_ID=minio
export AWS_SECRET_ACCESS_KEY=password
export AWS_DEFAULT_REGION=ap-northeast-1

export SQS_ENDPOINT_URL="http://localhost:9324/"
export SQS_QUEUE_URL="http://localhost:9324/000000000000/test.fifo"

# キューを作成
aws sqs create-queue --endpoint-url $SQS_ENDPOINT_URL --queue-name ${SQS_QUEUE_URL##*/} --attributes '
{
    "FifoQueue": "true",
    "ContentBasedDeduplication": "true"
}
'
# メッセージを送信
aws sqs send-message --endpoint-url $SQS_ENDPOINT_URL --queue-url $SQS_QUEUE_URL --message-group-id testgroup --message-body '
{
    "msg": "test"
}
'

ElasticMQのダッシュボードからもメッセージが送付されていることが確認できます。

ElasticMQダッシュボード

Minioにファイルアップロード

# クレデンシャル
export AWS_ACCESS_KEY_ID=minio
export AWS_SECRET_ACCESS_KEY=password
export AWS_DEFAULT_REGION=ap-northeast-1

export S3_ENDPOINT_URL="http://localhost:9000"
export S3_SEND_BUCKET_NAME="test-bucket"

# バケットを作成
aws s3api create-bucket --endpoint-url $S3_ENDPOINT_URL --bucket $S3_SEND_BUCKET_NAME
aws s3api put-bucket-versioning --endpoint-url $S3_ENDPOINT_URL --bucket test-bucket --versioning-configuration Status=Enabled

# minioにファイルを配置する
aws s3api put-object --endpoint-url $S3_ENDPOINT_URL --bucket $S3_SEND_BUCKET_NAME --key testfile --body ./testfile

Minioのダッシュボードからもファイルが配置されていることが確認できます。

Minioダッシュボード

まとめ

今回、ElasticMQとMinioを使用する事によって、開発環境でも迅速に使えるようになりました。

最後になりますが、JCBでは我々と一緒に働きたいという人材を募集しています。
詳しい募集要項等については採用ページをご覧下さい。


本文および図表中では、「™」、「®」を明記しておりません。
Google Cloud, GCPならびにすべてのGoogleの商標およびロゴはGoogle LLCの商標または登録商標です。

アマゾン ウェブ サービス、Amazon Web Services、Amazon SQS、Amazon S3は、Amazon.com, Inc.またはその関連会社の商標です。 ※Amazon SQSは、Amazon Simple Queue Serviceの略称です。 ※Amazon S3は、Amazon Simple Storage Serviceの略称です。

記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。

©JCB Co., Ltd. 20︎21