AWSのサービスの一つであるLambdaを使用してみたので、使い方等のメモ。
Lambdaとは
簡単に言うと、サーバを用意することなくコードをアップロードしてトリガを設定しておくだけでコードを実行してくれるプラットフォーム。
トリガ
以下のリソースへのアクセスをトリガとして設定できる。
- S3
- DynamoDB
- Kinesis
- SNS
また、cronのような設定や、「API Gateway」と組み合わせることも可能。
言語について
Lambda上で実行できる言語は、以下の通り。
- Node.js
- Python
- Java
Java以外の言語については、コードをアップロードするだけでなくてAWSのコンソール上で直接コードを書くことができる。
作り方
言語には「Node.js」、トリガに「S3」を使用したサンプルをやってみる。
- AWSコンソールから「Lambda」を選択して、「Create a Lambda function」をクリック
- 「Select blueprint」という画面が表示されて、おそらくテンプレートを選べるのだろうけど、ここでは、何も選択せずに「skip」をクリック
- 「Name」「Description」に適当なものを入力し、「Runtime」には「Node.js」を選択
- 「Lambda function code」のテキストエリアにコードを書いていく(コード例は後述)
- 「Role」の個所では、今回はS3を使用するので、「S3 execution role」を選択する。すると、別ウインドウが開くので、特に変更せずに「許可」をクリック
- 「Memory」や「Timeout」は特に問題なければそのまま
- 「Next」をクリック
- 「Create function」をクリック
- 作成したfunctionの詳細画面が表示されるので、トリガの設定を行っていく
- 「Event sources」のタブをクリック
- 「Add event source」をクリック
- ダイアログが表示されるので、「Event source type」に「S3」を選択
- さらに細かい設定が表示されるので設定する
- Bucket: 監視するバケットを選択
- Event type: トリガとなるイベントを選択
- Prefix: ファイル名のPrefixを設定できる
- Suffix: ファイル名のSuffixを設定できる
- 「Submit」をクリック
コード例
S3にアップロードされたファイル名を表示するコードはこちら。
// 開始ログ出力
console.log('Loading event');
exports.handler = function(event, context) {
// 引数のeventにはトリガに応じたObjectが渡ってくる。
// それぞれどんな形式かは、コードの編集画面の「Actions」→「Configure test event」
// で確認できる
console.log(event.Records[0].s3.object.key);
// 終了
context.succeed('handler complete');
};
おまけ
コード内でhttp通信したい場合は以下のような感じで。
LambdaというかNodeのサンプルみたいな感じですが。。。
var http = require('http');
var querystring = require('querystring');
var https = require('https'); // https用
console.log('Loading event');
exports.handler = function(event, context) {
// 「GET」の例
http.get('${url}', function(res) {
res.setEncoding('utf8');
res.on('data', function(str) {
console.log(str);
context.succeed('handler complete');
}).on('error', function(e) {
context.done('error', e);
});
});
// 「POST」の場合
// パラメータの組み立て
// var data = querystring.stringify({
// name: 'sugasawa',
// email: 'hoge121@example.com'
// });
// var options = {
// hostname: '${host}',
// port: ${port},
// path: '${path}',
// method: 'POST',
// headers: {
// 'Content-Type': 'application/x-www-form-urlencoded',
// 'Content-Length': Buffer.byteLength(data)
// }
// };
// var req = http.request(options, function(res) {
// res.setEncoding('utf8');
// res.on('data', function (body) {
// console.log(body);
// context.succeed('handler complete');
// });
// }).on('error', function(e) {
// context.done('error', e);
// });
// req.write(data);
// req.end();
};