概要
gruntでローカルのリソースをS3にアップロードする方法
個人的な利用シーンとしては、モバイルアプリのビルド後に検証用に都度S3にアップロードするが、毎回手動でS3にアップロードするのはさすがにダルいので、その作業をスマートにするためにgruntでアップロードさせるようにしました
環境準備
node.jsおよびgruntが導入済みという前提とさせて頂きます
未導入の方は以下の記事をご参照ください
grunt-awsのインストール(AWS接続用のプラグインの導入)
詳細:grunt-aws
npm install --save-dev grunt-aws
AWS認証用のjsonファイルの作成
S3にAPI接続するためにはアクセスキーIDとシークレットアクセスキーが必要になります
それらをもとに下記のjsonファイルを作成します
取得方法はこちらをご覧ください
※IAMでユーザ作成直後にシークレットアクセスキーを控えていない場合は、
アクセスキーを再作成することで新たにシークレットアクセスキーを取得することができます
IAMで新規ユーザを作成した場合は、S3に適切なロールを適用していることが必要になります
aws-credentials.json
{
"accessKeyId": "aaaaaaaaaaaaaaa",
"secretAccessKey":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
}
gruntfile.jsの作成
grunt実行するための設定ファイルの作成
以下はサンプルの一例です
サンプル以外にもパラメータがありますので、
詳細はこちらをご覧ください
gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
aws: grunt.file.readJSON("aws-credentials.json"), //上記のaws-credential.jsonを読み込む
s3: {
options: {
accessKeyId: "<%= aws.accessKeyId %>", //読み込んだaws-credentials.jsonのaccessKeyId値
secretAccessKey: "<%= aws.secretAccessKey %>", //読み込んだaws-credentials.jsonのsecretAccessKey値
bucket: "バケット名",
region: "ap-northeast-1", //Tokyoであれば、そのままでOK
//その他のregionは http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
cache: false, //アップロード対象のファイルに変更がなくてもアップロードする場合はfalse
access: "public-read", //アップロード後のアクセス権限を読み取り公開
gzip: false //アップロード対象によってファイル(apk)が破損することがあるので、falseにしました
},
upload: {
files: [{
cwd: "bin/", //ローカルのbinフォルダ配下
src: "**/*.html", //binフォルダ配下のすべてのhtmlファイルを対象とする(ワイルドカードを使用可能)
dest: "public/" //アップロード先のS3のバケット配下のディレクトリ
},{
cwd: "dev/", //複数対象の場合は{cwd: "", src: "", dest: ""}を繰り返す
src: "**/*.js",
dest: "public/"
}]
}
}
});
grunt.loadNpmTasks('grunt-aws'); //pluginの読み込み
grunt.registerTask('upload-s3', ['s3']); //gruntタスクに登録するタスク名は適当につけてOK
};
gruntタスクの実行
grunt upload-s3
その他
個人的にアップロード作業の簡素化を手軽に始められたのがgruntだったのでやってみましたが、もし、その他にGoodなアイデアがありましたら、ご教授頂ければ幸いです。ゆくゆくはJenkinsでビルドして、S3にアップロードさせるような一連のフローを作りたいです
以上