乐趣区

关于serverless:Serverless-Framework-亚马逊云AWS中国地区部署指南

Serverless Framework 亚马逊云 (AWS) 中国地区部署指南

  • Serverless Framework 亚马逊云 (AWS) 中国地区部署指南

    • 前言
    • 前置筹备

      • 1. 账号的注册
      • 2. 全局装置 serverless
      • 3. 设置你的零碎环境变量
      • 4. 设置部署凭证
    • 疾速部署一个 hello world

      • 创立入口函数 index.js

        • event 参数
        • context 参数
        • 函数体
      • 创立部署文件 serverless.yml
      • 部署
    • Next Chapter
    • 残缺示例及文章仓库地址

前言

Serverless Framework 是业界十分受欢迎的无服务器利用框架,开发者无需关怀底层资源即可部署残缺可用的 serverless 利用架构。Serverless Framework 具备资源编排、主动伸缩、事件驱动等能力,笼罩编码 - 调试 - 测试 - 部署等全生命周期,帮忙开发者通过联动云资源,迅速构建 serverless 利用。

目前 Serverless Framework 默认反对, 同时也是反对最好的云服务商是 亚马逊云 (AWS),亚马逊云在中国地区, 目前次要服务企业用户,而且只凋谢了 宁夏 北京 2 个地区,基础设施方面别离属于 西云数据 光环新网。侥幸的是亚马逊也给中国这 2 个地区增加了反对,地区别离为 cn-northwest-1(宁夏) 和 cn-north-1(北京),所以咱们部署的时候须要显式申明它们,不然就会因为中国和国外的账号不互通,导致部署失败。

接下来就让咱们看看,如何疾速部署函数在中国区的亚马逊上吧!

前置筹备

  1. 一个中国区亚马逊的账号
  2. 全局装置 serverless
  3. 设置你的零碎环境变量
  4. 设置部署凭证

1. 账号的注册

你能够登录 https://www.amazonaws.cn/ 进行注册,记得提前准备好你的企业相干信息。

2. 全局装置 serverless

没有装置 nodejs 环境的,记得提前装置,官网链接:https://nodejs.org/en

执行 npm install -g serverless 来 全局装置 serverless

装置实现后,全局会注册 2 个指令:

  • serverless
  • sls

slsserverless 命令的简写,当前章节的命令都用 sls

执行 sls -v 呈现:

Framework Core: 3.34.0
Plugin: 6.2.3
SDK: 4.3.2

这代表你曾经装置胜利了!

3. 设置你的零碎环境变量

编辑你的零碎环境变量,增加 SLS_GEO_LOCATION=no-cn

这是为了防止 serverless cli 在中国时区,默认走腾讯云云函数部署的行为。

4. 设置部署凭证

在亚马逊治理面板,点击右上角的 平安凭证 ,在 我的平安凭证 里的 拜访密钥 中,点击 创立拜访秘钥 ,创立应用案例为 在 亚马逊云科技 计算服务上运行的应用程序,批准条款后实现步骤。

这样你就生成了 Access KeyAccess Secret

而后为了本地应用 Access KeyAccess Secret 去部署函数,咱们须要创立 "~/.aws/credentials" 文件 (~ 为以后用户目录),内容如下:

[default]
aws_access_key_id=xxxx
aws_secret_access_key=xxx

这是为了让 Serverless Framework 去读取本地的拜访凭证进行部署。不然你就须要去注册 Serverless Framework Account 来进行治理了。

疾速部署一个 hello world

失常状况下你执行 sls 就会呈现提醒让你去新建一个函数我的项目,然而如果你之前没有增加 SLS_GEO_LOCATION=no-cn 这个环境变量的话,就会呈现上述第 3 点问题:

Serverless Framework CLI no longer supports Serverless Tencent CLI

To run Serverless Framework without issues in China region, ensure: SLS_GEO_LOCATION=no-cn environment variable

然而,即便你增加了环境变量,顺利执行了 sls 来初始化我的项目,大概率也会因为一些未知的网络起因下载失败。

所以这里笔者举荐你间接去 https://github.com/serverless/examples 去下载模板。

这里举荐应用根底模板 aws-node-http-api

它部署胜利后,可能疾速为你创立一个 AWS Lambda 函数(云函数) 和一个 AWS API Gateway(api 网关),这样你部署胜利之后,AWS API Gateway 会间接给你调配一个 http 公网地址,你能够间接拜访它来触发你的云函数。

整体的调用流程如下:

部署 AWS API Gateway 之后拜访域名永远是 403 的问题,这是因为你须要在亚马逊中国实现 ICP备案,能力失常应用 API 网关,不然默认端口 80/8080/443 都是敞开的,所以返回都是 403:

{"message": "Forbidden"}

创立入口函数 index.js

咱们新建一个函数文件夹 aws-node-http-api, 在外面创立 index.js 文件

module.exports.handler = async (event, context) => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: "Go Serverless v3.0! Your function executed successfully!",
        input: event,
      },
      null,
      2
    ),
  };
};

代码解读:

这段代码应用 commonjs 格局编写,导出一个 handler 函数

这个函数有 2 个参数 eventcontext (实际上还有第三个参数 callback, 不过都曾经 3202年了,回调写法早就不风行了,故省略,全篇应用 async/await)

event 参数

其中 event 为事件参数,咱们云函数绑定的触发器在触发的时候,触发事件都会转化成这个对象来调用咱们的代码。

比方咱们一个函数绑定了多个触发器:

  • HTTP 网关触发器
  • S3/OSS/COS 这种对象存储触发器
  • Schedule/Cron 这种 job 触发器

那它们各自触发函数的时候,进入咱们函数时的 event 类型就是不同的,这样咱们就能够依据这个类型,去执行不同的代码分支,返回不同的后果。

context 参数

context 参数指的是运行函数时,传入进来的上下文,这点每个云厂商都是不同的。但外面大多都会蕴含一些调用信息,函数信息,和执行的环境信息,以及裸露一些特定的办法。比方 functionName / requestId 等等 …

这里笔者给出一份 AWS 在上下文中给你的字段清单链接,供你参考:

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html

函数体

这里就是调用函数时去执行的代码片段了

这里咱们就简略返回了一个 js 对象:

  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: "Go Serverless v3.0! Your function executed successfully!",
        input: event,
      },
      null,
      2
    ),
  };

为什么要返回成这个格局?实际上这是 AWS API Gateway 决定的,你要执行函数之后,取得后果再通过它返回给用户,就必须依照它要求的格局返回。

所以你能够看到这里返回了一个 {statusCode: number, body: string} 格局。当然具体的格局不同的云厂商也会不同,这里我也为你找到了这个格局的百科大全文档:

https://docs.aws.amazon.com/apigateway/latest/developerguide/…

所以你依据这个文档多返回一些字段以达到你 set cookie / 批改响应头 的成果。

创立部署文件 serverless.yml

这里咱们间接在刚刚创立的 index.js 同目录下,疾速创立一个 serverless.yml,内容如下:

service: serverless-http-api
frameworkVersion: '3'

provider:
  name: aws
  runtime: nodejs18.x
  region: cn-northwest-1 # 中国宁夏

functions:
  api:
    handler: index.handler
    events:
      - httpApi:
          path: /
          method: get

这里咱们重点介绍一下这些字段:

  • service / frameworkVersion 都是元数据,来通知云服务商 /serverless cli,应用程序名是什么,应用的框架版本是什么
  • provider 则是咱们用来形容,应用的什么云服务商的,什么地区的,什么运行时来进行部署云函数
  • functions 则是描述函数的一些信息,比方这个 yml 中的 functions 区域块,就通知云服务商,我有一个名为 api 的函数须要部署,它的函数触发入口点是我 index.js 导出对象中的 handler 函数,它还绑定了一个 API 网关(v2) 触发器,用 HTTP GET 申请拜访这个网关的 / 门路,就能够触发这个函数啦!

于是当咱们申明实现这些信息之后,就能够欢快的部署了!

部署

咱们间接在以后我的项目目录下执行:

sls deploy

于是咱们的我的项目代码先是被本地打包到当前目录下的 .serverless 文件夹下方,而后 serverless framework 把咱们函数压缩文件包(.zip) 上传到 AWS 上,通知它进行部署,胜利之后就会返回如下信息:

Deploying serverless-http-api to stage dev (cn-northwest-1)

✔ Service deployed to stack serverless-http-api-dev (152s)

endpoint: GET - https://xxxxxxxxxx.execute-api.cn-northwest-1.amazonaws.com/
functions:
  api: serverless-http-api-dev-api (1.9 kB)

这样咱们第一个函数就部署胜利了,你能够间接关上浏览器,敲这个地址就会返回数据:

{
  "message": "Go Serverless v3.0! Your function executed successfully!",
  "input": {...}
}

祝贺你!你正式踏入了 serverless 的世界!接下来更广大的世界会为你关上.

Next Chapter

当然做到这些仅仅是入门,接下来我将会向你介绍更简单的我的项目,带你走一遍笔者已经走过的路。

下一篇,《typescript 反对与本地调试》中,将会介绍如何增加 typescript 反对和本地调试(这句是废话了~),欢送浏览。

残缺示例及文章仓库地址

https://github.com/sonofmagic/serverless-aws-cn-guide

如果你遇到什么问题,或者发现什么勘误,欢送提 issue 给我

退出移动版