首页 > 解决方案 > 更新 AWS Elastic Beanstalk 部署的 Webapp 使用的数据

问题描述

我创建了一个仪表板并将其部署在 AWS Elastic Beanstalk 上。输入我的仪表板的数据由我的 S3 存储桶中的 CSV 文件提供,设置为使用 AWS EventBridge 每 12 小时更新一次。出于某种原因,我部署的仪表板没有更新。即使 CSV 文件已正确更新,它仍在使用我之前部署的相同旧数据。

进一步来说:

假设我在 2020 年 12 月 10 日部署了该应用程序。CSV 文件将包含截至 2020 年 12 月 10 日的所有数据,我的仪表板将显示 2020 年 1 月 1 日到 2020 年 12 月 10 日之间的趋势。

但是,如果我在 2020 年 12 月 10 日之后的任何时间(或者当 CSV 文件使用 2020 年 12 月 10 日之后的数据更新时)检查仪表板,它仍然显示相同的趋势(在 2020 年 1 月 1 日和 2020 年 12 月之间) 10),尽管我的 S3 存储桶中的 CSV 文件是最新的。

仅当我在 Elastic Beanstalk 上重新部署应用程序时,仪表板才会更新。不知道为什么会这样,因为我的应用程序直接从更新的 CSV 文件中提取数据。

我的架构在这里不正确吗?还是我需要调整 AWS 中的一些设置?

提前致谢!


更新:

我正在使用以下代码将我的数据加载到trends_data数据框中。

# define bucket name
bucket = "mobilitytrends"
# define s3 client
s3 = boto3.client('s3')
# define file names
historical_file_name = 'historical_trends.csv'
# load historical data from s3
data_obj = s3.get_object(Bucket= bucket, Key= historical_file_name)
trend_data = pd.read_csv(data_obj['Body'],low_memory = False)

然后我有一些清理这个数据框的函数。我有一个使用下面的代码片段呈现的散点图:

fig.add_scatter(x = filtered_trend.index,
                y = filtered_trend[transportation],
                line = dict(color = line_color[idx]),
                name = transportation)

filtered_trend是 的一个子集trends_data,它是根据我设置的一些回调函数来选择的。但我不认为这就是问题所在,因为一切都在本地运行良好。

标签: amazon-web-servicesamazon-s3amazon-elastic-beanstalkboto3plotly-dash

解决方案


我有一个类似的问题,EB 没有从 s3 存储桶中获取最新版本的 CSV。我能找到的唯一选择是在 s3 存储桶中更新新版本的 CSV 后重新启动应用服务器。

您可以在 AWS lambda 函数中使用以下代码在一天中的特定时间重新启动您的应用服务器:

import boto3
client = boto3.client('elasticbeanstalk', region_name='your-region')
def lambda_handler(event, context):
    try:
        response = client.restart_app_server(EnvironmentName='your-environment-name')
        if response:
            print('restarting app server')
        else:
            print('Failed to restart server')

    except Exception as e:
        print(e)

确保使用 eventbridge 设置 cron 进行计时


推荐阅读