【Nestjs】Amazon S3へ画像をアップロードする

NestjsのAPIに渡された画像をAmazon S3へアップロードします。

Nestjsで画像を受け取る方法はこちらを参照してください。

目次

前提条件

本記事でAmazon S3へアップロードを実行するための事前タスクがあります。

  • Amazon S3 コンソールでバケットの作成
  • バケットの権限許可
  • IAMロールの作成

詳しくは公式を参照してください。

AWS SDK for JavaScript のインストール

AWSから提供されているJavaScriptパッケージをインストールします。

$ npm install aws-sdk

Amazon S3 へアップロード

Amazon S3 へアップロードするロジックを作ります。

credential関数を作成

開発環境では環境変数に定義された情報を使用します。
本番環境はEC2インスタンスのメタデータから取得するようにします。

こうすることで、開発時は許可された開発者だけがアクセスができ、本番環境はデプロイしたEC2インスタンスからならアクセスできるようになります。

import { fromInstanceMetadata } from '@aws-sdk/credential-providers';

export const createAwsCredentials = () => {
  if (<NODE_ENV> === 'development') {
    return {
      accessKeyId: <AWS_ACCESS_KEY_ID>,
      secretAccessKey: <AWS_SECRET_ACCESS_KEY>,
    };
  } else {
    return fromInstanceMetadata();
  }
};

Amazon S3アップロードのメソッド

aws-sdkからインポートします。

import {
  GetObjectCommand,
  PutObjectCommand,
  S3Client,
} from '@aws-sdk/client-s3';

Fileを渡し、S3へアップロードするメソッドを作成します。

実装方法はシンプルで、S3Clientをnewして、PutObjectCommandでコマンドを生成し、S3Client.sendでアップロードが完了します。

戻り値には、ファイル名の配列を返しています。

  async s3Upload(files: Express.Multer.File[]) {
    const s3Client = new S3Client({
      region: <AWS_S3_REAGION>,
      credentials: createAwsCredentials(),
    });

    const imagesInfo = [];
    for (const file of files) {
      const extend = file.originalname.match(/[^.]+$/);
      const fileName = `${crypto.randomUUID()}.${extend}`;
      const bucketParams = {
        Bucket: <AWS_S3_BUCKET_NAME>,
        Key: fileName,
        Body: file.buffer,
      };

      const command = new PutObjectCommand(bucketParams);
      await s3Client.send(command);

      imagesInfo.push({
        image_name: fileName,
      });
    }

    return imagesInfo;
  }

Summary

AWSのSDKはドキュメントが豊富なので特に詰まることなく実装ができます。
公式サイトはぜひご覧ください。

よかったらシェアしてね!
目次