亚马逊AWS官方博客

在 AWS 中国区使用 Amplify CLI 搭建 Serverless REST API 服务

AWS Serverless 技术栈通过自动化、弹性的资源分配和按需计费等特性,为开发人员提供了一个高效、便捷、经济实惠的方式来构建现代化的应用程序。但是在中国区想要使用该技术栈往往需要使用 CDK 、 SAM 等技术先编写 IaC (基础设施即代码),才能开始有业务价值的开发工作,这给没有专业云知识的开发者造成了一定门槛。除了搜索相应的 IaC 模板外,有没有一种更方便的方式根据需求搭建 Serverless 技术栈呢?本文介绍如何使用 Amplify CLI 工具达成这个目的。

AWS Amplify 和 Amplify CLI

AWS Amplify 是 AWS 提供的一个借助 AWS 底层 Serverless 服务(AWS S3 、 AWS Lambda、AWS DynamoDB、AWS Appsync 等)赋能前端和移动开发者快速构建并部署全栈应用的服务,在全球有广泛的使用。Amplify 除了作为 AWS 上的服务外,还以开源项目的方式为开发者提供了多种工具帮助开发者使用 Amplify 的能力,如Amplify CLI 、 Amplify SDK 、 Amplify UI 等。

Amplify CLI 是 Amplify 服务团队开发的本地工具,帮助开发者在本地环境使用 Amplify 的各种能力。本文即将介绍如何借助 Amplify CLI ,在不需要编写 IaC 的情况下,在 AWS 中国区搭建出基于 Serverless 技术栈(AWS Lambda,AWS API Gateway,DynamoDB)的 REST API 服务。除此之外,还可以借助 Amplify CLI 向项目中增加其他的 AWS 服务,有兴趣的读者可以自己研究,本文篇幅有限,不做讨论。

在 AWS 中国区的问题

遗憾的是,由于一些依赖服务的缺失, AWS Amplify 服务在 AWS 中国区并没有上线,造成 AWS 中国区的开发者无法享受到 Amplify 带来的便捷能力。虽然 AWS Amplify 服务在中国不可用,但由于 Amplify CLI 工具是本地工具,开发者依然可以使用。只不过和 Global 区相比, Amplify CLI 生成代码不能直接在中国区部署使用,需要一些额外的手工调整。但相比从零开始编写 IaC ,使用 Amplify CLI 搭建 AWS Serverless 技术栈依旧可以带来巨大的效率提升。

使用 Amplify CLI

安装 Amplify CLI

Amplify CLI 是在 Github 的开源项目,依赖 NodeJS 运行,所以需要先在本地安装 NodeJS,再进行 Amplify CLI 的安装,具体的安装流程可以参考 Amplify CLI 的文档。正常完成 Amplify CLI 的安装后,即可在全局环境使用。下一步,我们会使用 Amplify CLI 在前端项目中搭建 AWS Serverless REST API。

在前端项目中引入 Amplify

Amplify CLI 支持多种不同框架的代码生成,本文以 React 项目为例。首先使用 Create React App 新建 React 项目,并在生成的项目中运行 amplify init 命令。注意,该命令需要海外的 AWS 账号,会在海外的账号中部署一个只有 Cloud Formation 的 Amplify 项目,我们后面会用到这一步中生成的 root-cloudformation-stack.json 文件。但是由于我们实际上不会用到 Amplify 的 Service,只是使用 Amplify CLI 生成的代码,所以没有海外账号也没关系,可以从别的地方获取这个 root-cloudformation-stack.json 的模板,再根据需要修改即可。完成后项目中会出现 Amplify 文件夹存放 Amplify 生成的代码。接下来,我们将继续使用 Amplify CLI 生成更多的 AWS 资源。

使用 Amplify CLI 生成 Lambda 和 API Gateway

Lambda 和 API Gateway 可以放在一起生成,先生成哪种资源都可以在生成另一种资源时完成两种资源的关联,关联的关系也会体现在生成的 CloudFormation 中。本文建议如果是需要和 API Gateway 关联的 Lambda ,直接使用 amplify add api 生成,在提示中选择 REST API ,后面继续根据提示操作即可。需要注意的是,如果在提示中选择了 Auth 功能会增加 Cognito user pool ,这会导致后续生成的 CloudFormation 在中国区部署的时候出现问题。同时,此时建立的 API Gateway 是没有认证保护的,开发者需要自行增加认证功能。

使用 Amplify CLI 生成 DynamoDB

如果还需要数据库配合,Amplify CLI 可以通过 amplify add storage 的命令方便地增加 DynamoDB 的资源,同时,生成 Lambda 的命令可以生成使用这个 DynamoDB 的函数,让整个开发更加快捷。但如果想要使用其他的数据库,就需要开发者自行添加了。

小结

至此,我们借助 Amplify CLI 创建了 Serverless REST API 所需要的 AWS 资源。因为这部分 Amplify CLI 的文档写的更详细,所以本文这部分比较简略,有问题可以参考资料中的链接。下一步我们需要借助 Amplify CLI 生成的代码,将 Serverless REST API 部署到 AWS 中国区。

在 AWS 中国区部署 Serverless 后端

准备文件

在目录下运行 amplify export --out [out-folder-path] 命令,即可获得所有需要的代码,包括 CloudFormation 模板和 Lambda 函数。该命令本身的作用是将这个 Amplify 的资源暴露出来,给其他的 CDK 项目使用,如果不想使用这个命令,也可以从 Amplify 文件夹中获取需要的文件,但是也更麻烦一些。通过 export 获取的文件夹结构如下图所示:

全局修改

  1. 将 arn: arn:aws 改为 arn:aws-cn
  2. 将所有 S3 Bucket 的 URL 从 https://s3.amazonaws.com/[S3-BUCKET]/**/* 改为 https://[S3-BUCKET].s3.[REGION].amazonaws.com.rproxy.goskope.com.cn/**/*

root-cloudformation-stack.json

该 CloudFormation template 虽然在 export 的文件夹中,但和实际用来部署的版本有一些出入,实际部署版本需要通过 Amplify CLI 部署到 Global 区从 S3 中以后获取。不过,由于其内容可以根据 team-provider-info.json 推断,所以也可以在模版文件上直接修改。受篇幅所限,本文暂不提供模板,其余部分按照下面的对象结构修改对应内容即可。

- restapi
  - Properties
    - TemplateURL
- lambda
  - Properties
    - TemplateURL
    - Parameters
      - deploymentBucketName => [S3-BUCKET] 上传准备文件的 bucket
      - s3Key: 打包 zip 路径
      - env: ENV_NAME

. /api/[API Gateway Name]/[API Gateway Name]-cloudformation-template.json

- [api name]
  - Properties
    - Parameters => 新增
      - endpointConfigurationTypes => 修改 endpoint 类型 endpointConfigurationTypes: REGIONAL
    - EndpointConfiguration => 新增
      - Types => Types: ["REGIONAL"]
    - Body
      - host
        - Fn::Join
          - .amazonaws.com => .amazonaws.com.rproxy.goskope.com.cn

全部完成后,将所有文件上传到建好的 S3 桶中,然后在 AWS CloudFormation 控制台新建 Stack 即可。

总结

本文简单地介绍了如何借助 Amplify CLI 生成 Serverless REST API 服务并部署到 AWS 中国区。虽然由于 Amplify 服务的缺失, AWS 中国区的开发者无法直接将 Amplify CLI 生成的代码部署上云成为直接使用的服务,但通过对生成代码的简单修改,开发者同样可以使用 AWS Amplify 的工具提高工作效率。本文受限于篇幅只是介绍了 Amplify CLI 能力的一小部分,感兴趣的读者可以通过参考资料,继续深入了解。

参考资料

https://aws.amazon.com/cn/amplify/

https://docs.amplify.aws/cli/

https://github.com/aws-amplify/amplify-cli

本篇作者

汪靖涵

AWS 前端工程师,负责 AWS Professional Service 项目的前端架构设计和实施。对现代前端各种方向均有涉猎,帮助客户解决数字化转型,应用现代化,和上云过程中前端相关的问题。同时对于云场景的前端工程化,和应用云能力赋能前端开发有深入研究。

许和风

AWS 云原生应用工程师,负责基于 AWS 的云计算方案架构的设计和实施。对公有云、DevOps、微服务、容器化、Serverless、全栈开发等有深入的研究,同时致力于推广云原生应用,帮助客户利用云原生来实现业务需求。

刘红雨

云原生应用工程师,负责基于 AWS 的云计算方案架构的设计和实施开发。拥有丰富的互联网产品的开发经验,负责多个项目的搜索功能的设计和开发,熟悉搜索的性能优化,对公有云、机器学习、DevOps、基于云原生的微服务架构、敏捷加速研发效能等有深入的研究和热情。