AWS-SAM-Localを使った時にハマったメモ
仕事でAWS LambdaとAPI Gatewayを組み合わせて使っていて、Serverless Frameworkでデプロイしているけど、デバッグが面倒だと叫んだらaws-sam-localというものを教えてもらった。これを使った時にハマったのでメモ。
環境変数が読み込めない
ドキュメントによると
環境変数ファイルの使用
Lambda 関数で Environment Variables を使用すると、SAM Local は invoke コマンドと start-api コマンドの両方に –env-vars 引数を渡します。この引数では、関数に定義されている環境変数の値がある JSON ファイルを使用できます。JSON ファイルの構造は次のようになります。
以下のように –env-vars を指定すると環境変数を指定できるとのこと
$ sam local start-api --env-vars env.json
なので、以下のようなjsonを用意
{
"GetUsers": {
"SAMPLE_KEY": "xxxxxxxxx"
}
}
$ sam local invoke -e /path/to/params.json -n /path/to/env.json GetUsers
# --env-varsは-nでもOK
と実行してみたものの、環境変数は読み込まれなかった。 そこでaws-sam-localのソースコードを追ってみると https://github.com/awslabs/aws-sam-local/blob/bd1672469e85bf533ee10849773ee7c92a854411/env.go
なるほど。
どうやらtemplate.ymlにも定義しないといけないらしい。先ほどのドキュメントの
この引数では、関数に定義されている環境変数の値がある JSON ファイルを使用できます。
とはtemplate.ymlに定義しろという意味でした。そこでtemplate.ymlに以下を追記
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: hogehoge
Resources:
GetUsers:
Type: AWS::Serverless::Function
Properties:
Handler: functions/users.handler
Runtime: nodejs6.10
Events:
GetResource:
Type: Api
Properties:
Path: /v1/users
Method: get
# ここから追記
Environment:
Variables:
SAMPLE_KEY: sampleValue
実行してみると以下のように取得できた。
console.log(process.env.SAMPLE_KEY)
// -> xxxxxxxxx と表示
// コマンドライン引数を省略するとsampleValueと表示