【问题标题】:Using different settings on a aws lambda function coded in python在用 python 编码的 aws lambda 函数上使用不同的设置
【发布时间】:2016-06-02 15:09:43
【问题描述】:

我正在使用一个用 python 编码的 lambda 函数作为 aws-api-gateway 方法的后端。
api已经完成,但是现在我有一个新的问题,api应该部署到多个环境(生产、测试​​等),并且每个都应该为后端使用不同的配置。假设我有这个处理程序:

import settings
import boto3

def dummy_handler(event, context):
    logger.info('got event{}'.format(event))
    utils = Utils(event["stage"])
    response = utils.put_ticket_on_dynamodb(event["item"])
    return json.dumps(response)

class Utils:

    def __init__(self, stage):
        self.stage = stage

    def put_ticket_on_dynamodb(self, item):
        # Write record to dynamoDB
        try:
            dynamodb = boto3.resource('dynamodb')
            table = dynamodb.Table(settings.TABLE_NAME)
            table.put_item(Item=item)
        except Exception as e:
            logger.error("Fail to put item on DynamoDB: {0}".format(str(e)))
            raise
        logger.info("Item successfully written to DynamoDB")
        return item

现在,为了在每个阶段使用不同的TABLE_NAME,我将setting.py文件替换为一个模块,结构如下:

settings/
    __init__.py
    _base.py
    _servers.py
    development.py
    production.py
    testing.py

按照这个答案here
但我不知道如何在我的解决方案中使用它,考虑到该阶段(作为参数传递给 Utils 类)将匹配模块设置中的设置文件名,我应该在我的类 Utils 中更改什么让它工作?

【问题讨论】:

  • 我不明白你的问题。链接的答案建议让settings/__init__.py 包含一些逻辑来确定它部署在哪种服务器上,然后导入相应子模块的内容。如果您这样做,则在查找设置的代码中无需执行任何操作。
  • @Blckknght,就​​我而言,我没有逻辑来确定阶段的种类,我只有参数阶段,并将其传递给 init 方法Utils 类的。

标签: python-2.7 aws-api-gateway


【解决方案1】:

处理此用例的另一种方法是使用 API Gateway 的阶段变量,并将因阶段而异的设置作为参数传递给您的 Lambda 函数。

阶段变量是与特定 API 部署阶段关联的名称-值对,其作用类似于用于 API 设置和映射模板的环境变量。例如,您可以通过在阶段变量中设置不同的端点值来配置每个阶段的 API 方法以连接到不同的后端端点。

这里是blog post 使用阶段变量。

这是关于使用阶段变量的full documentation

【讨论】:

  • 谢谢 Mike,但这里的问题更多是关于 python 以及如何使用舞台信息导入不同的设置文件,使用相同的 lambda 函数。我已经在传递舞台信息了。
【解决方案2】:

我终于在这里使用了不同的方法。我没有使用 python 模块进行设置,而是使用单个脚本进行设置,并使用包含每个环境配置的字典。我想为每个环境使用单独的设置脚本,但到目前为止我找不到方法。

所以,现在我的设置文件如下所示:

COUNTRY_CODE = 'CL'
TIMEZONE = "America/Santiago"
LOCALE = "es_CL"
DEFAULT_PAGE_SIZE = 20

ENV = {
    'production': {
        'TABLE_NAME': "dynamodbTable",
        'BUCKET_NAME': "sssBucketName"

    },
    'testing': {
        'TABLE_NAME': "dynamodbTableTest",
        'BUCKET_NAME': "sssBucketNameTest"

    },
    'test-invoke-stage': {
        'TABLE_NAME': "dynamodbTableTest",
        'BUCKET_NAME': "sssBucketNameTest"
    }
}

还有我的代码:

def put_ticket_on_dynamodb(self, item):
    # Write record to dynamoDB
    try:
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table(settings.ENV[self.stage]["TABLE_NAME"])
        table.put_item(Item=item)
    except Exception as e:
        logger.error("Fail to put item on DynamoDB: {0}".format(str(e)))
        raise
    logger.info("Item successfully written to DynamoDB")
    return item

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2021-03-20
    • 2019-01-08
    相关资源
    最近更新 更多