NestjsのAPIに渡された画像をAmazon S3へアップロードします。
Nestjsで画像を受け取る方法はこちらを参照してください。
NextjsからPOSTされた画像ファイルをNestjsで受け取る | Tsukurue
Nextjsから複数の画像ファイルをポストして、NestjsのControllerで受け取る時に、受け取り方に戸惑ったので書いておきます。 Nextjsから画像FileをPOSTする useStateでFile…
目次
前提条件
本記事でAmazon S3へアップロードを実行するための事前タスクがあります。
- Amazon S3 コンソールでバケットの作成
- バケットの権限許可
- IAMロールの作成
詳しくは公式を参照してください。
ブラウザから Amazon S3 への写真のアップロード – AWS SDK for JavaScript
Amazon S3 バケット内のフォトアルバムと写真の表示および操作方法を示すブラウザスクリプトの例。
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はドキュメントが豊富なので特に詰まることなく実装ができます。
公式サイトはぜひご覧ください。