Update
2016/11/18 Lambda で環境変数が使えるようになりました。
https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/
概要
AWS Lambda は超便利ですね!
しかし、「環境変数が無い」といった声をよく聞きます。
(アップロードしたコードは変更せずに)パラメータとして変更したい場合は、確かにありますよね。
S3に環境変数ファイルを置いておく手法もよく見受けられますが、そのファイル名は結局、埋め込みが必要なんですよね。
解決案
Configration の Description で、設定を渡せばいいんじゃない!
(その際、さすがに自分自身(Lambda関数)のarnは、ハードコードでもいいだろう。)
例
例えば、ホスト名をパラメータで渡して、データをPOSTする場合を考えます。
Lambda 関数
"use strict";
var AWS = require("aws-sdk");
var lambda = new AWS.Lambda();
var http = require('https');
// 自分自身(Lambda関数)のarnを指定する
var name = "arn:aws:lambda:ap-northeast-1:521180000000:function:test";
exports.handler = function (event, context) {
// 自分自身の設定を取得する
var option = {FunctionName: name};
lambda.getFunctionConfiguration(option, function (err, data) {
console.log("ERROR: " + JSON.stringify(err));
console.log("PARAMS: " + data.Description);
// Description を JSON にパース
var params = JSON.parse(data.Description);
var postData = {
text: "Hello World!"
};
postData = JSON.stringify(postData);
var options = {
hostname: params.hostname, // ここのホスト名をパラメータで渡したい
path: "/postpath",
headers: {
"Content-Length": postData.length,
"Content-Type": "application/json"
}
};
var req = http.request(options, function (res) {
console.log("STATUS: " + res.statusCode);
res.setEncoding("utf8");
res.on("end", function () {
console.log("No more data in response.");
context.done(null, "No more data in response.");
})
});
req.on("error", function (e) {
console.log("problem with request: " + e.message);
context.done(e, "problem with request: " + e.message);
});
req.write(postData);
req.end();
});
};
パラメータ設定
Configuration の Description に、以下のようにパラメータとなる JSON を記載します。
{"hostname":"hogehoge.com"}
Role 設定
自分自身の設定が取得できるように、Role は適切に設定してください。
こんな感じ。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"lambda:getFunctionConfiguration"
],
"Resource": "arn:aws:lambda:*:*:*"
}
]
}
まとめ
- AWS Lambda 関数に、簡易にパラメータを渡す方法を試しました。
- 環境変数の要望は多いようなので、そのうち、実現されるかもしれません。