在 python 中编码的 aws lambda 函数上使用不同的设置

Using different settings on a aws lambda function coded in python

我正在使用在 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 class),将匹配模块设置中的设置文件名,我应该改变什么我的 class 使它工作的实用程序?

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

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

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

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

我终于在这里使用了不同的方法。我没有使用 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