5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

この記事では、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の特徴

  1. 非同期処理: 全てのS3操作は非同期
  2. コールバック形式: 古いAPIはコールバック、新しいAPIはPromiseサポート
  3. 認証: アクセスキーとシークレットキーで認証
  4. リージョン: 操作対象のAWSリージョンを指定
  5. エラーハンドリング: AWSサービスのエラーを適切に処理
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?