从零开始:基础网页应用
在本地创建 Hello World Web 应用并用 pm2 管理,再推送到 GitHub
在本部分中,我们将引导你完成在 AWS 云上运行一个基本 Web 应用程序的全过程。我们将从一个空白项目开始,逐步构建应用程序及其基础设施。每个步骤都专注于基础设施的一个特定方面,我们会详细解释其原理和原因。
本指南中展示的所有源代码均可在 GitHub 上找到。每个提交代表书中一个代码检查点,你可以在此处查看全部内容:AWS Bootstrap。
目标
- 在单个 EC2 实例上运行一个简单的 Web 应用程序。
步骤
- 编写一个基本的“Hello World”Web 应用程序。
在本节中,我们将创建一个小型 Web 应用程序,并将其部署到 AWS 账户中的一个 EC2 实例上。我们将首先手动完成所有步骤,后续章节将实现自动化。我们的应用程序并不复杂,部署方式也远非理想,但这将使我们能够在这本书的剩余部分中,一步步构建出一个结构良好、自包含的 AWS 环境。
创建我们的应用程序
我们需要安装
git和npm。但不用担心,这些工具已在我们的平台上预先安装好,因此你可以直接在终端中使用它们。
现在,让我们创建一个最简化的应用程序,并为其建立一个 git 仓库来存储代码。
1mkdir aws-bootstrap && cd aws-bootstrap 2git init 3npm init -y
我们的应用程序将在端口 8080 上监听 HTTP 请求,并返回 "Hello World"。整个应用将仅包含一个文件:server.js。
1const { hostname } = require('os'); 2const http = require('http'); 3const message = 'Hello World\n'; 4const port = 8080; 5const server = http.createServer((req, res) => { 6 res.statusCode = 200; 7 res.setHeader('Content-Type', 'text/plain'); 8 res.end(message); 9}); 10server.listen(port, hostname, () => { 11 console.log(`Server running at http://${hostname()}:${port}/`); 12});
⚠️ 第 4 行:我们将在端口
8080上运行服务器,因为低于1024的端口号需要 root 权限。
我们可以直接使用 node 命令运行应用程序。
1node server.js 2Server running at http://localhost:8080/
然后,我们可以在另一个终端窗口中使用 curl 进行测试。
1curl localhost:8080 2Hello World
上述所有命令均已预执行于下方的代码沙箱中。点击 RUN 按钮即可启动服务器。
No configuration found for ID: 5cad977d6db49584d20a080940ccfe1941c355a0a6832629ec0485f58baba031
接下来,我们使用进程管理器来监控应用程序,以便在崩溃时自动重启。为此,我们需要修改 package.json 文件。
1{ 2 "name": "aws-bootstrap", 3 "version": "1.0.0", 4 "description": "", 5 "main": "server.js", 6 "scripts": { 7 "start": "node ./node_modules/pm2/bin/pm2 start ./server.js --name hello_aws --log ../logs/app.log", 8 "stop": "node ./node_modules/pm2/bin/pm2 stop hello_aws", 9 "build": "echo 'Building...'" 10 }, 11 "dependencies": { 12 "pm2": "^4.2.0" 13 } 14}
第 11 行:引入 pm2 作为依赖项,这是一个 Node.js 进程管理工具。
第 7 行:从现在起,我们将使用 npm start 通过 pm2 启动应用程序。
第 7 行:pm2 将以 hello_aws 为名称监控该进程,并将标准输出重定向到 ../logs/app.log。
第 8 行:我们将使用 npm stop 命令通知 pm2 停止应用程序。
第 9 行:一个占位用的构建步骤。实际生产环境的构建流程应放在此处。
现在,我们需要使用 npm 安装我们在 package.json 中新增的依赖项。
1npm install
在 package.json 中,我们指定应用程序的日志输出路径为 ../logs。将日志目录置于应用程序目录之外,这一点在后续使用 CodeDeploy 部署时非常重要,因为它可以防止每次部署时日志目录被删除。目前,我们先在本地手动创建该目录。
1mkdir ../logs
现在,我们就可以通过进程管理器启动应用程序了。
1npm start 2 3[PM2] Applying action restartProcessId on app [hello_aws](ids: [ 0 ]) 4[PM2] [hello_aws](0) ✓ 5[PM2] Process successfully started 6┌────┬────────────┬───────┬──────┬───────────┬──────────┬──────────┐ 7│ id │ name │ mode │ ↺ │ status │ cpu │ memory │ 8├────┼────────────┼───────┼──────┼───────────┼──────────┼──────────┤ 9│ 0 │ hello_aws │ fork │ 0 │ online │ 0% │ 8.7mb │
再次使用 curl 测试,应该仍能收到 "Hello World" 消息。
1curl localhost:8080 2Hello World
同样,这些命令已预执行于下方的代码沙箱中。点击 RUN 按钮即可启动服务器。
No configuration found for ID: 1a11b940948d2722c081ee52b9de807c49b2c3f0a6e6207a7a73f1a8ae01e816
在一切正常后,我们现在可以将所有更改提交到 git。
1git add server.js package.json package-lock.json 2git commit -m "Create basic hello world web application"
将代码推送到 GitHub
如果你还没有 GitHub 账号,请先 注册一个(对于这类简单项目是免费的)。注册完成后,下一步是创建 GitHub Token。
接着,创建一个 新的 GitHub 仓库。我们将其命名为 aws-bootstrap。目前仓库需设为公开,但稍后配置 CodeBuild 后可改为私有。
现在有了 GitHub 仓库,我们就可以将本地更改推送上去。
1git remote add origin https://github.com/<username>/aws-bootstrap.git 2git push -u origin master
第 1 行:将 <username> 替换为你自己的 GitHub 用户名。
所有 git 命令均已执行,你只需先设置你的 GitHub 用户名(Git_username)为环境变量。
注意:
在运行代码前,请提供你的 用户名 和 GitHub_Token。
No configuration found for ID: 68fddabf3f5fbbd71c60b1f1c5e3a7bc3bde73e1b226f0f772d03cf99207c70e
注意:你只能为一个新的 GitHub 仓库运行一次上述沙箱。若要再次运行,必须删除现有仓库,重新创建一个,然后才能再次运行。
在下一课中,我们将把应用程序托管在 EC2 实例上,并手动安装它。