|
| 1 | +# 快速开始 |
| 2 | + |
| 3 | +然我们基于ServerlessInsight快速从0到一构建个简单的全栈Serverless应用程序。我们将创建一个简单的应用程序,该应用程序将在浏览器中显示“Hello |
| 4 | +World”。这里以阿里云为例子。 |
| 5 | + |
| 6 | +## 工具安装 |
| 7 | + |
| 8 | +前提条件是您已经安装了Node.js(Node.js >= 18.x)和npm。如果没有,请参考[Node.js](https://nodejs.org/en/download/)下载安装。 |
| 9 | + |
| 10 | +1. 安装ServerlessInsight CLI |
| 11 | + |
| 12 | + ```bash |
| 13 | + npm install -g @geek-fun/serverlessinsight |
| 14 | + ``` |
| 15 | +2. 执行`si --version`查看工具是否安装成功,如果安装成功,将会显示版本号。 |
| 16 | + |
| 17 | +## 配置供应商密钥(阿里云) |
| 18 | + |
| 19 | +ServerlessInsight需要获得目标云厂商的访问权限包括云供应商的基础设施即代码服务的全部权限以及根据您的业务涉及到的Serverless服务的相应权限。 |
| 20 | +将对应的秘钥export到全局环境变量中,如阿里云的`ALIYUN_ACCESS_KEY_ID`, `ALIYUN_ACCESS_KEY_SECRET`以及服务部署的目标区域 |
| 21 | +`ALIYUN_REGION`。 |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | +> 请您务必妥善保管您的秘钥信息,不要通过任何方式(e.g. GitHub)将AccessKey 公开到外部渠道,以避免被他人利用而造成 安全威胁 。 |
| 26 | +> 强烈建议您遵循 阿里云安全最佳实践 ,使用 RAM 子用户AccessKey来进行 API 调用。ServerlessInsight不会保存任何供应商秘钥信息! |
| 27 | + |
| 28 | +## 初始化项目 |
| 29 | + |
| 30 | +ServerlessInsight不强制要求项目的目录结构,但是我们建议您按照如下的目录结构组织您的项目(以ts项目为例): |
| 31 | + |
| 32 | +``` |
| 33 | +hello-world-proj/ |
| 34 | +├── artifacts/ |
| 35 | +│ └── hello-world-proj.zip |
| 36 | +├── scripts/ |
| 37 | +│ └── package.sh |
| 38 | +├── src/ |
| 39 | +├── tests/ |
| 40 | +├── README.md |
| 41 | +├── package.json |
| 42 | +├── package-lock.json |
| 43 | +├── tsconfig.json |
| 44 | +|── Dockerfile |
| 45 | +└── serverlessinsight.yml |
| 46 | +``` |
| 47 | +
|
| 48 | +其中`src`目录存放应用程序代码,`tests`目录存放测试代码,`scripts`目录存放自动化脚本如打包脚本,`artifacts`目录存放打包后的应用程序代码。 |
| 49 | +
|
| 50 | +1. 配置`serverlessinsight.yml`声明资源 |
| 51 | + 创建`serverlessinsight.yml`,并将以下内容复制到文件中: |
| 52 | +
|
| 53 | + ```yaml |
| 54 | + version: 0.1 |
| 55 | + provider: aliyun |
| 56 | +
|
| 57 | + vars: |
| 58 | + region: cn-hangzhou |
| 59 | +
|
| 60 | + stages: |
| 61 | + dev: |
| 62 | + region: ${vars.region} |
| 63 | +
|
| 64 | + service: hello-world-api |
| 65 | +
|
| 66 | + tags: |
| 67 | + owner: geek-fun |
| 68 | +
|
| 69 | + functions: |
| 70 | + hello_world_fn: |
| 71 | + fc_name: hello-world-fn |
| 72 | + runtime: nodejs14 |
| 73 | + handler: index.handler |
| 74 | + code: artifacts/hello-world-api.zip |
| 75 | + memory: 512 |
| 76 | + timeout: 10 |
| 77 | + environment: |
| 78 | + NODE_ENV: prod |
| 79 | + |
| 80 | + events: |
| 81 | + gateway_event: |
| 82 | + type: API_GATEWAY |
| 83 | + name: insight-poc-gateway |
| 84 | + triggers: |
| 85 | + - method: GET |
| 86 | + path: /api/* |
| 87 | + backend: hello-world-fn |
| 88 | + ``` |
| 89 | + |
| 90 | +2. 编写应用程序代码 |
| 91 | + 在`src`目录下创建`index.ts`文件,并将以下内容复制到文件中: |
| 92 | + |
| 93 | + ```typescript |
| 94 | + export async function handler(event: any, context: any) { |
| 95 | + return { |
| 96 | + statusCode: 200, |
| 97 | + body: JSON.stringify({ |
| 98 | + message: 'Hello World!', |
| 99 | + }), |
| 100 | + }; |
| 101 | + } |
| 102 | + ``` |
| 103 | + |
| 104 | +3. 打包应用程序 |
| 105 | + - 在`Dockerfile`文件中添加以下内容: |
| 106 | + ```dockerfile |
| 107 | + FROM node:18.20.3-buster-slim@sha256:95fb3cf1d1ab1834c0fd65cdd2246198662460ae8f982a6cfab187889dd54bbe AS builder |
| 108 | + WORKDIR /app |
| 109 | + |
| 110 | + ENV NODE_ENV=development |
| 111 | + COPY ./package.json . |
| 112 | + COPY ./package-lock.json . |
| 113 | + RUN npm install |
| 114 | + COPY ./tsconfig.json . |
| 115 | + COPY ./src ./src |
| 116 | + RUN npm run build |
| 117 | + |
| 118 | + FROM node:18.20.3-buster-slim@sha256:95fb3cf1d1ab1834c0fd65cdd2246198662460ae8f982a6cfab187889dd54bbe |
| 119 | + WORKDIR /app |
| 120 | + |
| 121 | + ENV NODE_ENV=production |
| 122 | + COPY --from=builder /app/dist . |
| 123 | + COPY ./package.json . |
| 124 | + COPY ./package-lock.json . |
| 125 | + RUN npm install |
| 126 | + ``` |
| 127 | + 该Dockerfile文件中定义了两个阶段,第一个阶段用于构建应用程序,第二个阶段用于运行应用程序,目的是仅保留必要的执行文件,最大程度减小包的体积。 |
| 128 | + |
| 129 | + - 在`scripts`目录下创建`package.sh`文件,并将以下内容复制到文件中: |
| 130 | + ```bash |
| 131 | + #!/bin/bash -eux |
| 132 | + set -o pipefail |
| 133 | +
|
| 134 | + cd "$(dirname "$0")/.." || exit |
| 135 | +
|
| 136 | + mkdir -p "artifacts" |
| 137 | + rm -rf ./dist ./artifacts/* |
| 138 | +
|
| 139 | + IMAGE_NAME="hello-world-api" |
| 140 | + docker build -t "${IMAGE_NAME}" . |
| 141 | +
|
| 142 | + docker run --rm \ |
| 143 | + -v "$(pwd)"/dist:/dist \ |
| 144 | + --name "${IMAGE_NAME}-package" "${IMAGE_NAME}:latest" \ |
| 145 | + sh -c "cp -r /app/. /dist" |
| 146 | +
|
| 147 | + cd dist && zip -r -D "../artifacts/${IMAGE_NAME}.zip" ./* |
| 148 | + ``` |
| 149 | + 然后执行`chmod +x scripts/package.sh`赋予脚本执行权限,执行`./scripts/package.sh`打包应用程序,完成后我们应当在 |
| 150 | + `artifacts`目录下看到用以部署的`hello-world-api.zip`项目压缩文件。 |
| 151 | + |
| 152 | +## 部署服务 |
| 153 | + |
| 154 | +在部署服务之前,可以通过命令`si validate`检查`serverlessinsight.yml`文件中的配置项是否正确可用。 |
| 155 | +通过后执行如下命令部署服务到云提供商的环境中: |
| 156 | + |
| 157 | +```bash |
| 158 | +si deploy --stage dev <stackName> |
| 159 | +``` |
| 160 | + |
| 161 | +stackName是部署的服务在云提供商的资源栈名称,部署成功后,您将会看到如下输出: |
| 162 | + |
| 163 | +```bash |
| 164 | +Deploying service hello-world-api to stage dev |
| 165 | +Service hello-world-api deployed successfully |
| 166 | +``` |
| 167 | + |
| 168 | +## 调用服务 |
| 169 | + |
| 170 | +-TBC |
| 171 | + |
| 172 | +## 清理资源 |
| 173 | + |
| 174 | +如果应用程序不再需要,可以通过以下命令清理资源: |
| 175 | + |
| 176 | +```bash |
| 177 | +si destory --stage dev <stackName> |
| 178 | +``` |
| 179 | + |
| 180 | +<span style="color: red;">**注意:** |
| 181 | +删除资源栈会删除所有申明的资源导致服务完全不可用且丢失有状态资源的数据,请确保相关数据、内容已备份或确认不再需要后执行该操作</span> |
0 commit comments