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と表示