この記事は、株式会社ACCESS Advent Calendar 2017の3日目の記事です。
あらまし
権限を持つ人だけがダウンロードできるURLを作る必要があったので、AWS S3とCloudFrontを使うことになりました。
自動化のため、AWS S3にファイルアップロードをしつつ、CloudFrontの署名生成をするプログラムをNode.js で実装しました。
準備
Node.js でaws-sdk
をインストールします。
npm install --save aws-sdk
プログラム中で読み込み、CloudFrontでの公開期間を設定する。
公開期間は秒単位であることに注意する。
const AWS = require('aws-sdk');
const EXPIRATION_DATE = new Date(2038, 0, 1).getTime() / 1000;
環境変数からAWSの各種アクセスキーとシークレットを読み込みます。
if (!('AWS_ACCESS_KEY_ID' in process.env)) {
console.error('ACCESS_KEY_ID is not set.');
}
if (!('AWS_SECRET_ACCESS_KEY' in process.env)) {
console.error('SECRET_ACCESS_KEY is not set.');
}
if (!('CLOUDFRONT_ACCESS_KEY_ID' in process.env)) {
console.error('CLOUDFRONT_ACCESS_KEY_ID is not set.');
}
if (!('CLOUDFRONT_SECRET_ACCESS_KEY_PATH' in process.env)) {
console.error('CLOUDFRONT_SECRET_ACCESS_KEY_PATH is not set.');
}
const CLOUDFRONT_SECRET_ACCESS_KEY = fs.readFileSync(process.env.CLOUDFRONT_SECRET_ACCESS_KEY_PATH);
AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
は、aws-sdk
が内部的に使用するのでチェックだけ行います。
S3へアップロードするためのインスタンスと、CloudFrontへアップロードするためのインスタンスを作ります。
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const signer = new AWS.CloudFront.Signer(process.env.CLOUDFRONT_ACCESS_KEY_ID, CLOUDFRONT_SECRET_ACCESS_KEY.toString());
S3へアップロードします。
s3.putObject({
Bucket: 'バケット名',
Key: '/path/to/file',
Body: fs.readFileSync('/path/to/localFile')
}, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
署名生成をします。
const url = 'http://yourdomain.jp/path/to/file';
const signedUrl = signer.getSignedUrl({
url: url,
expires: EXPIRATION_DATE,
});
これで完成です。
明日は @diescake です。お楽しみに!