可以说,使用无服务器框架来部署 AWS Lambda 是部署函数以及配置函数触发方式的最简单方式。如果您向将函数的部署自动化,您将很可能需要选择 CI/CD 工作流。CI/CD 管道可以使用多种工具(例如使用 Jenkins、AWS CodePipeline、Google Cloud Build、CircleCI、Bamboo、Rundeck)以不同的方式实施。2019 年 3 月,Linux 基金会宣布成立持续交付基金会 (CDF)。持续交付基金会以提供中立的协作平台,促进下一代持续交付系统的开发为宗旨。Tekton 是一个开源 Google 项目,由 CDF 托管,提供与 Kubernetes 类似的 API 资源来描述 CI/CD 管道。
在本文中,我们将解释如何借助 Tekton 和无服务器框架实现 AWS Lambda 函数的自动化部署。我们将首先快速回顾一下无服务器框架,然后深入介绍 Tekton 核心 API 对象。
无服务器框架
无服务器框架已经成为开发 AWS Lambda 函数的首选工具,其原因也非常充分:只要拥有一个恰当配置的 AWS 账户,即可以极为快速地开始使用 Lambda。
入门
首先要安装无服务器框架并生成 Python 函数的骨架:
Bash
最终写入工作目录的骨架将是:
Bash
此函数将存储在 handler.py
文件中,而描述如何部署和调用函数的清单文件为 serverless.yml
。
为确保能够从互联网访问您的函数,您必须编辑 serverless.yml
清单文件,其中 functions 部分的设置与以下类似:
Bash
要部署此函数:
Bash
部署完成后,将会在 stdout 上显示描述函数的信息,与以下类似:
Bash
现在您可以调用可公开访问的终端节点并解析输出,从而从无服务器框架收到一条好消息:
Bash
这十分简单直接,但正如在简介部分所指出,您很可能会通过 CI/CD 管道来部署和更新函数,而这可能是 Jenkins 等传统的 CI/CD 管道,也可能是某个可用的 SaaS 解决方案。如果您希望在 Kubernetes 集群内执行并通过类似于 Kubernetes 的 API 来定义 CI/CD 管道,我们建议您试试 Tekton。
Tekton 的概念简介
Tekton 是一组可以用于描述 CI/CD 管道并且将在 Kubernetes 集群中运行该管道的 API 对象。
Tekton 提供了用来表示 CI/CD 管道的 Kubernetes 原生 API(借助自定义资源功能)。在这个已经以 Kubernetes 为中心的世界里,它本身已经十分值得开发。
Tekton API 由五个关键对象组成:
[](https://github.com/tektoncd/pipeline/blob/master/docs/tasks.md)
:描述将在容器内执行的步骤集。Task
规范类似于 Kubernetes Pod。[](https://github.com/tektoncd/pipeline/blob/master/docs/taskruns.md)
:将触发执行Task
并定义Task
运行所需输入和输出集的对象。[](https://github.com/tektoncd/pipeline)
:需要执行的Tasks
集。[](https://github.com/tektoncd/pipeline/blob/master/docs/pipelineruns.md)
:将触发执行Pipeline
的对象。[](https://github.com/tektoncd/pipeline/blob/master/docs/resources.md)
:定义可以作为Task
的输入和输出的对象。
要了解更多有关 Pipeline
对象的信息,请参阅 GitHub 上的教程。
在本文的最后一部分,我们将重点介绍 Task
对象并使用它来部署一个 AWS Lambda 函数。
使用 Tekton 部署 Lambda 函数
在 上一部分我们介绍了如何使用无服务器框架来部署 AWS Lambda 函数,此外还快速介绍了 Tekton 的几个概念,下面我们会将两者结合起来。
我们需要执行的操作包括:
定义一个 GitHub 存储库,其中包含作为
PipelineResource
对象的函数代码。创建一个将会运行
serverless deploy
的Task
对象。创建一个将
Task
和PipelineResource
作为输入引用的TaskRun
对象,从而执行Task
。检查执行该
Task
的 Pod 的日志,并确认正在部署函数。
显示的 YAML 清单都可在 GitHub 上获取。您可以首先克隆该存储库以方便访问示例文件:
Bash
您也可以直接通过 curl
命令获取清单文件,与以下类似:
Bash
PipelineResource
的形状如下,这是所有 Kubernetes 用户都熟悉的东西。您将看到 API 版本、种类、在元数据部分定义的对象名称,在规范部分,您还将看到 git 存储库的 URL,其中包含了我们的函数代码。
Bash
如果解开部署函数所需的 Task
对象,与 Kubernetes 对象一样,所有我们将看到 apiVersion
、kind
、metadata
以及 spec
部分。spec
首先将引用 inputs
部分中的一个 git 类型的资源,从而让我们可以指向包含函数代码的 git 存储库。
Bash
然后 Task
将定义 steps
。在我们的 Task
中,我们将仅有一个步骤。此步骤应会运行 serverless deploy
。为此,我们需要一个包含 serverless
节点包的容器镜像。我们在 Triggermesh 构建了此镜像并且可从 gcr.io/triggermesh/serverless
公开访问它。此步骤与以下类似:
Bash
为确保正常运行,运行该步骤的 Kubernetes Pod 将需要使用您的 AWS 凭证。您可以使用 Kubernetes Secrets 将您的凭证作为环境变量传递,也可以使用卷挂载的方式。下面是使用两个环境变量的最简单示例:
Bash
并它将定义您的 Task
和 PipelineResource
。您的简短管道的声明已经完成。要启动此管道的执行(单个 Task
),您现在需要编写一个 TaskRun
对象。
您可以通过 curl
获取 TaskRun
清单,与以下类似:
Bash
此对象的形状与所有 Kubernetes 对象同样类似,具有常用的 apiVersion
、kind
、metadata
、和 spec
部分:
Bash
在 spec
部分,我们将设置指向我们的 PipelineResource
(它定义了要使用的 git 存储库)的任务的输入。最后,taskRef
部分将指向执行我们的 serverless deploy
的 Task
。
Bash
恰当配置对象并取得包含您的 AWS 凭证的 Secret 后,您将可以通过 Tekton 和无服务器框架创建对象并启动函数的部署。
如果您已经克隆了示例存储库:
Bash
下图描绘了关键的 Tekton API 对象(Task
、Resource
和 TaskRun
)并显示了基本的流程。创建 TaskRun
对象将会创建一个 Pod,后者将会运行 serverless deploy 命令以将函数部署到 AWS Lambda。
Task
将在一个 Pod 中执行并且您将从 Pod Logs 中获得无服务器日志,例如:
Bash
小结
AWS Lambda 用户如果使用无服务器框架来部署函数,必须建立自动化的持续部署,从而确保可以自动接受测试和部署函数代码的更改。尽管已经存在大量的 CI/CD 解决方案(包括 Jenkins、CircleCI 和 CodePipeline),作为此领域的新来者,Tekton 提供了一种与 Kubernetes 类似的 API,令 Amazon Elastic Kubernetes Service (Amazon EKS) 等 Kubernetes 用户极感兴趣。这让使用 Amazon EKS 集群来运行容器化工作负载以及 CI/CD 管道(包括推动无服务器架构发展的管道)成为可能。
如果您想更深入试用 Tekton,请参阅 Task 目录。本文中描述的无服务器 Task 将在未来几周贡献到目录中。
此外,如果您希望将 Tekton 与 Knative 结合使用,您可能会对 TriggerMesh Lambda 运行时感兴趣,之前在“使用 TriggerMesh KLR 在 Amazon EKS 中部署与 AWS Lambda 兼容的函数”一文中已经介绍过此运行时。此外,您还可能会对 GitHub 上适用于 AWS 服务的 Knative 事件源感兴趣,借助这些事件源可以将您的 AWS 服务事件与本地应用程序关联。
作者介绍:Sebastien 是集成平台公司 TriggerMesh 的联合创始人,TriggerMesh 为开发人员管理原生云应用程序提供支持。他从事开源事业已经接近 20 年。Sebastien 是 Apache 软件基金会的一名提交者,也是 Kubernetes 生态系统的早期贡献者。2014 年前后,Docker 的迅猛崛起令他很震惊,决定尽可能学习,并在后来撰写了《O’Reilly Docker 工作手册》一书。这一经历让他认识了 Kubernetes 并一眼就爱上了 Pod。Sebastien 成为 CNCF 领域的早期和活跃参与者 — 积极贡献、构建、教授和创新。他创立了 TriggerMesh 以推动无服务器领域的边界,让所有企业都能受益于这一新的理念,包括那些仍在使用本地应用程序的企业。
本文转载自 AWS 技术博客。
评论