この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS Lambdaについて
AWS Lambdaとは
まずは簡単に説明を。 AWS Lambdaは、イベント発生時にコードを実行し、リソースを自動的に管理するサービスです。 「Lambda関数」とよばれる関数を定義したコードをアップロードすることで、 AWS Lambdaがコードを実行するサーバーの管理を行ってくれます。 (現在はNode,Java,PythonでLambda関数を定義することが可能) 以前であればサーバサイドでプログラムを動かすには、EC2を用意してそこで実行する必要がありましたが、 AWS Lambdaを使えばそれも不要になります。
なお、lambdaの基本についての詳細はこのへんをご確認ください。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.10.5
- Node : v4.1.2
- aws-cli : 1.9.15
- gulp : 3.9.0
AWSアカウントを用意し、AWSコンソールにアクセスできるようにしておいてください。 また、aws-cliもインストールし、アカウント設定を行っておいてください。
GulpでAWS Lambdaのデプロイ
Lambdaを使ったアプリのデプロイ方法
Lambda関数を定義するには、AWSコンソール上で直接コードを記述するか、zipファイルをアップロードする必要があります。
試しにlambda関数を使ってみるくらいならこの方法で問題ないのですが、 実際に何度も関数を更新したりする場合には毎回手動でアップロードするのは面倒です。 それを簡単にするため、Gulpを使用する方法があります。
GulpをつかったAWS Lambdaのデプロイ
では、GulpをつかってLambda関数をデプロイしてみましょう。 「node-aws-lambda」というモジュールを使い、Gulpでアップロードします。 ここ」を参考にプログラムや設定ファイルを記述していきます。
まずはaws-lambda-testディレクトリを用意し、下記のようなtest.jsファイルを作成します。
//aws-lambda-test/test.js
exports.handler = function (event, context) {
console.log("hello AWS Lambda");
context.done(null, 'success test1');
};
そして、上記参考URLにあるとおり、
- 必要なnodeモジュールのインストール
- 出力ディレクトリ作成
- IAMロールの作成とPolicyファイルの作成
を行います。
次に、下記のようなgulpfile.jsを作成します。
//gulpfile.js
var gulp = require('gulp');
var zip = require('gulp-zip');
var del = require('del');
var install = require('gulp-install');
var runSequence = require('run-sequence');
var awsLambda = require('node-aws-lambda');
gulp.task('clean', function(cb) {
del(['./dist', './dist.zip'], cb);
});
gulp.task('js', function() {
gulp.src('config/*',{ base: '.' }).pipe(gulp.dest('dist/'));
return gulp.src(['test.js'])
.pipe(gulp.dest('dist/'));
});
gulp.task('node-mods', function() {
return gulp.src('./package.json')
.pipe(gulp.dest('dist/'))
.pipe(install({production: true}));
});
gulp.task('zip', function() {
return gulp.src(['dist/**/*', '!dist/package.json'])
.pipe(zip('dist.zip'))
.pipe(gulp.dest('./'));
});
gulp.task('upload', function(callback) {
awsLambda.deploy('./dist.zip', require("./lambda-config.js"), callback);
});
gulp.task('deploy', function(callback) {
return runSequence(
['clean'],
['js', 'node-mods'],
['zip'],
['upload'],
callback
);
});
最後にAWS Lambdaの設定を記述した、lambda-config.jsを作成します。
//lambda-config.js
module.exports = {
region: '<リージョン>',
handler: 'test.handler',
role: '<IAMのarn>',
functionName: '<関数名>',
timeout: <タイムアウト秒数>
}
これでGulpを使ってLambda関数をデプロイする準備が整いました。 下記コマンドを実行して、AWSにデプロイしてみましょう。
% gulp deploy
・
・
デプロイが成功したらAWSコンソールで対象リージョンのLambdaを確認してみてください。 test関数が登録されており、Testボタンを押せばその場で実行することも可能です。
デプロイ先を指定してAWS Lambdaのデプロイ
上記デプロイ方法の問題
Gulpを使って簡単にLambda関数をデプロイすることができましたが、 実際の開発では、「開発用」「本番用」など、複数の環境にデプロイすることが多々あります。 そういった場合、上記の方法だと、設定ファイルをいちいち書き換えなければいけないので、非常に手間がかかりますが、 少し修正するだけで複数環境へデプロイできるようになるので、その手法について紹介します。
aws-cliでプロファイルを作成
aws-cliでは複数のcredentialを定義して使い分けることができるので、必要な分だけデプロイ先のプロファイルを作成します。 ~/.aws/credentialsを、下記例を参考に記述してください。
・
・
[lambda-dev]
aws_access_key_id = <dev用アクセスキー>
aws_secret_access_key = <dev用シークレットキー>
[lambda-prod]
aws_access_key_id = <prod用アクセスキー>
aws_secret_access_key = <prod用シークレットキー>
ここでは「lambda-dev」(開発用)と「lambda-prod」(本番用)の、2つのプロファイルを用意しました。
Gulpを実行するシェルを作成
binディレクトリを作成し、その中にシェルスクリプトを作成します。
% mkdir bin
% touch bin/upload-lambda.sh
bin/upload-lambda.shを下記内容で記述します。
#!/bin/sh
if [ $# -ne 1 ]; then
echo デプロイ環境を指定してください
exit 1
fi
cd `dirname $0` || exit 1
cd ../
export AWS_DEFAULT_PROFILE=$1
gulp deploy
やっていることは単純で、AWS_DEFAULT_PROFILE環境変数に任意のプロファイルを指定するだけです。 下記のようにすれば、開発環境用アカウントを使用してデプロイします。
//lambda-devプロファイルを使用してデプロイ
% bin/upload-lambda.sh lambda-dev
まとめ
さて今回は、Gulp(node-aws-lambda)をつかってAWS Lambdaをアップロードする際に、 環境を切り替える方法について紹介しました。 これで簡単に開発用・本番用などの複数環境にデプロイすることができると思います。
なお、この方法だと環境毎にプロパティファイルやlambda-config.js等の設定ファイルまで切り替えることはできません。 その方法についてはまた別の記事で紹介する予定です。