Node.js で S3 の署名付き URL を安全に操作: 包括的なチュートリアル
Node.js で AWS SDK を使って S3 の署名付き URL を生成する方法
Amazon S3 の署名付き URL は、一時的にオブジェクトへのアクセスを許可する安全な方法です。この URL を使用すると、認証なしでオブジェクトをダウンロードしたり、アップロードしたりできます。これは、特に機密性の高いデータへのアクセスを制御する必要がある場合に役立ちます。
前提知識
このチュートリアルを始める前に、以下の知識が必要です。
- Node.js の基本的な知識
- AWS アカウント
- Amazon S3 バケット
手順
- 必要なパッケージをインストールする
npm install aws-sdk
- AWS 認証情報を設定する
AWS SDK を使用するには、アクセスキー ID とシークレットキーを環境変数に設定する必要があります。これらは、AWS マネジメントコンソールから取得できます。
AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
- 署名付き 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 メソッドを指定できます。有効な値は GET
、PUT
、POST
、DELETE
です。
- アップロード用の署名付き 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);
説明
AWS.S3
オブジェクトを作成して、S3 クライアントを初期化します。downloadUrl
変数にダウンロード用の署名付き URL を生成します。
実行方法
このコードを実行するには、以下の手順が必要です。
aws-sdk
パッケージをインストールします。
npm install aws-sdk
YOUR_BUCKET_NAME
とmyfile.txt
を、実際のバケット名とオブジェクト名に置き換えます。- コードを実行します。
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