从 Python 脚本到无服务器 AWS:我的投资组合之旅
我从用于 AWS 自动化的简单 Python 脚本开始,逐渐演变成一个更复杂的项目。 三个月前,我几乎不懂元类;现在,我已经建立了一个成熟的投资组合经理。
我的旅程
多年来使用 Python 进行 AWS 自动化(包括臭名昭著的“does-everything”脚本)让我构建了一个合适的应用程序。 借助我过去的脚本、Stack Overflow 以及 Claude 的 AI 帮助,我终于掌握了软件开发原理。
应用截图(种子数据,非实际投资)。
厌倦了手动更新我的投资组合的 Excel 电子表格,我自动化了该过程。 这个Python应用程序管理投资组合、跟踪交易、处理股息,甚至自动更新价格。 最初,它在我的家庭服务器上的 Docker 中运行良好(Flask 后端、React 前端、SQLite 数据库)。
“爱好变成工作”难题
在我的家庭服务器上运行它感觉效率很低。 作为一名 AWS 专业人士,在我的硬件上管理容器似乎违反直觉。解决方案似乎显而易见:ECS。我已经有了 docker-compose
文件:
<code>services: backend: build: ./backend container_name: investment-portfolio-backend environment: - DB_DIR=/data/db - LOG_DIR=/data/logs - DOMAIN=${DOMAIN:-localhost} volumes: - /path/to/your/data:/data networks: - app-network frontend: build: context: ./frontend args: - DOMAIN=${DOMAIN:-localhost} - USE_HTTPS=${USE_HTTPS:-false} container_name: investment-portfolio-frontend environment: - DOMAIN=${DOMAIN:-localhost} - USE_HTTPS=${USE_HTTPS:-false} ports: - "80:80" depends_on: - backend networks: - app-network</code>
但是,AWS 架构师的观点(以及定价计算器)建议采用无服务器方法:
- 每日价格更新和不频繁访问建议避免 24/7 容器。
- 静态前端文件非常适合 S3 网站托管。
- API 网关和 Lambda 将处理 API 调用。
- Aurora Serverless 适合关系数据。
- DynamoDB 可以存储价格历史记录(尽管我没有达到这个阶段)。
这让我陷入了无服务器的兔子洞。 我之前有过无服务器经验 - 与我的妻子一起进行温度跟踪项目,使用 KNMI 数据并为手工项目生成颜色编码表。
<code>| Date | Min.Temp | Min.Kleur | Max.Temp | Max.Kleur | ---------------------------------------------------------------- | 2023-03-01 | -4.1°C | darkblue | 7.1°C | lightblue | | 2023-03-02 | 1.3°C | blue | 6.8°C | lightblue | ...</code>
该项目在本地运行或通过 Lambda/API Gateway 运行,采用日期参数。 事实证明,将其扩展到具有 SQLAlchemy、后台作业和复杂关系的完整 Flask 应用程序具有挑战性。
无服务器的魅力
我的容器化应用程序运行良好,但无服务器服务的吸引力很强。 自动扩展和消除容器管理的潜力非常诱人。
因此,我为无服务器环境重新构建了我的应用程序。 最初的项目花了两个月的时间;这会是一件轻而易举的事……至少我是这么想的。
数据库决策
SQLite 对 Lambda 的限制让我考虑使用 PostgreSQL Aurora Serverless,以保持与我的 SQLAlchemy 知识的兼容性。 我创建了一个双处理程序:
<code>services: backend: build: ./backend container_name: investment-portfolio-backend environment: - DB_DIR=/data/db - LOG_DIR=/data/logs - DOMAIN=${DOMAIN:-localhost} volumes: - /path/to/your/data:/data networks: - app-network frontend: build: context: ./frontend args: - DOMAIN=${DOMAIN:-localhost} - USE_HTTPS=${USE_HTTPS:-false} container_name: investment-portfolio-frontend environment: - DOMAIN=${DOMAIN:-localhost} - USE_HTTPS=${USE_HTTPS:-false} ports: - "80:80" depends_on: - backend networks: - app-network</code>
Lambda 学习曲线
将 Flask 应用程序转换为 Lambda 函数比预期的更复杂。 我最初的尝试很笨拙:
<code>| Date | Min.Temp | Min.Kleur | Max.Temp | Max.Kleur | ---------------------------------------------------------------- | 2023-03-01 | -4.1°C | darkblue | 7.1°C | lightblue | | 2023-03-02 | 1.3°C | blue | 6.8°C | lightblue | ...</code>
为了提高可维护性,我创建了一个装饰器:
<code>@contextmanager def db_session(): # ... (code for environment-aware database session management) ...</code>
改进的 Lambda 函数结构:
<code># ... (initial, inefficient Lambda handler code) ...</code>
然而,这打破了Flask原来的路线。 新的装饰器启用了双重功能:
<code>def lambda_response(func): # ... (decorator for cleaner Lambda responses) ...</code>
支持功能确保一致的响应:
<code>@lambda_response def get_portfolios(event, context): # ... (simplified Lambda function) ...</code>
这允许 Flask 和 Lambda 使用相同的路由:
<code>def dual_handler(route_path, methods=None): # ... (decorator for both Flask routes and Lambda handlers) ...</code>
前端简单性
前端很简单。 S3 静态网站托管和 CloudFront 提供轻松部署。 一个简单的脚本将前端上传到 S3 并使 CloudFront 缓存失效:
<code>def create_lambda_response(flask_response): # ... (function to convert Flask response to Lambda response format) ... def create_flask_request(event): # ... (function to convert Lambda event to Flask request) ...</code>
结果
经过几周的工作,我的应用程序已经实现了无服务器。 虽然出于安全考虑我不会将其保留在网上,但我学到了宝贵的经验教训:
- Python 的功能超出了脚本编写的范围。
- AWS 免费套餐对于开发来说非常宝贵。
- CloudWatch Logs 对于调试至关重要。
- “正确”的方式并不总是 AWS 方式。
我可以重复一遍吗?可能不会。 但这次旅程是有益的,教会了我有关 Python 和双栈开发的知识。 我的投资组合经理现在可以在我的专用网络上安全运行。
以上是从 Docker 到 Lambda:AWS 管理员的 Python 应用程序之旅的详细内容。更多信息请关注PHP中文网其他相关文章!

当遇到“commandnotfound”错误时,应检查以下几点:1.确认脚本存在且路径正确;2.检查文件权限,必要时使用chmod添加执行权限;3.确保脚本解释器已安装并在PATH中;4.验证脚本开头的shebang行是否正确。这样做可以有效解决脚本运行问题,确保编码过程顺利进行。

ArraySareAryallyMoremory-Moremory-forigationDataDatueTotheIrfixed-SizenatureAntatureAntatureAndirectMemoryAccess.1)arraysStorelelementsInAcontiguxufulock,ReducingOveringOverheadHeadefromenterSormetormetAdata.2)列表,通常

ToconvertaPythonlisttoanarray,usethearraymodule:1)Importthearraymodule,2)Createalist,3)Usearray(typecode,list)toconvertit,specifyingthetypecodelike'i'forintegers.Thisconversionoptimizesmemoryusageforhomogeneousdata,enhancingperformanceinnumericalcomp

Python列表可以存储不同类型的数据。示例列表包含整数、字符串、浮点数、布尔值、嵌套列表和字典。列表的灵活性在数据处理和原型设计中很有价值,但需谨慎使用以确保代码的可读性和可维护性。

Pythondoesnothavebuilt-inarrays;usethearraymoduleformemory-efficienthomogeneousdatastorage,whilelistsareversatileformixeddatatypes.Arraysareefficientforlargedatasetsofthesametype,whereaslistsofferflexibilityandareeasiertouseformixedorsmallerdatasets.

theSostCommonlyusedModuleForCreatingArraysInpyThonisnumpy.1)NumpyProvidEseffitedToolsForarrayOperations,Idealfornumericaldata.2)arraysCanbeCreatedDusingsnp.Array()for1dand2Structures.3)

toAppendElementStoApythonList,usetheappend()方法forsingleements,Extend()formultiplelements,andinsert()forspecificpositions.1)useeAppend()foraddingoneOnelementAttheend.2)useextendTheEnd.2)useextendexendExendEnd(

TocreateaPythonlist,usesquarebrackets[]andseparateitemswithcommas.1)Listsaredynamicandcanholdmixeddatatypes.2)Useappend(),remove(),andslicingformanipulation.3)Listcomprehensionsareefficientforcreatinglists.4)Becautiouswithlistreferences;usecopy()orsl


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

Dreamweaver Mac版
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境