手动置顶:写这一篇博客不代表我喜欢Terraform。
这部分内容比较啰嗦,推荐直接去看我的Github。
使用本地Terraform部署:https://github.com/chengqing-su/lambda-deployment-via-terraform
使用Docker部署:https://github.com/chengqing-su/lambda-deployment-via-dockerized-terraform
使用本地的Terraform部署
一个最简单的AWS Lambda组成:
- Lambda 的code: 定义这个Lambda做什么以及具体怎么做
- AWS Lambda function’s execution role:定义这个Lambda function有权限做什么
- AWS Lambda function 资源
- AWS Cloudwatch Log Group(可选):执行的日志
写了一个很简单的demo,这个demo只是简单地输出日志,该demo使用的是Nodejs 12和Typescript编写的。
1 | ├── README.md |
如果觉得这部分内容,过于啰嗦,可以直接到Github上看代码:https://github.com/chengqing-su/lambda-deployment-via-terraform
然后如果感兴趣如何使用Docker部署,以及为啥要使用Docker部署可以直接看“容器化部署” 或者看我的代码:https://github.com/chengqing-su/lambda-deployment-via-dockerized-terraform
Lambda的code
业务代码放在了src
下面。这是一个极其简单的demo,因此没有测试代码,如果有测试的话,需要将测试放在与src
同级的tests
下面(有点啰嗦了)。
1 | import { |
接着便是infra的代码,放在了deployment
下面。
通常而言,需要先对lambda的业务代码进行打包。下面的代码就是生产我们最终用于部署的业务代码,并打包成一个zip压缩包。
1 | resource "null_resource" "package" { |
AWS Lambda function’s execution role
Lambda function’s execution role 定义了这个function访问AWS服务和资源的权限。
1 | # lambda execution role |
AWS Lambda function 资源
1 | resource "aws_lambda_function" "function" { |
AWS Cloudwatch Log Group
创一个Log Group 用来存放Lambda执行的日志。
1 | resource "aws_cloudwatch_log_group" "logs" { |
使用本地Terraform部署
啰啰嗦嗦地写到了这里,还是得说一下怎么部署,说出来又觉得过于简单。
1 | cd deployment/ |
容器化部署
使用本地化部署的痛点就是:
- 如果没有安装相关的环境,还得重新安装一遍环境。如果有环境,也不知道环境是不是干净的,也不知道其他人在跑的时候用环境版本对不对。比如在上面这个demo中,就需要安装Node.js 12(最新的LTS版本是14), Yarn, 以及Terraform 0.14.4(如果版本高了或者低了都可能出现无法预估的问题)。
- 在实际的项目,我们会使用多个Lambda,甚至Lambda之间也会使用不同的技术栈,有的使用Python,有的使用Ruby,有的使用Node。那么问题来了,把所有环境都安装一边是不是过于麻烦?
所以,容器化是必要的。
首先,会在根目录引入一个docker-compose.yaml
,下面是一个node的示例:
1 | version: "2" |
然后再引入一个和deployment
同级的auto
目录,里面会存放的是一些自动化脚本。简单看一个Terraform的示例auto/terraform
:
1 | !/bin/bash -e |
因为了auto/terraform
之后,我们如何部署?这个时候,还会添加一个新的自动化脚本auto/deploy
,如下:
1 | !/bin/bash -e |
那么部署就变得极其简单了,
1 | export AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_KEY_ID> |