在开发无服务器应用的时候,通过纯手工方式创建各种资源的话,效率会非常低,因此需要借助一些框架,比如serverless来提高开发效率。下面介绍如何使用Github Actions进行持续集成/部署serverless项目。

环境变量
在项目中如果需要使用一些类似token,secret之类的机密信息的,那么就需要将其保存在环境变量中。如果在serverless.yml中声明了某个环境变量,那么在部署后到AWS之后,serverless就会在其对应的Lambda中创建环境变量:

因此第一个要解决的问题就是如何把这些环境变量正确的传递给serverless。
本地部署
如果在本地部署的话,就相对简单些。
1)首先,创建.env文件(注意将其添加到.gitignore中):
TWITTER_CONSUMER_KEY=
TWITTER_CONSUMER_SECRET=
TWITTER_ACCESS_TOKEN=
TWITTER_ACCESS_TOKEN_SECRET=
TELEGRAM_TOKEN=
TELEGRAM_CHAT_ID=
2)安装serverless插件
yarn add -D serverless-dotenv-plugin
3)在serverless中使用这个插件
plugins:
- serverless-dotenv-plugin
同时,在serverless.yml引用这些变量:
environment:
region: ${self:provider.region}
TWITTER_CONSUMER_KEY: ${env:TWITTER_CONSUMER_KEY}
TWITTER_CONSUMER_SECRET: ${env:TWITTER_CONSUMER_SECRET}
TWITTER_ACCESS_TOKEN: ${env:TWITTER_ACCESS_TOKEN}
TWITTER_ACCESS_TOKEN_SECRET: ${env:TWITTER_ACCESS_TOKEN_SECRET}
TELEGRAM_TOKEN: ${env:TELEGRAM_TOKEN}
TELEGRAM_CHAT_ID: ${env:TELEGRAM_CHAT_ID}
在部署后就能看到AWS Lambda中对应的环境变量了。
通过Github Actions部署
设定Github Actions secrets
访问 https://github.com/你的用户名/项目名/settings/secrets/actions/new 并设定以下Github Action secrets:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- TWITTER_CONSUMER_KEY
- TWITTER_CONSUMER_SECRET
- TWITTER_ACCESS_TOKEN
- TWITTER_ACCESS_TOKEN_SECRET
- TELEGRAM_TOKEN
- TELEGRAM_CHAT_ID
这样做就非常灵活了,之后如果要部署到不同的AWS账户的话,只需要更新AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY就可以了。
如果想要针对不同的branch部署到不同的AWS账户,也可以这样:
- DEV_AWS_ACCESS_KEY_ID
- DEV_AWS_SECRET_ACCESS_KEY
- STAGE_AWS_ACCESS_KEY_ID
- STAGE_AWS_SECRET_ACCESS_KEY
- PROD_AWS_ACCESS_KEY_ID
- PROD_AWS_SECRET_ACCESS_KEY
- …
然后在后面设定action的时候针对不同的branch使用不同的secret就可以了。
创建.github/workflows/ci.yml:
name: Deploy to AWS
on:
push:
branches:
- main
jobs:
deploy:
name: deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16.x
- run: sudo npm i -g serverless
- run: npm install
- name: Make .env file
uses: SpicyPizza/create-[email protected]
with:
envkey_DEBUG: false
envkey_TWITTER_CONSUMER_KEY: ${{ secrets.TWITTER_CONSUMER_KEY }}
envkey_TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_SECRET }}
envkey_TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
envkey_TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
envkey_TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
envkey_TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
file_name: .env
- name: serverless deploy
uses: serverless/github-action@v3
with:
args: deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
对关键的两步说明一下:
首先是在使用serverless部署前创建.env。这里使用的是 SpicyPizza/[email protected] 这个Github Actions插件。需要注意的是,所有想要设置的环境变量前需要 添加关键字 envkey_ 。经过这一步,就会将所有的环境变量保存在.env文件中。也可以看到,这里通过 secrets.XXX 来访问在Github Actions secrets中定义的变量。
其次是在真正进行serverless部署的时候,使用的是 serverless/github-action@v3 这个Github Actions插件。这里需要指定AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY。同样,这两个变量值是从Github Actions secrets中获取的。
在serverless.yml中的设置
由于在serverless部署之前,已经由Github Actions创建好了.env文件,因此,这里就可以直接引用这些变量值了:
environment:
region: ${self:provider.region}
TWITTER_CONSUMER_KEY: ${env:TWITTER_CONSUMER_KEY}
TWITTER_CONSUMER_SECRET: ${env:TWITTER_CONSUMER_SECRET}
TWITTER_ACCESS_TOKEN: ${env:TWITTER_ACCESS_TOKEN}
TWITTER_ACCESS_TOKEN_SECRET: ${env:TWITTER_ACCESS_TOKEN_SECRET}
TELEGRAM_TOKEN: ${env:TELEGRAM_TOKEN}
TELEGRAM_CHAT_ID: ${env:TELEGRAM_CHAT_ID}
至此,一旦完成部署,就会在AWS Lambda中创建对应的环境变量了。那么,在Lambda代码中就可以这样访问了:
import { TwitterClient } from 'twitter-api-client';
import { Telegraf } from 'telegraf'
const twitterClient = new TwitterClient({
apiKey: process.env.TWITTER_CONSUMER_KEY,
apiSecret: process.env.TWITTER_CONSUMER_SECRET,
accessToken: process.env.TWITTER_ACCESS_TOKEN,
accessTokenSecret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
});
const bot = new Telegraf(process.env.TELEGRAM_TOKEN);
测试
将项目提交到Github,就会自动触发Github Actions的构建过程。