45

我在这里关注自述文件:https ://github.com/awslabs/aws-sam-local

我有一个用 python 3.6 编写的 lambda,它类似于这里的 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

我在 lambda 中有环境变量,但无法在启动时将它们连接起来。文档说我可以创建一个 environment.json 文件并在调用命令上附加以下内容:使用调用的 --env-vars 参数

我的环境文件与示例类似,但出现错误: 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

任何人都可以提供额外的见解吗?

4

4 回答 4

70

您想以这种方式与 SAM Local 一起使用的任何环境变量都需要存在于您的 SAM 模板中。从这个 GitHub 问题

... SAM Local 仅解析在 SAM 模板中定义的环境变量。

在模板中,您可以不提供值、空字符串或选择合理的默认值。

包含环境变量的模板的一部分:

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

您可以将环境变量文件视为一种覆盖模板“知道”的环境变量的机制。它不能作为将任意环境变量注入本地运行时的机制。

于 2018-01-07T16:30:31.180 回答
31

模板文件

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
  
Globals:

  Function:
    Timeout: 3

Parameters:

  SomeVar:
    Type: String
    Description: My SomeVar
    Default: default value

Resources:

  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Environment:
        Variables:
          SOME_VAR: !Ref SomeVar
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get

Outputs:

  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"

  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn

  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

来自https://github.com/awslabs/aws-sam-cli/issues/1163#issuecomment-557874976

然后在代码中

console.log(process.env.SOME_VAR);

当你运行sam local start-api它会打印default value

当你运行sam local start-api --parameter-overrides SomeVar=other_value它会打印other_value

那么如果你env.json用这个内容创建文件

{ "PreviewsFunction": { "SOME_VAR": "123" } }

当你运行sam local start-api --env-vars env.json它会打印123

ps 它将start-api/start-lambda/invoke以相同的方式与所有一起工作,但它看起来sam deploy只适用于--parameter-overrides SomeVar=other_value并且没有--env-vars

于 2019-12-23T21:54:43.883 回答
5

确保变量在 template.yml 中声明。当原始模板中不存在变量时,配置文件会覆盖变量但不会创建变量。

于 2018-04-16T13:53:46.247 回答
1

我遇到过同样的问题。当我跑

sam local start-api --env-vars  env.json 

未读取 env.json 中的值。对我来说解决问题的是在 env.json 中使用以下格式

"Parameters": {
    "PARAM_NAME": "VALUE"
}

另一种格式对我不起作用:

{ "function": { "PARAM_NAME": "VALUE" } }
于 2021-03-28T09:22:45.603 回答