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

Python 2.7 在用python编码的aws lambda函数上使用不同的设置,python-2.7,aws-api-gateway,Python 2.7,Aws Api Gateway,我使用一个用python编码的lambda函数作为aws api网关方法的后端。 api已经完成,但现在我有一个新问题,api应该部署到多个环境(生产、测试等),每个环境都应该为后端使用不同的配置。假设我有一个处理程序: import settings import boto3 def dummy_handler(event, context): logger.info('got event{}'.format(event)) utils = Utils(event["stag

我使用一个用python编码的lambda函数作为aws api网关方法的后端。
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
现在,为了在每个阶段上使用不同的
表名
,我用一个模块替换setting.py文件,其结构如下:

settings/
    __init__.py
    _base.py
    _servers.py
    development.py
    production.py
    testing.py
以下是答案。

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

处理此用例的另一种替代方法是使用API网关的阶段变量,并将阶段不同的设置作为参数传递给Lambda函数

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

下面是一个关于使用阶段变量的示例


下面是关于使用阶段变量的说明。

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

我不明白你的问题。链接的答案建议设置
settings/\uuuuu init\uuuuu.py
包含一些逻辑,以确定它部署在哪种类型的服务器上,然后导入相应子模块的内容。如果这样做,则在查找设置的代码中无需执行任何操作。@Blckknght,在我的情况下,我没有确定阶段类型的逻辑,我只有param阶段,我将其传递给类Utils的init方法。谢谢Mike,但是这里的问题更多的是关于python的,以及如何使用阶段信息导入不同的设置文件,使用相同的lambda函数。我已经在传递舞台信息了。