本稿は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のダッシュボードからもメッセージが送付されていることが確認できます。
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のダッシュボードからもファイルが配置されていることが確認できます。
まとめ
今回、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の略称です。
記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。