1

Redis ElastiCache セクションを s-resource-cf.json (CloudFormation テンプレート) に追加し、そのホスト名を出力として選択しました。

"Resources": {
    ...snip...
    "Redis": {
        "Type": "AWS::ElastiCache::CacheCluster",
        "Properties": {
            "AutoMinorVersionUpgrade": "true",
            "AZMode": "single-az",
            "CacheNodeType": "cache.t2.micro",
            "Engine": "redis",
            "EngineVersion": "2.8.24",
            "NumCacheNodes": "1",
            "PreferredAvailabilityZone": "eu-west-1a",
            "PreferredMaintenanceWindow": "tue:00:30-tue:01:30",
            "CacheSubnetGroupName": {
                "Ref": "cachesubnetdefault"
            },
            "VpcSecurityGroupIds": [
                {
                    "Fn::GetAtt": [
                        "sgdefault",
                        "GroupId"
                    ]
                }
            ]
        }
    }
},
"Outputs": {
    "IamRoleArnLambda": {
        "Description": "ARN of the lambda IAM role",
        "Value": {
            "Fn::GetAtt": [
                "IamRoleLambda",
                "Arn"
            ]
        }
    },
    "RedisEndpointAddress": {
        "Description": "Redis server host",
        "Value": {
            "Fn::GetAtt": [
                "Redis",
                "Address"
            ]
        }
    }
}

実行時に CloudFormation に Redis サーバー ホストを出力させるsls resources deployことはできますが、Lambda 関数内からその出力にアクセスするにはどうすればよいですか?

このスターター プロジェクト テンプレートにはIamRoleArnLambda、サンプル プロジェクトに付属の を参照するものは何もありません。docsによると、テンプレートはプロジェクト構成にのみ使用でき、Lambda 関数からはアクセスできません。

テンプレートと変数は設定専用です

テンプレートと変数は、プロジェクトの構成にのみ使用されます。この情報はラムダ関数では使用できません。ラムダ関数で使用できる変数を設定するには、環境変数を使用します。

では、ElastiCache サーバーの作成後に環境変数を ElastiCache サーバーのホスト名に設定するにはどうすればよいでしょうか?

4

2 に答える 2

2

アップデート

そのコメントがイシュー トラッカーに投稿されて以来、CloudFormation の使用はいくらか合理化されています。ドキュメントの更新をhttp://docs.serverless.com/docs/templates-variablesに送信し、構成の短縮版を gist に投稿しまし

s-function.jsonこれらの出力を環境変数として使用できるようにするために、Lambda 設定ファイルで CloudFormation 出力を参照することができます。

s-resource-cf.json出力セクション:

"Outputs": {
    "redisHost": {
        "Description": "Redis host URI",
        "Value": {
            "Fn::GetAtt": [
                "RedisCluster",
                "RedisEndpoint.Address"
            ]
        }
    }
}

s-function.json環境セクション:

"environment": {
    "REDIS_HOST": "${redisHost}"
},

Lambda 関数での使用:

exports.handler = function(event, context) {
    console.log("Redis host: ", process.env.REDIS_HOST);
};

古い答え

Serverless issue tracker (リンク) で解決策が見つかった/実装されたようです。ハイパーブレインを引用するには:


CF 出力変数

ラムダが CF 出力変数にアクセスできるようにcloudformation:describeStacksするには、ラムダ IAM ロールでアクセス権を付与する必要があります。

CF.loadVars()promise は、すべての CF 出力変数を名前としてプロセスの環境に追加しますSERVERLESS_CF_OutVar。ラムダの起動時間に数ミリ秒が追加されます。

ラムダ ハンドラを次のように変更します。

// Require Serverless ENV vars
var ServerlessHelpers = require('serverless-helpers-js');
ServerlessHelpers.loadEnv();

// Require Logic
var lib = require('../lib');

// Lambda Handler
module.exports.handler = function(event, context) {
  ServerlessHelpers.CF.loadVars()
  .then(function() {
    lib.respond(event, function(error, response) {
      return context.done(error, response);
    });
  })
};
于 2016-05-09T14:34:18.180 に答える
2

environment関数のs-function.jsonファイルのセクションに環境変数を設定できます。さらに、これらの変数がバージョン管理に入れられないようにしたい場合 (たとえば、コードがパブリック GitHub リポジトリに投稿される場合)、それらを_meta/variablesディレクトリ内の適切なファイルに配置し、s-function.jsonファイルからそれらを参照できます。 . ファイルに_meta行を追加してください。.gitignore

たとえば、私の最新のプロジェクトでは、Redis Cloud サーバーに接続する必要がありましたが、接続の詳細をバージョン管理にコミットしたくありませんでした。_meta/variables/s-variables-[stage]-[region].json次のように、変数をファイルに入れます。

{
  "redisUrl": "...",
  "redisPort": "...",
  "redisPass": "..."
}

…そして、その関数のs-function.jsonファイルで接続設定変数を参照しました。

"environment": {
  "REDIS_URL": "${redisUrl}",
  "REDIS_PORT": "${redisPort}",
  "REDIS_PASS": "${redisPass}"
}

redis.js次に、このファイルを自分のfunctions/libディレクトリに置きます。

module.exports = () => {
  const redis = require('redis')
  const jsonify = require('redis-jsonify')
  const redisOptions = {
    host: process.env.REDIS_URL,
    port: process.env.REDIS_PORT,
    password: process.env.REDIS_PASS
  }

  return jsonify(redis.createClient(redisOptions))
}

次に、その Redis データベースに接続するために必要な関数で、次をインポートしましたredis.js

redis = require('../lib/redis')()

(私のサーバーレス/Redis セットアップの詳細と、それを機能させるために直面​​したいくつかの課題については、昨日投稿したこの質問を参照してください。)

于 2016-05-09T05:59:37.063 に答える