link facebook2 twitter youtube

nodeを使用したs3へのアップロードメモ

nodeでs3へのアップロードを行うため今回プログラムを作成しました。普段はphpでプログラムを書いています。

・やりたいこと
macでnodeを使用してs3へデータをアップロードを行いたい。

・nodeのインストール
・s3でバケットの作成
・IAMの設定
・ソースコード

nodeのインストール

公式より推奨版をダウンロードしそのままインストール

s3でバケットの作成

s3の画面でバケットを作成します。

8e86926cb84b3627b08984c3cae24bf4

「バケットを作成する」を選択してバケット名を入力してそのまま作成を完了します。

IAMの設定

nodeよりs3へアクセスを行えるようにするため、IAMの設定を行いました。

2732ad33df938b815c2cb968505fc39d

  • ユーザ名に「s3_test_user」
  • 「アクセスの種類」チェックをいれ

次のステップに進みます。

edc09dcd73eaa88b540f7659b551bfc0

今回は既存のポリシーを直接アタッチを選択し、AmazonS3FullAccessにチェックをいれました。このままユーザを作成し、アクセスキーシークレットキーをメモして起きます。

ソースコード

s3への保存する準備ができたので、プログラムを書いて行きます。

aws-sdkのインストール

amazonより提供されているaws関連にアクセスするためのライブラリをインストールします。このライブラリを通してs3にアクセスを行います。

npm install aws-sdk --save

AWS認証情報の設定

AWSのIAM作成を行った際にメモしたアクセスキーとシークレットキーをconfig/aws/config.jsonに保存します。

保存形式

{ "accessKeyId": <YOUR_ACCESS_KEY_ID>, "secretAccessKey": <YOUR_SECRET_ACCESS_KEY>, "region": "us-east-1" }

参考サイト

S3へアップロード

指定の画像URLを元にs3へアップロードを行います。
S3へのアップロードはs3よりputObjectを使用してアップロードを行います。

s3.putObject(params);

ソースコード一式

以下が今回作成下プログラムコードです。


let path = require('path');

let AWS = require('aws-sdk');
let rp = require('request-promise');

/**
 * AWS認証情報とリージョンを設定
 */
AWS.config.loadFromPath('config/aws/config.json');

/**
 * 対象のURLから画像を取得(Buffer化)
 * @param url
 * @returns {Promise.<TResult>}
 */
function getImg(url) {

    const options = {
        url: url,

        /**
         * nullにしないとBufferがうまく取れない
         */
        encoding: null
    };

    return rp(options)
        .then( (response) => {
            return new Buffer(response);
        });
}

const _S3 = () => {

    let s3 = new AWS.S3();

    /**
     * @type {string}
     */
    const BUCKET = '******';

    /**
     * 本体
     */
    return async (url) => {

        /**
         * アップロードファイル名
         * @type {string}
         */
        const KEY = path.basename(url);

        /**
         * 画像ファイルを指定
         * @type {Buffer}
         */
        const Body = await getImg(url);

        /**
         *
         * @type {{Bucket: string, Key: string, Body: Buffer}}
         */
        const params = {Bucket: BUCKET, Key: KEY, Body: Body};

        /**
         * S3に画像をアップロード
         */
        return await s3.putObject(params).promise();
    };
};

module.exports = {
    's3': _S3()
};

This Post Was Written By 若井豊

© eggplant