首页 > 解决方案 > 圣杯 on_s3_event 触发器似乎不起作用

问题描述

我有一个 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 函数中的全局状态吗?

标签: amazon-s3aws-lambdachalice

解决方案


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

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

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


推荐阅读