当前位置: 首页 > news >正文

构建第一个事件驱动型 Serverless 应用

我相信,我们从不缺精彩的应用创意,我们缺少的把这些想法变成现实的时间和付出。

我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。

在我 20 多年 IT 从业经历中,一直专注于 IT 基础架构的设计和搭建,并没有很多编程的经验。入职亚马逊云科技之后,我成为一名开发者布道师,为了了解和传播亚马逊云科技的无服务器技术,我做了一系列“这就是无服务器”的学习视频。我想仅仅了解技术的功能和特性是不够的,我还应该掌握如何利用无服务器技术,编译和运行代码来构建我的应用。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点 这里让它成为你的技术宝库!

你可能是和我一样,对编码比较陌生,只是在寻找一种方法来建立我们心中的应用程序。或者,你可能是一个有很多编码经验的人,但仅限于在服务器或容器上运行过应用程序,现在希望探索无服务器。无论你带着哪种目的关注这篇,我都希望以下的内容带你了解我的无服务器学习之旅,了解我如何从对无服务器一无所知到建立自己的应用程序。

项目背景

因为我所在的团队是一个分布在全球的组织。对于实现有效的沟通,语言是个重要工具。我在学习英文的同时,我的“歪果仁”同事也在学习中文。我们互为对方的语言老师。在学习的过程中,我发现中文的学习看起来要比英文学习更为困难。为了让我的同事跟上我的进度,我有了为他构建一个中文学习 app 的有趣想法。

首先这个应用程序要提供交付中文单词学习的日提醒服务。我想这个 app 设计逻辑应该是从一个词汇数据库里按照设定好的时间和规则拉出一个词,并通过邮件或者文本的方式发送给用户。

图片

然而,我只是有一些 Python 和 JavaScript 简单的 coding 经验,但是我还是希望把这个 app 做成一个能真正被使用的语言学习 app:

  • 它能够持续维护并可以扩展新功能;
  • 作为一个运行在云端的真正的应用,我希望它的成本不要太高;
  • 由于目前仅有一个运维工程师(就是本人)的 app,我希望它的运营和维护工作量也不要太大,而且最好它还能根据访问情况,自动的扩缩容(这个很重要)。

构建平台和服务的选择

对于这个应用,我选择无服务器服务和架构。

所谓的无服务器不是指没有服务器,代码的编译和运行还是需要服务器的计算资源,只是无论是代码编译还是运行,都不用配置和管理服务器。

举个例子,以前我们运行一个应用或者构建一个 web 网站,首先需要对服务器进行配置,包括系统安装,补丁以及更新。同时还需要容量的预估和分配。为业务高峰预留的资源大部分时间闲置,但是仍需付费。除此之外在整个应用的生命周期中,服务器的管理和运维也会花费很多时间。总而言之,除了应用构建本身,还需要大量的时间和资源花在服务器的管理上。

做为亚马逊云科技的构建者,我将这个应用部署在亚马逊云科技的云平台上并选用 Amazon Lambda,做为计算服务,通过 lambda 函数,运行任何类型的代码,我只需要把一段代码放进函数。同时由于它是事件驱动的,对于这个应用,日历做为事件来触发 lambda 函数运行代码。所有服务器相关的配置和管理工作由亚马逊云科技提供,而我只需要专注于应用本身,只需要专注于代码编译和运行。同时无服务器的技术特点就包括了自动扩缩容、按需付费,不用考虑底层计算资源的配置和预留,等等。

接下来,我需要 API 让应用的前端和后端进行交互,同时我选择 Amazon S3 和 Amazon DynamoDB 做为应用数据的存储。应用程序之间需要不同类型的粘合剂,因此我用到来亚马逊云科技提供其他无服务器架构的集成服务,包括:

  • SQS 帮我创建消息队列;
  • 使用 Amazon SNS 发送文本信息或电子邮件;
  • Amazon EventBridge 通过设置一个按每天或每周的节奏运行的事件,来触发 lambda 函数;
  • Amazon Step Functions 用来构建工作流;
  • ...

我还需要托管我们静态内容的服务,比如 HTML 以及前端的相关内容,我选择了 Amazon Amplify。考虑到如果有用户需要登录这个网站或进行某种身份验证,因此我有用了 Amazon Cognito 来实现身份验证。

所有的这些服务协同工作,彼此深度集成,帮助我快速的构建应用。

图片

开发工具和应用架构的选择

在设计开发这个应用程序的一开始,我花了很多时间在 testfunction console 和这个可爱的按钮上,因为它允许我当场测试我的函数代码的可行性。

如果你只是想学习一下 lambda,感受它是怎么工作的,测试你写的一小段代码是否正常工作,console 绝对是个好地方。你直观的看到代码执行过程中具体发生了什么。这是一种很好的方式去学习和理解 lambda 函数。

图片

如果你只是想单纯的学习和测试一下函数,只是看看它们的样子,以及它们是如何工作的,使用 testfunction console 就可以了。

但是如果你想构建一个便于更改的应用程序,同时可以支持迭代更新,并且可以通过模版进行部署”,那我建议您选择 “serverless infrastructure as code” 做为开发框架。

这意味着可以将整个应用程序都用代码定义,将所有变更都保存下来,对于开发过程中,需要回滚到应用程序的先前版本,或者确保每次都以正确的方式进行配置的要求,IaC 是非常有帮助。

对于 IaC 的开发框架,开发者们有很多选择,包括亚马逊云科技开源的 SAM(serverless application model),Serverless Framework,以及 Amazon Cloud development Kit or Amazon CDK。

我个人比较推荐使用 Amazon SAM。在这个中文学习 app 的构建中我使用了 Amazon SAM。原因是它对初学者很友好。

这是一段 SAM template,使用的 Python 3.8 运行:

图片

如果你和我一样,也在亚马逊云科技云平台上构建应用,相信你一定用 IAM policy 对不同服务之间的调用进行过身份验证。那么你一定对很多很多行代码才能实现的过程印象深刻。而在这段 SAM policy template,SNS published message policy,仅仅需要两行代码。最后通过创建 “DailyEventBridgeEvent” 事件来触发 lambda 函数,就完成了。

使用 SAM 部署 serverless 应用,是不是真的很简单,容易上手?

对于 serverless 架构的应用来说,它可以自动获得云上的资源。因此我们需要常常面对资源的变化带来的部署问题。建议的方式是设置自动部署 pipeline。只要用一种非常简单的自动化方式来将代码添加到资源库,很快就能看到它们在云端上线,这是一种非常美好的感受。对于设置自动部署 pipeline,实现 CI/CD,有很多的工具和方式可以选择,比如 CircleCI,GitHub 以及亚马逊云科技提供的 Amazon CodePipeline。

图片

无服务器应用构建

1. 消息发送

图片

使用 Amazon EventBridge 来计划每日事件。Amazon EventBridge 将触发 lambda 函数,通过运行代码从 S3 存储桶中提取单词并随机选择一个做为今天的学习词汇。然后由 Amazon SNS 将这个随机选取的单词用短信的方式发送到手机端。基于这个架构的 lambda 函数代码示例。

import json
import boto3
s3_client = boto3.client('s3')
sns_client = boto3.client('sns')
def lambda_handler(event, context): # Call S3 to retrieve today's vocabulary word    message = “Today’s word is ” + wordtry:         response = sns_client.publish(            TargetArn='arn:aws:sns:us-east-1:1234567890:App',            Message=json.dumps({'default': json.dumps(message)}),            MessageStructure='json'        )    except Exception as e:        print(f"Failed to send text message. Error: {e}")

实现每提取一个词汇,生成一条消息,然后调用 SNS 将该消息发布到目标 ARN。在这里我将消息发布到我的一个同事的手机端,因此我只需要把 Target ARN 定义成他的手机号码,他就可以每天收到中文词汇的学习信息了。

2. 订阅模式的扩展

随着更多同事对这个中文学习的 app 感兴趣,我发现手动添加手机号码和功能管理就成了麻烦事儿。所以我决定再做一个订阅网站,通过用户界面让他们自己订阅或者退订。

如同所示,我做了小的调整:

图片

为了节省成本,将中文词汇用 email 的方式发送客户端,替换掉之间短信发送的方式。然后用 Amazon Amplify 托管静态网页的内容,比如一些 HTML 和 CSS 的前端显示。使用 API Gateway 来连接 lambda 函数。当用户想要订阅或者退订服务的时候,API 就会触发函数执行操作,在 Dynamo DB 数据库中进行相关数据的更新。

图片

这就是中文学习应用的用户界面,有限的 JavaScript 的能力就只能做到这里了。不过这个应用支持订阅,还可以根据不同的级别接受相关中文词汇学习信息的定期邮件发送。

3. 规划数据库访问模式

在应用开始的模型中,我仅用了 S3 服务存储一个 CSV 文件,其中包含所有词汇表。但有了更多用户并更改为订阅模式后,我决定用更结构化数据管理方式来升级应用程序的存储配置。

于是我选择 DynamoDB,因为他具有 serverless 属性,比如按用量付费、使用 IAM 对他进行身份验证,通过 API 调用来实现和其他服务之间的交互等。因此我就不会遇到传统数据库服务的一些限制,比如指定的是时间内连接数的限制。同时,用 Amazon Web Services lambda 与之搭配。这样在面对 lambda 的弹性扩展,数据库的调用才不会成为瓶颈。

但 DynamoDB 也是一种 No SQL 的非关系型数据库,这和运行在单实例上完整的数据库不同,当向 DynamoDB 添加数据时,它会自动对该数据进行分片或分解成块,并将其放在不同的服务器上。我想确保我最常提取的数据被组合在一起,因此我规划了数据库访问模式,将最常被拉取的数据分组在一起。

图片

4. 丰富用户登陆功能

我还希望这个中文学习 app 能够有更多功能来优化一下用户的登录体验。比如用户最好能够通过输入用户名和密码验证登录。另外订阅用户能够配置自己个性化的信息。甚至我还想让用户在这个 app 中设置词汇测试...

于是对于这个应用,我继续改进。

我向后端添加了用户身份验证和用户配置文件,添加了两个新的 lambda 函数和两个新的 API 端点。一个获取用户数据,一个更新用户数据。这两者都需要数据保护服务。因此他们还需要调用 Cognito 来进行身份验证,验证通过才能访问和获取数据。具体的架构就变成了这样:

图片

改造后用户交互界面就变成了这个样子:

图片

一个中文学习 app 就基本完成了,这是我的一个事件驱动型的 serverless 应用:实现了云资源的自动扩所容,基本不需要太花精力在底层资源的运维。在云上的构建和运行成本也是可以承受的。

我大致做了一个估算,成本分析如下:

用户规模如果达到 100+ 的活跃订阅者,每个月会产生 4500 API Gateway requests,4800 Lambda invokes,10000 Amazon CloudFront requests 以及 32000 Amazon S3 requests,那么每月应用运行的总支出不超过 1 美金。这是真的。

图片

开始你的第一个事件驱动型 serverless 应用

如同开始所提到的,事件驱动型无服务器应用具有完全托管、无状态、事件驱动、自动扩展、轻量低成本、弹性高可用、以及无需运维等特点。这使其非常适合处理短暂、高并发和容易扩展的工作流,能够大幅提高资源利用率并降低应用成本。因此,它正逐渐演进为构建云原生应用的主流架构与方式。也成为云上构建者首选的技术和应用架构。

当你打开亚马逊云科技的官方主页,搜索并了解亚马逊云科技提供的所有 serverless 服务时,你会发现,这是一个大家族,从计算,到存储,再到数据库和信息集成,还有最新的数据分析服务。亚马逊云科技提供了全栈式的 serverless 服务。

希望亚马逊云科技提供的无服务器服务和开发框架以及我的开发经历可以帮助到你开始你的第一个事件驱动型的 serverless 应用。

请持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!

往期推荐

#Generative AI 新世界

#开发者生态

#亚马逊实践

图片

文章来源:
https://dev.amazoncloud.cn/column/article/6482a9e94a40447dcdc0d7bf?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN 

相关文章:

构建第一个事件驱动型 Serverless 应用

我相信,我们从不缺精彩的应用创意,我们缺少的把这些想法变成现实的时间和付出。 我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。 在我 2…...

特征与特征图的区别

1.特征图是什么? 特征图是指在卷积神经网络中,通过卷积操作从输入图像中提取出来的图像特征。在卷积神经网络中,每一层的输出都是一个三维张量,其中第三维表示特征图的数量。每个特征图都是由若干个卷积核对上一层的特征图进行卷…...

Linux学习笔记之七(shell脚本的基本语法)

Shell 1、Shell脚本2、常用运算符2、特殊语法4、关于变量的一些命令4.1、echo4.2、export4.3、read4.4、declare/typeset4.5、local4.6、unset 5、基本逻辑语法5.1、if判断5.2、for循环5.3、while循环5.4、case语句 6、函数定义7、多脚本链接 1、Shell脚本 学习shell脚本开发之…...

PySpark开发环境搭建常见问题及解决

PySpark环境搭建常见问题及解决 1、winutils.exe问题2、SparkURL问题3、set_ugi()问题 本文主要收录PySpark开发环境搭建时常见的一些问题及解决方案,并收集一些相关资源 1、winutils.exe问题 报错摘要: WARN Shell: Did not find winutils.exe: {} ja…...

supervisor管理启动重启,Java,Go程序Demo

简介 Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启 1、安装 yum -y install supervisor2、配置默认配置文件 echo_supervisord_conf &g…...

HarmonyOs 4 (三) ArkTS语言

目录 一 认识ArkTs语言1.1 ArkTs1.2 基本结构 二 基本语法2.1 声明式UI2.1.1 创建组件2.1.1.1 无参数2.1.1.2 有参数2.1.1.3 组件样式2.1.1.4 组件方法2.1.1.5 组件嵌套 2.1.2 自定义组件2.1.2.1 基本结构2.1.2.2 成员函数/变量2.1.2.3 自定义组件的参数规定2.1.2.4 Build函数2…...

PostGIS学习教程九:空间连接

PostGIS学习教程九:空间连接 空间连接(spatial joins)是空间数据库的主要组成部分,它们允许你使用空间关系作为连接键(join key)来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示…...

C++ day56 两个字符串的删除操作 编辑距离

题目1:583 两个字符串的删除操作 题目链接:两个字符串的删除操作 对题目的理解 返回使两个单词word1和word2相同的最少删除多少个元素,两个单词至少包含一个字母,且仅包含小写字母 思路1:这道题与昨天的不同子序列…...

Android studio中如何生成jar包?

文章目录 需求背景目录结构gradle结构makeJar的语法解析 执行makeJar 任务拿到jar包 需求背景 别部门做C语言开发的同学开发了一个库,需要给我们Android端去调用。 我们拿到源码,首先需要做的是通过CMake去把C源码编译链接成动态库。 当然静态库也行&am…...

【2】基于多设计模式下的同步异步日志系统-设计模式

6. 相关技术知识补充 6.1 不定参函数 在初学C语⾔的时候,我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数,在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。 ⽽这种不定参函数在实际的使⽤中也⾮常…...

第十五届蓝桥杯模拟赛B组(第二期)C++

前言: 第一次做蓝桥模拟赛的博客记录,可能有很多不足的地方,现在将第十五届蓝桥杯模拟赛B组(第二期)的题目与代码与大家进行分享,我是用C做的,有好几道算法题当时自己做的也是一脸懵&#xff0c…...

企业ERP软件定制开发要注意|app小程序搭建

企业ERP软件定制开发要注意|app小程序搭建 企业ERP软件定制开发是一项复杂而且关键的任务,它需要深入理解企业的需求和流程,并且以此为基础进行设计和开发。以下是一些关于企业ERP软件定制开发的注意事项。 首先,我们必须确保在进行定制开发之…...

系统架构设计-权限模块的设计

系统架构-权限模块的设计 如何评估一个研发人员技术水平,在大部分的情况下不是看其完成业务代码的好坏,更多的时候还是需要看这个研发人员从零构建一个完整项目的能力,在大公司中这样的机会可能相对较少,大部分的时间里都是对现有…...

IDEA切换Python虚拟环境

前言 因为之前一直使用的IDEA开发,换到VSCODE之后各种不习惯,特别是DEBUG的操作,特别难受,因此决心换回IDEA 环境配置 已有项目调整 进入Project 选择SDKs,新建Python 配置Conda以及虚拟环境 有就选择一个虚拟环境…...

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测: 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域,它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作,可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…...

prime靶机打靶记录

靶机下载地址 https://download.vulnhub.com/prime/Prime_Series_Level-1.rar nmap搜索目标 使用nmap -sn 192.168.41.0/24找到目标靶机192.168.41.136 扫描端口,因为是靶机,所以速率直接调了10000 扫出来两个端口22和80,进行详细的扫描 没…...

树莓派,linux换清华源

清华源网址 https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/ 更换软件源 鉴于国内网络环境下载各大镜像,软件包速度慢的问题,需要更换软件源,以防下载慢,且在本教程中,统一更换为清华源。 2.3.1 更换树莓派软…...

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时,往往会遇到数据库迁移的任务。如果数据量不是特别大&…...

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中,容器编排工具的选择对于简化流程、提高效率至关重要。本…...

IP地址定位不准确的情况研究

在互联网的浩瀚海洋中,每一台连接到网络的设备都被赋予了一个独特的标识符,这就是IP地址。它就像是我们在线身份的一部分,帮助我们与他人进行通信,获取信息,以及享受各种网络服务。然而,由于各种原因&#…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...