3

S3 バケットに書き込む関数があるとします。したがって、バケット名は明らかに「変数」であり、関数にハードコードすることはできません (たとえば、dev と prod で異なるバケットである可能性があります)。

ここで、関数がバケットにアクセスできるようにするには、少なくとも 2 つの場所でバケット名を使用する必要があります。

  1. 関数の IAM ポリシー (バケットへのアクセスを許可する)。
  2. 関数自体で。

#1 では、変数を使用して、で定義された IAM ポリシー内の変数を参照できますs-module(または、v0.4 で呼び出されたものは何でも :)。

#2 では、env var を使用できます。その値は、実行時に関数コードでアクセスできます。

sls env setしかし、変数を 2 回 (ファイルで 1 回とファイルで 1回) 定義する必要はありませんs-variables。それはあまりDRYではありません。ただし、envars を定義するときに変数を参照する方法、またはその逆の方法がわかりません。

バケット名を 1 か所だけで定義するにはどうすればよいですか?

4

1 に答える 1

8

Serverless v0.5の時点で、これは非常に簡単です。環境変数の処理は、サーバーレス プロジェクト変数をブレンドします。プロジェクト変数は_meta/variables/...、ステージごと、リージョンごとに定義します。たとえばs-variables-dev-useast1.json

{
    "foo_bucket": "com.example.foo-bucket"
}

次に、s-function.jsonそのバケットが使用されるファイルで、関数が必要とする環境変数を定義し、テンプレートのような方法でプロジェクト変数を参照します。

"environment": {
    "BUCKET": "${foo_bucket}"
}

その後、他の環境変数と同じように表示されます。だからノードで:

console.log("The Bucket: " + process.env.BUCKET); 
// prints "The Bucket: com.example.foo-bucket"

これまでのところ、サーバーレスのドキュメントはこの変更に追いついていませんが、すぐに反映されるはずです。

于 2016-03-25T14:02:19.573 に答える