亚马逊AWS官方博客

适用于开发人员的无服务器入门:第 2 部分 – 业务逻辑

原文链接:

https://aws.amazon.com/blogs/compute/getting-started-with-serverless-for-developers-part-2-the-business-logic/

 

这篇博客是“适用于开发人员的无服务器入门”的第 2 部分,可帮助开发人员从其 IDE 中开始构建无服务器应用程序。在第 1 部分中,您了解了开发人员为什么需要无服务器技术,以及无服务器技术有助于解决哪些挑战。本文还向您介绍了一个示例无服务器应用程序。通过几个步骤将此应用程序部署到您的 AWS 账户,展示了无服务器技术如何让开发人员立即专注于业务逻辑。

在本文中,您将了解该业务逻辑在无服务器应用程序中的确切位置。您可以通过编辑业务逻辑来了解如何扩展应用程序,并了解涉及的一些 AWS 服务。

 

分离业务逻辑

应用程序(无服务器或其他)的目的是对某些数据执行“某些操作”,以生成有价值的输出。这里的“某些操作”指的是业务逻辑。

传统应用程序架构通常将所有业务逻辑作为单个单元或代码库保存在一起。这些应用程序有时被称为整体。这类应用程序的示例包括,使用 Express for Node.js 或 Laravel for PHP 之类的框架构建的应用程序。

但是,应用程序并不完全由业务逻辑组成;它们由多个组件或多个层级组成。整体通常将很多组件一起保存在相同代码库中:

  • 业务逻辑
  • 授权层
  • 演示层
  • 数据库层
  • 应用程序集成层
  • 通知层

无服务器应用程序使用托管服务来分离这些组件。该系列中未来的博客文章将介绍此方法的优势,并介绍一些可用于构建无服务器应用程序的托管 AWS 服务。

 

认识 AWS Lambda

博客文章第 1 部分中部署的无服务器应用程式使用 GitHub 的 Webhook 集成功能在存储库被标记上星号时通过 Slack 通知用户。它从 GitHub 的入站 Webhook 中接收事件,从 Webhook 中提取相关信息,将信息转换为 Slack 接受的格式,并将结果发布到 Slack:

该无服务器应用程序的业务逻辑包含在单个 AWS Lambda 函数内。Lambda 函数是执行特定任务的打包代码片段。代码由开发人员编写并上传到函数中。Lambda 函数由您的 AWS 账户中的 Lambda 服务运行,可针对几乎任何规模的流量。

与许多应用程序一样,Lambda 函数可以解构为三个基本组件:输入、过程和输出。事件指示 Lambda 服务开始运行函数。在示例应用程序中,事件是入站 GitHub Webhook。输入提供给函数作为事件有效负载。过程是您上传到 Lambda 函数的代码或业务逻辑,输出是函数返回的 JSON 响应。

每个 Lambda 函数必须有一个所谓的函数处理程序,它是进入点方法。

一个小型 Lambda 函数

以下步骤显示了如何对示例无服务器应用程序进行更改。您可以将其克隆到本地计算机,在 Lambda 函数中编辑业务逻辑,然后将其重新部署到 AWS 账户。

 

开始之前

  1. 按照博文 1 中的步骤克隆示例应用程序。
  2. 通过运行以下命令将目录更改为应用程序的根目录:
    cd part_2

看看目录结构。业务逻辑使用 Node.js 编写并存储在 /part_2/src/app.js 中。

处理程序方法中的前几行代码初对许多变量进行了初始化。这些值取自通过“event.body”访问的入站 GitHub 事件有效负载:

const body = JSON.parse(event.body)
const { repository, sender } = body;
const repo = repository.name;
const stars = repository.stargazers_count;
const username = sender.login;
const url = sender.html_url;

然后根据以下变量构造一个对象:

   const message ={ "attachments": [
      {
          "pretext": `There is a new Github star for _${repo}_ !`,
          "text": [
                    `_${repo}_* now has *${stars}* stars!`,
                    `Your new :star: was made by <${url}|${username}>.`
                  ].join('\n'),
          "footer": "Serverless App",
          "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png",
      }
    ]
  }

将此对象转换为字符串:

const data = JSON.stringify({"text":text});

然后,使用 axios(适用于 Node.js 的一个基于承诺的常用 HTTP 客户端)将字符串发送到具有 POST 请求的 SlackEndpoint URL 中。

const config = {
    method: 'post',
    url: slackEndpoint,
    data : data
    };
    axios(config)
    .then(function (response) {
    console.log(JSON.stringify(response.data));a
    })
    .catch(function (error) {
    console.log(error);
    });

 

编辑业务逻辑

GitHub Webhook 会向 Lambda 函数发送额外的信息。您可以通过转到 GitHub 中的 Webhook 集成设置来查看完整的请求有效负载。

  1. 转到设置 Webhook 所在的存储库。
  2. 导航至 Settings > Webhooks(设置 > Webhook),然后选择 Webhook

  3. 从 Recent deliveries(最近交付内容)部分中选择一个 ID。以下是有效负载的摘录:
"sender": {
    "login": "bls20AWS",
    "id": 8006227,
    "node_id": "MDQ6VXNlcjgwMDYyMjc=",
    "avatar_url": "https://avatars.githubusercontent.com/u/8006227?v=4",
…etc
  }

发送的数据值之一是对存储库标记星号的 GitHub 用户的头像 URL。该值位于 avatar_url 字段中。

以下步骤展示了如何将此头像添加到 Slack 通知中,使其看起来如下所示:

此操作通过以 Slack 接受的格式将头像 URL 添加到应用程序业务逻辑来完成:

  1. 在您的本地 IDE 中,打开 /webhookapp/src/app.js,这是 Lambda 函数代码所在的位置。
  2. 在 const url 之后的新行中,添加一个新常量来存储头像 URL:
const url = sender.html_url;
const avatar_url = sender.avatar_url;
  1. 通过添加一个新的“thumb_url”字段来重新格式化消息对象以包含新头像:
  const message ={ "attachments": [
      {
          "pretext": `There is a new Github star for _${repo}_ !`,
          "text": [
                    `_${repo}_* now has *${stars}* stars!`,
                    `Your new :star: was made by <${url}|${username}>.`
                  ].join('\n'),
          "thumb_url":`${avatar_url}`,
          "footer": "Serverless App",
          "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png",
      }
    ]
  }

4. 如果您之前尚未部署应用程序,请通过运行以下 AWS SAM CLI 命令将这些更改重新部署到您的 AWS 账户,请参阅第 1 部分的部署部分

sam build
sam deploy --guided --config-file ../samconfig.toml
测试应用程序

 

测试应用程序

转到存储库并选择星号图标。无服务器应用程序的更新版本将运行,从而使用头像 URL 向 Slack 发送新请求。

恭喜! 现在,您已经从本地 IDE 编辑并重新部署了无服务器应用程序。

尝试编辑 Lambda 函数代码,以使用 Slack Webhook URL 包含其他数据。在此 GitHub 存储库中查找更多示例和想法。

 

总结

在本文中,您了解到无服务器应用程序使用托管服务方法来解耦应用程序组件。本文还向您介绍了 AWS Lambda 和 Lambda 函数,它们作为保存无服务器应用程序的业务逻辑的一种方法。通过在本地 IDE 中编辑 Lambda 函数并将其部署到 AWS 账户,您了解到如何在无服务器应用程序中编辑业务逻辑。

适用于开发人员的无服务器入门的未来博客文章将更详细地探索 Lambda。它们将展示如何从本地计算机测试函数、如何处理重试、失败、日志以及如何保护 Lambda 函数的安全。

在第 3 部分中,您将学习如何创建无服务器应用程序的前门。您将了解如何从其他 AWS 服务触发 Lambda 函数内的业务逻辑。该部分还将介绍 Amazon API Gateway