ローカルにある画像をnode.jsのnode-s3を使ってS3へ画像をアップロードしてみました。とてもシンプルな方法ですが、簡単にまとめてみたいと思います。

目次

手順

まず今回やることからまとめてみたいと思います。

  1. AWSマネジメントコンソールでIAMからユーザーを作成。作成後はアクセス・キーをダウンロードしておく
  2. IAM > ポリシーでS3にアップロードできる権限AmazonS3UploadOnlyポリシーを作成
  3. IAM > ユーザーから作成したポリシーをアタッチする
  4. S3 > バケットを作成でバケットyour-bucketを新規に作成する
  5. S3で作成したバケット以下にuploadフォルダーを作成する
  6. ローカルでnode-s3をnpmインストールする
  7. index.jsを作成し、node.jsを実行する

IAMからポリシーを作成

ユーザー作成方法は割愛します。ポリシーについては、AWSマネジメントコンソール > IAM > ポリシーより、S3にアップロードできる権限を作成していきます。今回の例ではAmazonS3UploadOnlyポリシーという名前にしました。

AmazonS3UploadOnly
1
2
3
4
5
6
7
8
9
10
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::your-bucket/upload/*"
}
]
}

上記では、S3のyour-bucketuploadフォルダーにアップロードする事を許可しています。

nodeのコードを書く

続いて、ローカルでnode.jsの実装をします。まずは、npmからs3をインストールします。

bash
1
2
3
$ cd your-project
$ npm init
$ npm install s3 --save

続いてindex.jsを作成します。

bash
1
$ vim index.js

index.jsには以下のようなコードを記述します。こちらはnode-s3のサンプルとほぼ同じです。

your-project/index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var s3 = require('s3');

// まずはs3クライアントを作成
var client = s3.createClient({
maxAsyncS3: 20, // デフォルトのままでOK
s3RetryCount: 3, // デフォルトのままでOK
s3RetryDelay: 1000, // デフォルトのままでOK
multipartUploadThreshold: 20971520, // デフォルトのままでOK
multipartUploadSize: 15728640, // デフォルトのままでOK
s3Options: {
accessKeyId: "AKIA***", // 今回S3にアクセスするために作成したIAMユーザーのアクセス・キー
secretAccessKey: "****", // 今回S3にアクセスするために作成したIAMユーザーのシークレット・キー
},
});

// 続いてアップロードしたいファイルの指定や、S3にアップロードした時のファイル名をparamsで指定
var params = {
localFile: "uploadFile/150x150.png", // アップロードしたいローカルのファイルパス。例では150x150.pngとした。パスは作成したプロジェクトルートからの相対パス
s3Params: {
Bucket: "your-bucket", // アップロードしたいS3のバケット名
Key: "upload/150x150.png", // アップロードした時に作成されるファイル名(S3バケットの相対パス)
},
};
var uploader = client.uploadFile(params);
uploader.on('error', function(err) {
console.error("unable to upload:", err.stack);
});
uploader.on('progress', function() {
console.log("progress", uploader.progressMd5Amount,
uploader.progressAmount, uploader.progressTotal);
});
uploader.on('end', function() {
console.log("done uploading");
});

ローカルでアップロードを実行

index.jsを作成したらnode.jsで実行します。done uploadingと表示されると、アップロードは成功です。unable to upload: AccessDenied: Access Deniedと表示されるとIAMやポリシー、S3のアクセス権限が上手く行っていません。

bash
1
2
3
4
5
$ node index.js

progress 0 864 864
progress 0 864 864
done uploading