はじめに
この記事では、AWS SDK for JavaScriptを利用し、クラウドストレージサービスである Amazon S3 (Simple Storage Service) を操作するための基本的な関数実装を紹介します。
【今回実装したS3操作】
- S3クライアントの初期化: 認証情報とリージョンの設定
- ファイルアップロード: S3へのファイルの書き込み
- Presigned URLの生成: 期限付きアクセスURLの発行
- 複数ファイルの削除: オブジェクトの一括削除処理
1. S3クライアントの作成
// S3クライアントを作成
const s3 = new AWS.S3({
credentials: {
accessKeyId: config.s3.accessKey!, // AWSアクセスキー
secretAccessKey: config.s3.secretKey!, // AWSシークレットキー
},
region: config.s3.region, // S3のリージョン(例: ap-northeast-1)
})
処理内容:
-
new AWS.S3()でS3サービスクライアントを作成 -
credentialsでAWSの認証情報を設定 -
regionで操作対象のAWSリージョンを指定
2. ファイルアップロード処理
// アップロードストリームを作成
return {
writeStream: pass, // 書き込み用ストリーム
promise: s3.upload({ Bucket: config.s3.bucketName!, Key, Body: pass }).promise(), // アップロード実行
}
処理内容:
-
s3.upload()でS3にファイルをアップロード -
Bucket: アップロード先のS3バケット名 -
Key: S3内でのファイルパス(ファイル名) -
Body: アップロードするデータ(ストリーム) -
.promise()でPromiseに変換(async/awaitで待機可能)
3. Presigned URL生成
// Presigned URLを生成
return new Promise((resolve, reject) => {
s3.getSignedUrl("getObject", params, (err, url) => { // AWS SDKのコールバック形式
if (err) {
reject(err) // エラー時はPromiseを拒否
} else {
resolve(url) // 成功時はURLを返す
}
})
})
処理内容:
-
s3.getSignedUrl()でPresigned URLを生成 -
"getObject": 取得用のURL(他に"putObject"等がある) -
params: バケット名、キー、有効期限を含むパラメータ - コールバック形式のAPIをPromiseでラップ
4. 複数ファイル削除処理
// 無効なキーを除外
const validKeys = keys.filter(key => key && key.trim() !== "")
if (validKeys.length === 0) {
return // 削除対象がない場合は何もしない
}
// S3クライアント作成(認証情報付き)
const s3 = new AWS.S3({
credentials: {
accessKeyId: config.s3.accessKey!,
secretAccessKey: config.s3.secretKey!,
},
region: config.s3.region,
})
// 削除対象オブジェクトの配列を作成
const deleteObjects = validKeys.map(key => ({ Key: key }))
処理内容:
-
["file1.jpg", "file2.jpg"]→[{ Key: "file1.jpg" }, { Key: "file2.jpg" }] - AWS SDKが要求する形式に変換
// 一括削除を実行
await s3.deleteObjects({
Bucket: config.s3.bucketName!, // 削除対象のバケット
Delete: {
Objects: deleteObjects, // 削除対象のオブジェクト配列
},
}).promise()
処理内容:
-
s3.deleteObjects()で複数ファイルを一括削除 -
Bucket: 削除対象のS3バケット名 -
Delete.Objects: 削除対象ファイルのキー配列 - 最大1000個まで一度に削除可能
5. エラーハンドリング
// エラーハンドリング
catch (error) {
console.error("S3からファイルの一括削除中にエラーが発生しました:", error)
throw new Error("S3からファイルの一括削除中にエラーが発生しました")
}
処理内容:
- AWS SDKのエラーをキャッチ
- ログ出力とカスタムエラーメッセージでエラーを再スロー
AWS SDKの特徴
- 非同期処理: 全てのS3操作は非同期
- コールバック形式: 古いAPIはコールバック、新しいAPIはPromiseサポート
- 認証: アクセスキーとシークレットキーで認証
- リージョン: 操作対象のAWSリージョンを指定
- エラーハンドリング: AWSサービスのエラーを適切に処理