在 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
我正在使用在 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