ローカルにある画像をnode.jsのnode-s3を使ってS3へ画像をアップロードしてみました。とてもシンプルな方法ですが、簡単にまとめてみたいと思います。
目次
手順
まず今回やることからまとめてみたいと思います。
- AWSマネジメントコンソールでIAMからユーザーを作成。作成後はアクセス・キーをダウンロードしておく
- IAM > ポリシーでS3にアップロードできる権限
AmazonS3UploadOnly
ポリシーを作成 - IAM > ユーザーから作成したポリシーをアタッチする
- S3 > バケットを作成でバケット
your-bucket
を新規に作成する - S3で作成したバケット以下に
upload
フォルダーを作成する - ローカルで
node-s3
をnpmインストールする - index.jsを作成し、node.jsを実行する
IAMからポリシーを作成
ユーザー作成方法は割愛します。ポリシーについては、AWSマネジメントコンソール > IAM > ポリシーより、S3にアップロードできる権限を作成していきます。今回の例ではAmazonS3UploadOnly
ポリシーという名前にしました。
AmazonS3UploadOnly1 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-bucket
のupload
フォルダーにアップロードする事を許可しています。
nodeのコードを書く
続いて、ローカルでnode.jsの実装をします。まずは、npmからs3をインストールします。
bash1 2 3
| $ cd your-project $ npm init $ npm install s3 --save
|
続いてindex.js
を作成します。
index.js
には以下のようなコードを記述します。こちらはnode-s3のサンプルとほぼ同じです。
your-project/index.js1 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');
var client = s3.createClient({ maxAsyncS3: 20, s3RetryCount: 3, s3RetryDelay: 1000, multipartUploadThreshold: 20971520, multipartUploadSize: 15728640, s3Options: { accessKeyId: "AKIA***", secretAccessKey: "****", }, });
var params = { localFile: "uploadFile/150x150.png", s3Params: { Bucket: "your-bucket", Key: "upload/150x150.png", }, }; 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のアクセス権限が上手く行っていません。
bash1 2 3 4 5
| $ node index.js
progress 0 864 864 progress 0 864 864 done uploading
|