利用AWS Lambda的应用程序创建,能够一次性搭建CI/CD流水线

Source-Build-Deploy

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页面上,点击创建应用程序。

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。

在输入仓库名称后,最后勾选与访问权限相关的复选框,并点击创建。

undefined

只需要以下这些步骤,您就可以创建Lambda应用程序。

开始创建应用程序

点击“创建”按钮后,将转至创建中的应用程序画面。

undefined

在内部,通过CFn创建了每个资源。

由于创建需要几分钟时间,所以在此期间我们可以观看Eric Johnson先生的解说视频,等待创建完成。

应用程序创建已完成

当每个资源通过CFn创建完成后,AWS资源将显示在Lambda应用程序页面的底部。

在Lambda应用中,AWS资源被分为两个类别:资源和基础设施。

undefined

当我们看CFn屏幕时,可以看到创建了两个堆栈。

undefined
    • 前述のリソースは、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拖累的形式。

undefined

通过CodePipeline进行部署。

那么,我们尝试在此Lambda函数中部署LINE Bot功能。

为了运行LINE Bot需要做好准备。

为了运行LINE Bot,我们需要先做一些准备工作。

由于与部署本身无关,因此将其折叠成分节形式。

undefined

将CodeCommit存储库克隆到本地的git。

这次,我决定使用SSH连接到CodeCommit,并进行git克隆。

请参考以下准备工作以便进行SSH连接。由于这与部署本身无关,因此我将将其折叠为一个单独的部分。

undefined

克隆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的构建将按顺序完成。

undefined

而且,稍等片刻,部署也完成了。

undefined

确认Lambda函数

观察Lambda函数,可以确认已部署了包含index.js文件的文件。

将处理程序更改为index.handler,然后点击保存。

Lambda関数を確認する

进行LINE Bot的功能确认

我给LINE Bot发送了一条消息。幸运的是,我收到了它的自动回复消息!

LINE Botの動作確認を行う

最后

使用Lambda函数与CI/CD管道非常容易地构建完成了。

我还没有处理过这个事情,但是我认为可以通过GitHub来管理源代码,并通过CircleCI与CodePipeline进行协作来进行部署,这样可以建立起一个流水线。

希望将来能够支持除了Node.js以外的其他选项。

补充说明:要删除Lambda应用程序

嗯,如果要删除这个Lambda应用程序,有一个稍微麻烦一点的方法。

从管理控制台的Lambda应用程序界面中选择相应的应用程序并删除,不能像CFn一样删除所有相关的AWS资源。

Lambdaアプリケーション画面

当您选择删除时,将会显示以下对话框。

Lambdaアプリケーションを削除

根据这个,需要按照以下步骤删除AWS资源。

    1. 先删除应用程序堆栈

 

    1. 删除保存部署包的S3存储桶

在第一步删除完成后,再删除工具链堆栈(如果先执行第三步,将无法执行第一步)

应用程序堆栈指的是本文所述的CFn画面上显示的nodejs-linebot堆栈,而工具链堆栈指的是另一个serverlessrepo-nodejs-linebot-toolchain堆栈。

undefined

请注意,删除应用程序存在以下限制。

请参考

    • 新しいサーバーレスアプリ作成機能で CI/CD も作れます – AWSブログ

 

    • LambdaではじめてのLINE Botを作る – Developers.IO

 

    1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest – Qiita
广告
将在 10 秒后关闭
bannerAds