【问题标题】:How do I access a variable inside a YAML file from an AWS Lambda function?如何从 AWS Lambda 函数访问 YAML 文件中的变量?
【发布时间】:2020-04-29 19:21:41
【问题描述】:

我正在使用无服务器框架来测试我的 lamdba 函数,但它要求我访问我的 yaml 文件以获取特定变量。为了清楚起见,我将在下面添加文件和代码:

我需要访问的 YAML 变量是 tableName

environment:
  tableName: notes_project

这是 lambda 函数:

import json
import boto3
import uuid

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('notes_project')

def lambda_handler(event, context):

    data = json.loads(event['body'])

    item = {
        'user_id': event['requestContext']['identity']['cognitoIdentityId'],
        'note_id': str(uuid.uuid1()),
        'note_text': data
    }

    table.put_item( Item = item)

目前,您可以看到表名是硬编码的,但我想避免这种情况。

到目前为止我尝试过的:

我查看了Get yaml key value in python 和其他涉及 os.environ 的建议,但如果我要将代码部署到 AWS,我不确定这些是否是正确的选择。我几乎不知道 lambda 代码在部署后如何访问这些 yaml 变量。解释将不胜感激。

【问题讨论】:

    标签: python aws-lambda serverless-framework


    【解决方案1】:

    serverless.yml 不会上传到 lambda 函数代码,因此您将无权访问该文件。

    您可以通过几种方式做到这一点,

    将值作为环境变量直接存储在 serverless.yml 中

    serverless.yml 中为 lambda 定义环境变量。然后你就可以访问 lambda 中的环境变量了。

    #serverless.yml
    service: my-service
    
    provider:
      name: aws
      runtime: python3.8
    
    functions:
      hello:
        handler: handler.hello
        environment:
          # store the value directly
          deliveryMethod: email
    

    将参数存储在 SSM 存储中

    将参数存储在SSM参数存储中并在serverless.yml中引用它

    #serverless.yml
    service: my-service
    
    provider:
      name: aws
      runtime: python3.8
    
    functions:
      hello:
        handler: handler.hello
        environment:
          # store the value directly
          deliveryMethod: ${ssm:/path/to/deliveryMethod}
    

    然后在 lambda 代码中:

    # lambda code
    def lambda_handler(event, context):
        deliveryMethod = os.environ['deliveryMethod']
    

    希望这会有所帮助。

    参考: https://serverless.com/framework/docs/providers/aws/guide/variables/

    【讨论】:

    • 感谢阿伦的回答!澄清一下,这是特定于 Python 的吗?我正在查看的示例使用 NodeJS,他们的操作方式如下(cmets 来自示例): const params = { TableName: process.env.tableName, }; YAML 文件:environment: tableName: notes 显然,YAML 文件中的变量可通过“process.env.”获得
    • lambda 代码是 python。我以为你想要的是 python,因为你的问题有 python 代码。如果你想使用nodejs,你是对的,那就是process.env.tableName
    • 对不起,你是对的。我不够清楚。我正在尝试自己用 Python 重做本教程。但我想知道如何达到同样的效果
    • 如何直接引用该环境变量?所以在 YAML 中会是 environment: tableName: 'notes_project' 然后在 lambda 函数中我会使用 os.environ['tableName']?
    • 感谢您的反馈,很高兴能为您提供帮助
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2021-03-01
    相关资源
    最近更新 更多