AWS

node aws-sdk でS3へファイルアップロードをする

この記事は、株式会社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 です。お楽しみに!