1. 概述

本文以AWS官方网站上同名教程为蓝本进行补充与完善,主要工作包括英文文档的实践与翻译(官方教程除了第一页之外只有英文版本),对过程中的细节进行了完善。通过本文的练习,可以完成在 AWS 上构建自己的首个现代应用程序。所谓现代应用程序是相对传统的应用程序而言的,按照亚马逊的介绍,能被成为现代Web应用程序必须具备以下几个特征:

  • 可以隔离业务逻辑
  • 便于优化重用和迭代
  • 尽可能地减少计算机开销
  • 使用多项服务构建而成
  • 开发人员能够专注于编写代码
  • 自动执行基础设施维护任务

为了构建现代化应用程序,尽可能在架构上实现优化,本文使用了AWS中的ECS服务器,S3静态存储,DynamoDB的NoSQL数据库,使用了AWS Could9云端IDE开发工具,Fargate部署工具, Amazon Cognito和Gateway集成验证,以及AWS Lambda 和 Amazon Kinesis Firehose云端计算节点。

如果单纯出于学习目的,这一套配置下来可以说是价格不菲,不过AWS为新用户提供的免费套餐基本涵盖了项目所需的全部资源。这需要用户在亚马逊国际站注册账户并通过国际信用卡验证,即可获得部分为期12个月的ECS等资源的免费使用权限,也包括一些资源限量的永久使用权限。但要容忍访问亚马逊国际站时的龟速网络,以及不时会自动跳转到亚马逊中国网站的折腾。而如果要使用的是亚马逊中国站,则需要有一个通过AWS国内服务商认可的公司账户才可以,在认证完成后亚马逊方面也会提供一部分有限的资源供试用。鉴于大部分人不具备新增企业用户的权限,本文仍以亚马逊国际站为基础进行说明。

通过本文的练习可以实现以下目标:

  • 创建静态网站 使用静态内容(图片、静态文本等)在Amazon Simple Storage Service (S3) 构建静态网站。
  • 构建动态网站 使用通过 AWS Fargate 部署为容器的 API 后端微服务,在 Web 服务器上托管应用程序逻辑。
  • 存储 Mysfit 数据 外部化所有 mysfit 数据,并将其持久保存在DynamoDB 提供的托管型 NoSQL 数据库中。
  • 添加用户注册功能 使用 AWS API Gateway 及其与 Amazon Cognito 的集成,让用户能够进行注册、身份验证和授权,以便网址访问者可以为点赞与操作。
  • 捕获用户点击 使用 AWS Lambda 和 Amazon Kinesis Firehose 记录和分析网站上的点击以捕获和分析用户行为

2. 亚马逊AWS的免费套餐及注意事项

在AWS首页可以很容易搜索到针对新用户的免费套餐,通过过滤器也可以快速找到自己需要的资源。比较实用的套餐包括每月750小时的Amazon EC2服务器,RDS数据库,ElastiCache以及限量供应的DynamoDB,需要注意的是,在新建资源时一定要注意免费套餐是否涵盖了所选的功能,除此之外,在实际使用资源时,一定要注意对性能的限制和要求,以免不小心天价账单上门。

EC2:免费套餐仅包括t2.micro实例类型,在新建实例时需要注意选择。此外,虽然免费套餐声称包括了为期一年每月 750 小时 Linux 和 Windows 微型实例的试用时间。每个月最多也只有744个小时,但这代表着如果长期使用,还是只能使用1台免费的主机资源的,如果要linux和windows换着玩,那么务必要先将不用的资源销毁。

RDS:虽然可以试用的资源类型很多,但和EC2一样,也是限制在db.t2.micro类型中,同时,如果只是学习用,那么创建完之后需要及时销毁资源,再去尝试另一种类型,否则很容易就用超时间(只要资源一直存在就一直在计算时间)。

S3: 静态存储用来保存静态资源非常有效率,但免费套餐除了5GB的限制之外, 还限制了每月只有20 000 个获取请求以及 2 000 放入请求。因此,在使用静态资源的时候要非常重视防盗链操作,否则一旦资源受欢迎且全球化到处被下载,很容易就收到天价账单。

其他资源也大都与此类似,基础的建议是免费的套餐未必可口。如果只是出于学习目的,那么学习完最好尽快销毁不必要的资源,这对大家来说都是一种节约。亚马逊官方对使用免费资源的建议如下:

  • 了解 AWS 免费套餐覆盖哪些服务和资源。
  • 使用 AWS Budgets 监控免费套餐使用量。
  • 在 账单和成本管理控制台中监控成本。
  • 确保您计划的配置属于免费套餐提供物范围。
  • 在使用完测试资源后进行清理。

屏幕快照 2019-08-10 14.21.35.png

3. Cloud9连接EC2服务器

本文的教程大部分在亚马逊Cloud9在线IDE中完成,而Cloud9的部署则需要以EC2服务器为宿主。也就是说,如果你之前已经使用过一个免费的EC2服务器配额,那么在部署Cloud9时需要销毁之前的EC2服务器,而在新建Cloud9时新建一个EC2服务器,当然,Cloud9也可以选择部署在现有的EC2服务器上,部署时选择现有EC2服务器。会出现相关的选项。
cloud9-configure-env.296156765506a5067ec5e103f9233ebd08751b7b.png
在服务器地址、用户名中填入现有的EC2服务器资料,而Cloud9会生成一个新的密钥对,需要把公钥的内容添加到EC2服务器,即在EC2服务器 ~/.ssh/authorized_keys 中新增一段把公钥内容复制进去即可。

默认的EC2服务器没有安装Nodejs服务(我选择的linux发行版是Amazon Linux,具亚马逊官方介绍这个发行版针对亚马逊自己的服务器优化过,比较节省资源)。因此需要按照下列步骤先在服务器上安装Nodejs服务。

当然,后续安装工作的前提是,可以正常通过SSH方式登陆EC2服务器,还必须将安全组配置为允许 SSH(端口 22)、HTTP( (口 80) 和 HTTPS(端口 443) 连接。如果连门都进不去,别的事情就面谈了。

安装nodejs命令如下:
#首先要安装nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
#然后激活nvm:
. ~/.nvm/nvm.sh
#使用 nvm,安装指定版本的Node.js
nvm install
#通过以下命令,测试 Node.js 已安装并正确运行。
node -e "console.log('Running Node.js ' + process.version)"
#系统应显示,说明Nodejs安装正常
Running Node.js v4.4.5

安装完Nodejs之后,Cloud9就可以正常在EC2服务器中部署了,部署过程中会弹出安装软件包的提示,选y即可继续。该过程中也有删除Cloud9的说明。安装完成后的Cloud9如下。通过AWS控制台可以进入创建的Cloud9环境。
cloud9-welcome.3f6ac0e948a43fb5a41912dfccc742bdb2a109fe.png

4.静态网站的搭建并托管到S3静态存储中

4.1 从github复制项目

作为示例,本文通过git方式直接获取aws官方的示例静态网站。在Cloud9下方的bash命令行中输入下列命令从git仓库复制源代码。复制完成后通过cd命令进入项目,通过Cloud9的项目管理器看到完整的项目代码。

git clone -b python https://github.com/aws-samples/aws-modern-application-workshop.git
cd aws-modern-application-workshop/

4.2创建管理权限用户和凭证

接下来,需要创建S3的存储桶Bucket。但是由于没有设置管理权限,因此会返回 Unable to locate credentials错误。要解决这一问题,需要先创建拥有s3资源管理权限的用户,这需要使用AWS Identity and Access Management (IAM)管理权限服务。在使用IAM服务创建访问时,会提醒创建拥有不同权限的子用户账户,而不是直接为管理账户创建权限,可以参考AWS的最佳时间,创建对S3资源有管理权限的用户。该用户仅供编程使用,因此不需要可供登陆的密码,仅创建密钥对即可。针对每个创建的用户凭证,系统提供仅有一次的下载机会。从下载的csv文件中可以看到密钥对(key和secretkey)。
cloud9-welcome.3f6ac0e948a43fb5a41912dfccc742bdb2a109fe.png

在cloud9中添加上述权限以实现操作S3仓库,命令如下:

#查看现有权限列表,没有用户时返回的参数应该是None
aws configure list
#开始更新凭证/示例中参数需要替换为自己设置的
aws configure
AWS Access Key ID [None]: **AKIAIOSFODNN7EXAMPLE**
AWS Secret Access Key [None]: **wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY**
Default region name [None]: **us-west-2**
Default output format [None]: **json**
**

4.3 将项目部署到s3仓库中并发布

命令
#创建一个s3存储桶,注意按照aws命名规则要求,创建不包含特殊字符的独一无二的名称,替换下面``REPLACE_ME_BUCKET_NAME``aws s3 mb s3``:``/``/``REPLACE_ME_BUCKET_NAME

仓库创建完成后,需要进行一些设置,以生成可供访问的DNS网站,并将静态资源转换成与网址的一一对应关系。这除了要在命令行输入外,也需要在Cloud9编辑器中直接编辑。需要注意的是,由于每个人环境变量的不同,具体的文件路径可能不完全相同,如果不确定路径,可以在命令行中输入pwd获取当前路径,并替换下列命令中的路径,同时,要将REPLACE_ME_BUCKET_NAME替换为自己的仓库名。

双击文件夹中module-1/aws-cli中的website-bucket-policy.json文件以打开并编辑,将其中的仓库名称替换为自己的仓库,以更新权限,保证文件可以公开访问,否则网站只能自己访问的话就失去其意义了。
replace-bucket-name.9ff309afaf1fbe93e42445760e4df1f15a1e52a6.png

#利用aws cli(命令行)完成网站目录的生成。
aws s3 website s3``:``/``/``REPLACE_ME_BUCKET_NAME ``--``index``-``document index``.``html
#利用aws cli的api接口更新s3仓库权限,使用的是json格式的命令
aws s3api put-``bucket``-``policy ``--``bucket REPLACE_ME_BUCKET_NAME ``--``policy ``file``:``/``/``~``/``environment``/``aws``-``modern``-``application``-``workshop``/``module``-``1``/``aws``-``cli``/``website``-``bucket``-``policy``.``json
#将网站复制到s3仓库中,需要注意的是,为了节约系统资源,本文仅生成并复制了index.html一个文件,网站中用到的图片等资源均直接从示例网站获取。这样不会产生太多的s3仓库存取操作。
aws s3 cp`` ``~``/``environment``/``aws``-``modern``-``application``-``workshop``/``module``-``1``/``web``/``index``.``html s3``:``/``/``REPLACE_ME_BUCKET_NAME``/``index``.``html

这样就完成了第一个静态网站的发布,根据默认的地理位置不同,亚马逊生成的网站默认访问网址也略有区别。在实际项目中,如果拥有自己的域名,通过cname的方式将域名解析到对应地址即可实现网站的访问。
#美西用户``us-west-2``http://REPLACE_ME_BUCKET_NAME.s3-website-REPLACE_ME_YOUR_REGION.amazonaws.com
#美东用户 us-east-2 :
http://REPLACE_ME_BUCKET_NAME.s3-website.REPLACE_ME_YOUR_REGION.amazonaws.com
屏幕快照 2019-08-10 16.22.13.png

(to be continued…)