😺

mdx.jpのオブジェクトストレージに保存したIIIFマニフェストファイルをNestJSから利用する

2024/12/01に公開

概要

mdx.jpのオブジェクトストレージに保存したIIIFマニフェストファイルをNestJSから利用する機会がありましたので、備忘録です。

背景

mdx.jpのオブジェクトストレージに関して、簡単に確認したところ、corsの設定ができず、mdx.jpのオブジェクトストレージにアップロードしたIIIFマニフェストファイルを他のビューアから利用することは難しいようでした。

https://zenn.dev/nakamura196/articles/ad76f58db4e098#注意(corsの許可)

そこで、NestJSからオブジェクトストレージにアップロードしたIIIFマニフェストファイルをロードして返却します。

ソースコード

以下のリポジトリからご確認いただけます。

https://github.com/nakamura196/nestjs-iiif

以下のような環境変数を用意します。mdx.jpのオブジェクトストレージを使用するため、S3_ENDPOINThttps://s3ds.mdx.jpを与えます。

S3_ENDPOINT=https://s3ds.mdx.jp
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=xxx
S3_SECRET_ACCESS_KEY=xxx
S3_BUCKET_NAME=xxx

そして、@aws-sdk/client-s3を利用して、以下のように、オブジェクトストレージ上のIIIFマニフェストファイルをダウンロードして返却します。

src/s3.service.ts
// src/s3.service.ts
import { Injectable } from '@nestjs/common';
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';
import { Readable } from 'stream';
import * as dotenv from 'dotenv';

dotenv.config();

@Injectable()
export class S3Service {
  private readonly s3Client: S3Client;

  constructor() {
    this.s3Client = new S3Client({
      region: process.env.S3_REGION,
      endpoint: process.env.S3_ENDPOINT,
      forcePathStyle: true, // パススタイルを有効化(多くの互換ストレージで必要)
      credentials: {
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
      },
    });
  }

  async getJsonFile(key: string): Promise<any> {
    const bucket = process.env.S3_BUCKET_NAME;
    if (!bucket) {
      throw new Error('S3_BUCKET_NAME is not set in environment variables.');
    }
    const command = new GetObjectCommand({ Bucket: bucket, Key: key });
    const response = await this.s3Client.send(command);

    const stream = response.Body as Readable;
    const chunks: Uint8Array[] = [];

    for await (const chunk of stream) {
      chunks.push(chunk);
    }

    const fileContent = Buffer.concat(chunks).toString('utf-8');
    return JSON.parse(fileContent);
  }
}

まとめ

mdx.jpのオブジェクトストレージに保存したIIIFマニフェストファイルの利用にあたり、参考になりましたら幸いです。

Discussion