LoginSignup
31
27

More than 5 years have passed since last update.

AWS Lambda にパラメータを渡す方法を思いついた!

Last updated at Posted at 2015-12-02

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"}

スクリーンショット_2015-12-02_18_15_12.png

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 関数に、簡易にパラメータを渡す方法を試しました。
  • 環境変数の要望は多いようなので、そのうち、実現されるかもしれません。
31
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
27