web-dev-qa-db-ja.com

aws-sam-local環境変数

私はここのreadmeをフォローしています: https://github.com/awslabs/aws-sam-local

私はラムダをpython 3.6で書かれており、そのhelloworldの例に似ています: https://github.com/awslabs/aws-sam-local/tree/develop/ samples/hello-world/python

template.ymlは次のようになります。

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: MyFunction1 API
Resources:
  MyFunction1:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyFunction1
      Handler: lambda_module.lambda_handler
      Runtime: python3.6
      CodeUri: lambda.Zip
      MemorySize: 128
      Timeout: 10
      Policies:
        -AWSLamdbaBasicExecutionRole
      Events:
        BingLambdaEndpoint:
          Type: Api
          Properties:
            Path: MyFunction1/search
            Method: get

ラムダ内に環境変数がありますが、起動時にそれらを接続できません。ドキュメントには、environments.jsonファイルを作成し、invokeコマンドに以下を追加できると書かれています。--env-vars引数をinvokeに使用します

私の環境ファイルは例のように見え、エラーが発生します:Unable to find environment variable: api_key

environment.jsonは次のようになります。

{
  "MyFunction1": {
    "api_key": "123456789",
    "BUCKET_NAME": "testBucket"
  }
}

私が実行するコマンドは次のとおりです:

sam local invoke MyFunction1 --env-vars environment_variables.json -e event.json

誰でも追加の洞察を提供できますか?

17
gotjava2012

この方法でSAM Localで使用する環境変数は、SAMテンプレートに存在する必要があります。 このGitHubの問題 から:

... SAM Localは、SAMテンプレートで定義された環境変数のみを解析します。

テンプレートでは、値を指定しないか、空の文字列を指定するか、適切なデフォルトを選択できます。

環境変数を含むテンプレートの一部:

Resources:
  MyFunction1:
    Type: 'AWS::Serverless::Function'
    Properties:
      .....
      Environment:
        Variables:
          api_key:
          BUCKET_NAME:

環境変数ファイルは、テンプレートが「知っている」環境変数をoverrideするメカニズムと考えることができます。ローカルランタイムに任意の環境変数を注入するメカニズムとしては機能しません。

31
Mike Patrick

変数がtemplate.ymlで宣言されていることを確認してください。構成ファイルは変数を上書きしますが、元のテンプレートに存在しない変数は作成しません。

2
toonsend