Node.js で S3 の署名付き URL を安全に操作: 包括的なチュートリアル

2024-06-17

Node.js で AWS SDK を使って S3 の署名付き URL を生成する方法

Amazon S3 の署名付き URL は、一時的にオブジェクトへのアクセスを許可する安全な方法です。この URL を使用すると、認証なしでオブジェクトをダウンロードしたり、アップロードしたりできます。これは、特に機密性の高いデータへのアクセスを制御する必要がある場合に役立ちます。

前提知識

このチュートリアルを始める前に、以下の知識が必要です。

  • Node.js の基本的な知識
  • AWS アカウント
  • Amazon S3 バケット

手順

  1. 必要なパッケージをインストールする
npm install aws-sdk
  1. AWS 認証情報を設定する

AWS SDK を使用するには、アクセスキー ID とシークレットキーを環境変数に設定する必要があります。これらは、AWS マネジメントコンソールから取得できます。

AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
  1. 署名付き URL を生成する

以下のコードは、getObject メソッドを使用してダウンロード用の署名付き URL を生成する方法を示しています。

const AWS = require('aws-sdk');

const s3 = new AWS.S3({ region: 'us-east-1' });

const params = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'myfile.txt',
  Expires: 60 * 60 // 1 hour
};

const url = s3.getSignedUrl(params);

console.log(url);

このコードは、次の出力を生成します。

https://your-bucket-name.s3.amazonaws.com/myfile.txt?Expires=1655205520&Signature=EXAMPLE...

この URL を使用して、ブラウザまたはその他のツールでファイルをダウンロードできます。

オプション

Expires パラメーターを使用して、署名付き URL の有効期限を設定できます。デフォルトの有効期限は 15 分です。

HttpMethod パラメーターを使用して、署名付き URL の HTTP メソッドを指定できます。有効な値は GETPUTPOSTDELETE です。

  • アップロード用の署名付き URL を生成するには、putObject メソッドを使用します。

AWS SDK のドキュメントで、S3 の署名付き URL について詳しく学ぶことができます: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html

補足

  • 署名付き URL は一時的なものであることに注意してください。有効期限が切れた URL は使用できません。
  • 署名付き URL を共有する場合は、注意が必要です。これらの URL を使用すると、誰でもバケット内のオブジェクトにアクセスできます。
  • AWS SDK には、Node.js 以外にもさまざまな言語のバージョンの署名付き URL の生成機能が含まれています。



Node.js で AWS SDK を使って S3 の署名付き URL を生成するサンプルコード

const AWS = require('aws-sdk');

const s3 = new AWS.S3({ region: 'us-east-1' });

// ダウンロード用の署名付き URL を生成
const params = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'myfile.txt',
  Expires: 60 * 60 // 1 hour
};

const downloadUrl = s3.getSignedUrl(params);
console.log('ダウンロード用署名付き URL:', downloadUrl);

// アップロード用の署名付き URL を生成
const putParams = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'myfile.txt',
  Expires: 60 * 60 // 1 hour
};

const uploadUrl = s3.getSignedUrl(putParams, 'PUT');
console.log('アップロード用署名付き URL:', uploadUrl);

説明

  1. AWS.S3 オブジェクトを作成して、S3 クライアントを初期化します。
  2. downloadUrl 変数にダウンロード用の署名付き URL を生成します。

実行方法

このコードを実行するには、以下の手順が必要です。

  1. aws-sdk パッケージをインストールします。
npm install aws-sdk
  1. YOUR_BUCKET_NAMEmyfile.txt を、実際のバケット名とオブジェクト名に置き換えます。
  2. コードを実行します。
node index.js

出力

以下の出力が表示されます。

ダウンロード用署名付き URL: https://your-bucket-name.s3.amazonaws.com/myfile.txt?Expires=1655205520&Signature=EXAMPLE...
アップロード用署名付き URL: https://your-bucket-name.s3.amazonaws.com/myfile.txt?Expires=1655205520&Signature=EXAMPLE...
  • このコードは、あくまでも例です。実際の使用例では、必要に応じてコードを変更する必要があります。



Node.js で AWS SDK を使って S3 の署名付き URL を生成するその他の方法

s3-request-presigner パッケージは、S3 の署名付き URL を生成するための専用のライブラリです。このパッケージを使用すると、より簡潔で読みやすいコードを作成できます。

const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({ region: 'us-east-1' });
const bucketName = 'YOUR_BUCKET_NAME';
const key = 'myfile.txt';

const command = new GetObjectCommand({
  Bucket: bucketName,
  Key: key
});

const expiresIn = 60 * 60; // 1 hour

const signedUrl = await getSignedUrl(s3Client, command, { expiresIn });
console.log(signedUrl);

AWS SDK V2 は、S3 の署名付き URL を生成するための別の方法を提供します。ただし、この方法は、SDK V3 よりも複雑で冗長です。

const AWS = require('aws-sdk');

AWS.config.update({ region: 'us-east-1' });

const s3 = new AWS.S3();

const params = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'myfile.txt',
  Expires: 60 * 60 // 1 hour
};

const url = s3.getSignedUrl(params);
console.log(url);

Temporary credentials を使用する

一時的な資格情報を使用すると、アクセスキー ID とシークレットキーをコードに埋め込むことなく、署名付き URL を生成できます。これは、セキュリティを強化する必要がある場合に役立ちます。

const AWS = require('aws-sdk');
const STS = require('aws-sdk/STS');

const sts = new STS({ region: 'us-east-1' });

const params = {
  RoleArn: 'YOUR_ROLE_ARN',
  DurationSeconds: 3600 // 1 hour
};

sts.assumeRole(params, (err, data) => {
  if (err) {
    console.error(err);
    return;
  }

  const accessKeyId = data.Credentials.AccessKeyId;
  const secretAccessKey = data.Credentials.SecretKey;
  const sessionToken = data.Credentials.SessionToken;

  const s3 = new AWS.S3({
    accessKeyId,
    secretAccessKey,
    sessionToken
  });

  const bucketName = 'YOUR_BUCKET_NAME';
  const key = 'myfile.txt';

  const params = {
    Bucket: bucketName,
    Key: key,
    Expires: 60 * 60 // 1 hour
  };

  const url = s3.getSignedUrl(params);
  console.log(url);
});

注意事項

  • どの方法を使用する場合も、署名付き URL を安全に保管し、必要な人だけがアクセスできるようにすることが重要です。
  • 署名付き URL の有効期限は短く設定してください。
  • 本番環境では、一時的な資格情報を使用することをお勧めします。

これらの方法は、それぞれ異なる長所と短所があります。ニーズに合った方法を選択してください。


node.js amazon-web-services amazon-s3


Bowerインストールの救世主!「bower command not found」エラーを完全解決する方法とは?

「bower command not found」エラーは、Node. jsパッケージマネージャーである「npm」を使用してフロントエンド開発ツール「Bower」をインストールした後に発生することがあります。これは、Bowerがグローバルにインストールされていないか、環境変数「PATH」にBowerのパスが設定されていないことを意味します。...


【超解説】Node.js モジュールテスト:モック、改造、デバッガ、カバレッジ…を使いこなせ!

しかし、テストコードにおいては、モジュールの内部動作を理解し、非公開関数を含むすべてのコードを検証することが重要です。そこで、この記事では、Node. js モジュールの内部関数にアクセスしてテストする方法をいくつか紹介します。最も簡単な方法は、モジュールオブジェクトのプロパティを直接操作することです。モジュールをロードすると、そのモジュールオブジェクトが require 関数によって返されます。このオブジェクトには、公開関数だけでなく、非公開関数を含むモジュールのすべてのプロパティとメソッドにアクセスすることができます。...


レスポンス送信をマスターしよう!Node.js Expressでres.end()とres.send()を使いこなす

この二つの関数はどちらもレスポンス送信に用いられますが、いくつかの重要な違いがあります。処理のタイミングres. end(): レスポンスヘッダーとボディを全て送信し、クライアントとの接続を閉じます。res. send(): レスポンスヘッダーとボディを設定し、res...


JavaScriptの非同期処理をマスターしよう! async/await と forEach ループの徹底解説

JavaScriptの async/await は非同期処理をより簡単に記述するための強力なツールです。一方、forEach ループは配列の要素を反復処理する便利な方法です。しかし、forEach ループ内で非同期処理を行う場合、async/await を直接使用することはできません。...


TypeScriptとJestでモック関数を使いこなすためのヒント:型エラーを回避してテストを効率化する

Node. js、React. js、TypeScriptを使った開発において、テストは不可欠な要素です。Jestは、JavaScript/TypeScript向けの軽量で使いやすいテストフレームワークとして広く利用されています。しかし、Jestでモック関数を使用する場合、TypeScriptの型システムとの整合性により、型エラーが発生することがあります。...