0

我有一个 Chalice 应用程序,它从 S3 存储桶中的文件中读取配置数据。该文件可能会不时更改,我希望应用程序立即使用更新的值,因此我使用on_s3_event装饰器重新加载配置文件。

我的代码看起来像这样(为了清楚起见,将其剥离):

CONFIG = {}
app = Chalice(app_name='foo')

@app.on_s3_event(bucket=S3_BUCKET, events=['s3:ObjectCreated:*'],
    prefix='foo/')
def event_handler(event):
    _load_config()

def _load_config():

    # fetch json file from S3 bucket

    CONFIG['foo'] = some item from the json file...
    CONFIG['bar'] = some other item from the json file...

_load_config()

@app.route('/')
def home():
    # refer to CONFIG values here

我的问题是,在上传新版本的配置文件后的一小段时间(可能 5-10 分钟),应用程序仍然使用旧的配置值。

我做错了吗?我不应该完全依赖 Lambda 函数中的全局状态吗?

4

2 回答 2

0

所以你这里的设计是有缺陷的。

当您在 chalice 中创建 S3 事件时,它将为该事件创建一个单独的 Lambda 函数。CONFIG 变量将在该 Lambda 函数的运行实例和 Lambda 函数的所有新实例中得到更新。但是,您的 Chalice 应用程序中已经运行的任何其他 Lambda 将继续使用其当前设置,直到它们被清理并重新启动。

如果您无法忍受仅在部署 Lambda 函数时才可更改的配置,您可以使用 redis 或内存缓存/数据库中的其他一些。

于 2019-12-16T20:44:50.987 回答
0

您应该使用 .config/config.json 文件来存储您的圣杯应用程序的变量。这些变量存储在 os 库中,可以调用:

URL = os.environ['MYVAR']

您的 config.json 文件可能如下所示:

{
  "version": "2.0",
  "app_name": "MyApp",
  "manage_iam_role": false,
  "iam_role_arn": "arn:aws:iam::************:role/Chalice",
  "lambda_timeout": 300,
  "stages": {
    "development": {
      "environment_variables": {
        "MYVAR": "foo"
      }
    },
    "production": {
      "environment_variables": {
        "MYVAR": "bar"
      }
    }
  },
  "lambda_memory_size": 2048
}
于 2020-01-28T20:40:46.777 回答