利用AWS Lambda的应用程序创建,能够一次性搭建CI/CD流水线
AWS Lambda的应用程序创建是什么意思?
使用 AWS Lambda 的应用程序创建功能来创建 Lambda 函数时,除了 Lambda 函数本身之外,还会自动创建以下其他组件。
-
- Lambda関数のソースコード等を管理するGitリポジトリとしてCodeCommit
- CodeCommitのmasterブランチの更新を契機にLambda関数へのデプロイを行うCodePipeline
为了实现CI/CD流水线,AWS资源会同时被创建。
听说Lambda函数本身很容易创建,但是在构建CI/CD环境方面存在一定的困难,源代码的更新只能在管理控制台上进行…为了改善这种情况,最近推出了一种功能,可以一次性构建这样的CI/CD环境。
在Lambda的管理控制台界面上,我们以应用程序为单位来处理这些AWS资源。
实际上,这些堆栈是通过CloudFormation(以下简称CFn)创建的,并且可以在CFn界面上查看创建的堆栈。
另外,目前可用的运行时仅限于 Node.js 10.x,无法使用 Go 或 Python 等。
尝试亲身使用一下
在本文中,我们将使用应用程序创建功能以及Lambda函数和CI/CD流程来构建。
然后,我们将通过CI/CD流水线来部署一个简单的功能(本例中是一个回声LINE Bot)到Lambda函数。
继续前往创建应用程序。
在管理控制台的Lambda页面上,点击创建应用程序。
选择一个样例应用程序还是从零开始制作。
然后,会显示出一些示例应用程序。
举例来说,对于最左上角的Serverless API后端,这是一个由API Gateway + Lambda * 3 + Dynamo DB组成的示例应用程序。
这次我想要创建一个简单的Lambda+API Gateway的结构,所以选择了位于右下方的从零开始创建的选项。
应用程序的设置
接下来,我们要进行应用程序的设置。
我打算这次创建一个LineBot,所以我将把应用程序命名为nodejs-linebot。
由于只能选择Node.js 10.x版本,因此我选择这个运行时。
此外,您可以从CodeCommit和GitHub中选择进行源代码管理的Git存储库。
为了使整个过程能够在AWS上简单地完成,这次我们选择了CodeCommit而不是GitHub。
在输入仓库名称后,最后勾选与访问权限相关的复选框,并点击创建。
只需要以下这些步骤,您就可以创建Lambda应用程序。
开始创建应用程序
点击“创建”按钮后,将转至创建中的应用程序画面。
在内部,通过CFn创建了每个资源。
由于创建需要几分钟时间,所以在此期间我们可以观看Eric Johnson先生的解说视频,等待创建完成。
应用程序创建已完成
当每个资源通过CFn创建完成后,AWS资源将显示在Lambda应用程序页面的底部。
在Lambda应用中,AWS资源被分为两个类别:资源和基础设施。
当我们看CFn屏幕时,可以看到创建了两个堆栈。
-
- 前述のリソースは、Lambdaアプリケーション名そのままのnodejs-linebotスタック
- 前述のインフラストラクチャは、もうひとつのserverlessrepo-nodejs-linebot-toolchainスタック
由…创建。
确认Lambda函数
我也试着从屏幕上确认一下Lambda函数。
目录和文件的结构如下所示。
通过观察,我们可以发现除了示例的JavaScript文件hello-from-lambda.js外,还创建了CodeBuild所需的buildspec.yml等文件。
.
├── LICENSE
├── README.md
├── __tests__
│ └── unit
│ └── handlers
│ └── hello-from-lambda.test.js
├── buildspec.yml
├── package.json
├── src
│ └── handlers
│ └── hello-from-lambda.js
└── template.yml
在中国内地,上述内容可以这样表达:关于Lambda函数的名称,
- nodejs-linebot-helloFromLambdaFunction-…
就像这样,名字变成了以示例源文件hello-from-lambda.js拖累的形式。
通过CodePipeline进行部署。
那么,我们尝试在此Lambda函数中部署LINE Bot功能。
为了运行LINE Bot需要做好准备。
为了运行LINE Bot,我们需要先做一些准备工作。
由于与部署本身无关,因此将其折叠成分节形式。
将CodeCommit存储库克隆到本地的git。
这次,我决定使用SSH连接到CodeCommit,并进行git克隆。
请参考以下准备工作以便进行SSH连接。由于这与部署本身无关,因此我将将其折叠为一个单独的部分。
克隆git仓库
为了编辑源代码,将CodeCommit的存储库克隆到本地的git上。
$ cd (ローカルでソース管理するディレクトリ)
$ git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/nodejs-linebot
在本地安装所需的库并编辑源代码。
我们将安装Line Bot的SDK,并创建一个index.js来进行模仿回答。
$ cd nodejs-linebot
$ npm install @line/bot-sdk
const crypto = require('crypto');
const line = require('@line/bot-sdk');
const client = new line.Client({
channelAccessToken: process.env.ACCESS_TOKEN,
channelSecret: process.env.CHANNEL_SECRET,
});
exports.handler = function (event, context, callback) {
// 署名の検証
const signature = crypto.createHmac('sha256', process.env.CHANNEL_SECRET).update(event.body).digest('base64');
if (signature !== event.headers['X-Line-Signature']) {
callback(
null,
{
statusCode:404,
body: '{"Error": "Invalid Signature"}'
},
);
return;
}
// オウム返し
const body = JSON.parse(event.body);
client.replyMessage(
body.events[0].replyToken,
{
type: 'text',
text: body.events[0].message.text,
},
);
};
在将代码推送到CodeCommit后启动CI/CD流程。
$ git add .
$ git commit -m "feature/Line Bot"
$ git push
当查看CodePipeline界面时,可以确认CodeCommit的更新和CodeBuild的构建将按顺序完成。
而且,稍等片刻,部署也完成了。
确认Lambda函数
观察Lambda函数,可以确认已部署了包含index.js文件的文件。
将处理程序更改为index.handler,然后点击保存。
进行LINE Bot的功能确认
我给LINE Bot发送了一条消息。幸运的是,我收到了它的自动回复消息!
最后
使用Lambda函数与CI/CD管道非常容易地构建完成了。
我还没有处理过这个事情,但是我认为可以通过GitHub来管理源代码,并通过CircleCI与CodePipeline进行协作来进行部署,这样可以建立起一个流水线。
希望将来能够支持除了Node.js以外的其他选项。
补充说明:要删除Lambda应用程序
嗯,如果要删除这个Lambda应用程序,有一个稍微麻烦一点的方法。
从管理控制台的Lambda应用程序界面中选择相应的应用程序并删除,不能像CFn一样删除所有相关的AWS资源。
当您选择删除时,将会显示以下对话框。
根据这个,需要按照以下步骤删除AWS资源。
-
- 先删除应用程序堆栈
-
- 删除保存部署包的S3存储桶
在第一步删除完成后,再删除工具链堆栈(如果先执行第三步,将无法执行第一步)
应用程序堆栈指的是本文所述的CFn画面上显示的nodejs-linebot堆栈,而工具链堆栈指的是另一个serverlessrepo-nodejs-linebot-toolchain堆栈。
请注意,删除应用程序存在以下限制。
请参考
-
- 新しいサーバーレスアプリ作成機能で CI/CD も作れます – AWSブログ
-
- LambdaではじめてのLINE Botを作る – Developers.IO
- 1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest – Qiita