圆点 快速的未来即将来到您所在城市的某个活动中。

在 Redis 发布活动中加入我们

无服务器开发与 AWS Lambda 以及 Redis 企业云

这篇博文中,你将了解如何集成 AWS LambdaRedis Enterprise Cloud。使用示例电影数据库应用程序,你将发现如何构建和部署两个 Lambda 函数,一个在 Node.js 中,另一个在 Python 中。这两个 Lambda 函数用于与 Redis 数据库交互以进行插入、更新、删除和查询。该应用程序使用 RediSearch API,它提供丰富的查询和搜索功能。无服务器 使用 AWS Lambda,符合朝微服务架构发展的趋势,因为它允许开发人员将业务“服务”的范围缩小成一个小项目,可以使用他们选择的编程语言进行实现。要了解更多信息,请观看下面的视频,并继续阅读快速概览 AWS Lambda,并深入了解如何使用 Redis Enterprise Cloud 和 Lambda 构建应用程序

https://www.youtube.com/embed/UJHk1cTfs3g

快速了解 AWS Lambda

如果你不熟悉 AWS Lambda - 该公司的无服务器计算运行时,也称为函数即服务 (FaaS) - 以下是你需要了解的基础知识。(Lambda 专家可以直接跳到下一部分。)AWS Lambda 允许应用程序根据特定事件按需运行函数,这使其成为构建事件驱动架构 (EDA) 应用程序的好方法。完全由 AWS 管理的 AWS Lambda 函数可以使用各种 编程语言 创建。也许 AWS Lambda 最好的部分是开发人员通常不需要完全了解应用程序生命周期即可使用它。

可以使用多种不同方法调用 AWS Lambda:直接从 AWS 控制台,使用其他 AWS 服务的事件,例如 SNSSQSKinesis,甚至来自 AWS 控制台、CloudWatchS3 事件。在我们的示例电影数据库应用程序中,Lambda 函数将使用 HTTP REST 端点调用,这是使用 AWS API 网关 完成的。 (你可以在 文档 中找到有关 AWS Lambda 函数调用的更多信息。)

AWS Lambda HTTP 执行过程

具体来说,通过 HTTP 的请求会路由到 AWS 的 API 网关管理工具,它会解析主体、标头和参数,然后使用此有效负载触发我们的 Lambda 函数

在 API 网关中公开 AWS Lambda 函数。

作为一名开发者,您只需编写代码来公开 REST 终端节点,并配置部署,以在 AWS API 网关中公开它。(我们将在下一节讨论我们的示例电影数据库应用程序时进一步讨论此内容。)

无服务器应用程序中的状态和数据管理

AWS Lambda 是一个无状态环境。但是,在许多应用程序中,您仍然希望在服务或调用之间共享状态,Redis 可以提供帮助。对于简单的状态管理,AWS 开发者通常使用 ElastiCache,但许多应用程序需要的不只是状态管理,它们还需要持久性、丰富的数据、高性能和查询模式。Redis Enterprise Cloud 在 AWS 上提供受全面管理的服务(还支持 Google Cloud 和 Microsoft Azure)。

Redis 电影数据库示例应用程序

现在我们可以查看我们的示例电影数据库应用程序,了解使用 Redis Enterprise Cloud 和 AWS Lambda 构建应用程序的关键步骤。

该应用程序使用 RediSearch 入门教程 中记录的数据集,其中包含一个由 Redis 哈希构成的电影目录。如下图所示,前端使用 Vue.js 构建,它调用 REST 终端节点来

  • 列出、排序和筛选电影
  • 编辑电影,以及添加/删除评论
  • 使用全文搜索和分类搜索搜索电影
使用 AWS Lambda 函数的示例电影数据库应用程序的演示。

如上所述,该应用程序为数据存储利用了 AWS API 网关、AWS Lambda 和 Redis Enterprise Cloud。此外,Python 服务使用 AWS 密钥管理服务 来存储和加密 Redis 数据库密码。

安装和运行演示应用程序

要开始使用,您需要一些先决条件

在您组装好所有内容后,让我们了解一下安装和运行示例应用程序的过程。 

步骤 1:获取 Redis Enterprise Cloud 数据库信息

如果您尚未在 Redis Enterprise Cloud 上创建数据库,请使用我们的 Redis 模块入门 指南中的信息进行创建。

连接至 Redis Enterprise Cloud 时,可以在 Web 控制台中找到数据库连接信息;务必将模块“RediSearch 2”添加到数据库。

示例电影数据库应用程序的 Redis Enterprise Cloud 数据库信息。

连接 Lambda 函数到 Redis 数据库,需要以下属性

  • REDIS_HOST: redis-18541.xxx.xxxx.xxx.cloud.redis.com
  • REDIS_PORT: 18541
  • REDIS_PASSWORD : <屏幕上显示的密码>

步骤 2:从 GitHub 获取项目

将代码库克隆到本地环境,并将其移动到项目目录

> git clone https://github.com/redis-developer/aws-redis-cloud-demo.git

> cd aws-redis-cloud-demo

此处显示项目目录结构

aws-redis-cloud-demo
├── README.md
├── front-end                   => Vue.js project
│   ├── .env.development        => to set the Lambda URLs in dev mode
│   ├── .env.production         => to set the Lambda URLs in production mode    
│   ├── ...
│   └── vue.config.js
│   └── ...
├── movie-comments-microservice => The Python, comments service
│   ├── .chalice
│   │   └── config.json         => Lambda & Service configuration  
│   ├── app.py
│   ├── chalicelib              => Contains application code and lib
│   │   └── ….
│   ├── readme.md
│   └── requirements.txt
└── movies-list-microservice    => The Node.js, movie service
    ├── import_movies.redis     => Dataset file
    ├── ...
    ├── serverless.yml          => Lambda & Service configuration
    ├── src
    │   └── ...
    └── ...

步骤 3:将电影数据库数据集导入您的应用程序

文件 aws-redis-cloud-demo/movies-list-microservice/import_movies.redis 包含将电影插入数据库的所有 Redis 命令。使用的命令是

  • 针对每个电影使用 HSET
  • 使用 FT.CREATE 创建 RediSearch 索引。

要导入数据集,请打开终端并运行以下命令

> export REDISCLI_AUTH=<YOUR_DB_PASSWORD>
> redis-cli -h redis-18541.xxx.xxxx.xxx.cloud.redis.com \
        -p 18541 < movies-list-microservice/import_movies.redis

步骤 4:配置应用程序,以使用您的 Redis Enterprise Cloud 实例

在测试应用程序之前,您必须使用 Redis Enterprise Cloud 数据库实例配置 Node.js 和 Python 服务。打开以下文件

  • ./movies-list-microservice/serverless.yml
  • ./movie-comments-microservice/.chalice/config.json

然后设置 Redis 主机、端口和密码:(REDIS_HOST, REDIS_PORT, REDIS_PASSWORD)

步骤 5:构建并运行电影微服务(Node.js)

按照此处列出的步骤构建并运行项目。(您还可以在项目的 自述文件中 找到所有信息。)

  1. 安装 serverless 框架
> npm install -g serverless

2. 进入 movies-list-microservice 目录

> cd movies-list-microservice

3. 安装依赖项

> npm install

4. 在本地运行 Lambda 函数

> npm start

5. 通过向 REST 服务发起浏览器调用来测试服务:http://localhost:3000/api/movies/1

6. 通过运行以下命令将函数部署到 AWS 环境,将服务部署到 AWS

> serverless deploy
................................
Serverless: Stack update finished...
Service Information
service: movies-list-microservice
stage: api
region: us-east-1
stack: movies-list-microservice-api
resources: 33
api keys:
  None
endpoints:
  GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/search
  GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/group_by/{field}
  GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/{id}
  POST - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/{id}
functions:
  listMovies: movies-list-microservice-api-listMovies
  searchMovies: movies-list-microservice-api-searchMovies
  getMovie: movies-list-microservice-api-getMovie
  saveMovie: movies-list-microservice-api-saveMovie
layers:
  None

7. 通过将浏览器指向 https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/1 来测试 API

注意:如果您收到错误,请查看 AWS CloudWatch 中的函数日志,以查看发生了什么错误。

详细了解代码

  • package.json 文件包含此 Node.js 项目使用的依赖项。此项目非常简单,并且使用以下依赖项
    • redisredis-redisearch 库用于连接 Redis 和展示 RediSearch 命令。
    • aws-lambda 库用于调用所有 AWS Lambda 函数,以便向 AWS 环境部署节点应用程序。
  • serverless.yml 文件定义了无服务器函数,把 HTTP 操作映射到 JavaScript 函数(在 handler.ts 中定义),并且包含环境变量(在本演示中主要是一个 Redis 连接字符串)。
  • handler.ts 文件是一个类,它捕获从 AWS 网关发来的事件并调用应用程序库 SearchService,而该库会执行对 Redis 数据库的所有调用。
  • SearchService.ts 文件包含用于与 Redis 数据库交互并使用 Redis 和 RediSearch API 的所有方法:client.ft_search()、  client.aggregate()client.hmset() 等。(你可以在 Redis UniversityGitHub 的 Getting Started with RediSearch 2.0 教程 中了解有关 Redis 和 RediSearch 命令的更多信息。

步骤 6:构建并运行评论微服务 (Python)

以下是构建并运行该项目的操作步骤。(你还可以从该项目的 自述文件中 找到所有信息。)

  1. 切换到 Python 项目并创建虚拟环境
> cd movie-comments-microservice

> python3 -m venv chalice-env

> source chalice-env/bin/activate

2. 安装依赖项

> pip install -r requirements.txt

3. 设置 AWS 环境,运行以下命令并配置你的 ID 和密钥

> aws configure

AWS Access Key ID [None]: ****************ABCD
AWS Secret Access Key [None]: ****************abCd
Default region name [None]: us-west-2
Default output format [None]:

4. 部署服务到 AWS,通过运行以下命令把函数部署到你的 AWS 环境

> chalice deploy

Reusing existing deployment package.
Updating policy for IAM role: movie-comments-microservice-dev
Creating lambda function: movie-comments-microservice-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:us-east-1:11111111111:function:movie-comments-microservice-dev
  - Rest API URL: https://XXXXXXX.execute-api.us-east-1.amazonaws.com/api/

详细了解代码

  • requirements.txt 文件包含此 Python 项目使用的依赖项。此项目非常简单,并且使用以下依赖项
    • Chalice 是用于在 Python 中创建无服务器应用程序的 AWS 框架
    • redisredisearch 访问 Redis 并使用 RediSearch API
  • config.json 文件定义了无服务器应用程序,用于定义环境变量,在该应用程序中定义了 Redis 数据库连接信息。
  • app.py 文件是应用程序入口点,使用各种路由定义所有 REST 端点。该应用程序导入各种依赖项,特别是用于与 Redis 交互的 CommentService。当您想使用多个文件时,必须将文件放在 chalicelib 文件夹中。
  • comment_service.py 文件包含所有与 Redis 交互以创建、查询和删除 评论的内容。评论功能的一个有趣之处是 search() 方法。此方法用于检索按创建时间排序的电影评论,使用 search_client.search() 调用。

可以选择将 Redis 数据库密码存储在AWS Key Management Service中,可以在项目 文档中找到配置步骤。

步骤 7:运行前端应用程序

  1. 转到前端目录并安装依赖项
> cd front-end

> npm install

2. 编辑 .env.development 文件以设置电影和评论服务的 URL

VUE_APP_MOVIES_SERVICE=https://<xxx>.execute-api.<reg>.amazonaws.com/api
VUE_APP_COMMENTS_SERVICE=https://<xxx>..execute-api.<reg>.amazonaws.com/api

3. 运行应用程序

> npm run serve

4. 打开浏览器,转到 http://localhost:8084

现在您可以在应用程序中导航、更新和搜索电影,以及添加/删除评论。

可以选择使用 S3 和 CloudFront 将 Vue 应用程序部署到 AWS 环境中,并将其公开提供给您的用户。项目 文档 中对此进行了说明。

结论

使用 AWS Lambda 和 Redis Enterprise Cloud 可简化服务的部署。使用 Redis Enterprise Cloud 和 RediSearch,您可以轻松使用值来查询 Redis 数据,从而使用 Redis 作为您服务的主要数据库。

Redis Enterprise Cloud 与 Redis 兼容,让您可以轻松移植您现有的 Redis 部署,包括 OSS 和托管服务。您只需要更改连接参数(如数据库端点)。有多种方法可以执行实时移植,包括

除了RediSearch外,Redis Enterprise Cloud 允许您使用其他很有前景的数据模型,例如图形JSON时间序列布隆过滤器,并提供多种在生产环境中至关重要的其他数据库功能,包括高可用性可扩展性持久性安全主动主动地理分布

想了解更多信息?查看我们的AWS re:Invent 主页并阅读以下教程和博客文章