使用serverless框架来尝试【无服务器架构】第1章 〜使用nodejs的模板编辑〜
在第1章中,我们将通过使用serverless框架来尝试【无服务器架构】,并使用nodejs的模板来进行编写。
故事概要
每年到了情人节的时候,我总是因为杉树花粉而身体状况糟透了。
我一边揉着发痒的眼睛,一边擤着鼻涕,拼命地写下这篇帖子。
加入公司已经有大约两年了。从这次开始,我想要连续发布一系列关于最近热门的“无服务器架构”的话题。
建议将其保存起来,因为以后很可能会根据请求更新。
我是某公司的首席技术官,但我认为与其一味地理论学习,不如通过掌握一些基本概念后加以实践来深化知识,这样学习效率更高。
不会刻意地强调正确的教育方式,而是试图帮助初学者能够稍微地理解所学内容,通过构建资料的方式。
以下是以如下的系列主题进行进展。
那么,这一次让我们再次开始吧!
首先
这种无服务器架构,顾名思义,是指没有服务器的架构。
比如在AWS中,甚至都不需要EC2实例,而是指的是利用事先准备好的功能服务(Function-as-a-Service)组合而成的架构。
有时也会被称为FaaS等,而且在AWS中也不断增加着无服务器系列的服务。
让我们尝试体验使用Serverless作为服务器框架的服务,结合AWS Lambda、AWS API Gateway和AWS DynamoDB等组件,来构建Serverless架构。
环境
苹果电脑环境
10.11.6
节点环境
$ nodebrew ls
v0.12.14
$ nodebrew install-binary v7.4.0
$ nodebrew ls
v0.12.14
v7.4.0
Python环境的中文释义及释义可能有以下选项:
1. Python环境 –
2. Python环境 –
3. Python环境 –
$ pyenv versions
system
2.7.12
$ pyenv install -v 3.5.2
$ eval "$(pyenv init -)"
$ pyenv shell 3.5.2
$ python --version
Python 3.5.2
AWSCLI环境
$ pip install awscli
$ aws --version
aws-cli/1.11.9 Python/2.7.10 Darwin/15.6.0 botocore/1.4.66
无服务器环境
$ npm install serverless -g
$ serverless --version
1.5.1
创建用于服务器测试的IAM
建立IAM
用户名: serverlesstest
访问类型: 通过程序访问
直接将现有政策附加
-
- AWSLambdaFullAccess
-
- IAMFullAccess
-
- AmazonS3FullAccess
-
- AmazonAPIGatewayAdministrator
- AWSCloudFormationReadOnlyAccess
制定自己的政策
策略名称:AWSCloudFormationCreateUpdateServiceOnlyAccess
策略概述:设置用于尝试无服务器功能所必需的策略。※请勿在生产环境中使用。
请点击画面上红框处的“创建独有政策”,
并将下列文字复制到政策文件中。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1449904348000",
"Effect": "Allow",
"Action": [
"cloudformation:CreateStack",
"cloudformation:UpdateStack"
],
"Resource": [
"arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxxxxxx:stack/*"
]
}
]
}
输入「策略名称」、「说明」和「策略文档」后,将如下所示的画面显示出来。
当您点击创建策略后,请返回到IAM创建页面,点击“更新”,并选择复选框。
※如果进行搜索,应该会显示通过用户自定义管理创建的策略类型。
设置AWS CLI的新用户
因为逐个对credentials中的内容进行注释或取消注释太麻烦了,所以我选择根据每个AWS CLI配置文件来管理。
让我们使用档案名称“serverlesstest”来创建此次的配置文件。
创建AWS CLI配置
$ aws configure --profile serverlesstest
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
例)~ / .aws / config
例:~ / .aws / 配置文件
$ cat ~/.aws/config
[profile serverlesstest]
output = json
region = ap-northeast-1
例) ~/.aws/凭证
$ cat ~/.aws/credentials
[serverlesstest]
aws_access_key_id = XXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXX
使用服务器模板创建项目。
這次我們將從Node.js的模板開始創建。
$ serverless create --template aws-nodejs --provider aws --profile serverlesstest --path serverlesstest --verbose
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/xxxxxxxxxxx/Documents/serverlesstest"
_______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| \___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v1.5.1
-------'
Serverless: Successfully generated boilerplate for template: "aws-nodejs"
生成的文件
% ls ./serverlesstest
handler.js
serverless.yml
更改设置
设定部分包括“个人资料”、“阶段”、“地区”。
$ cd serverlesstest
$ vi serverless.yml
修改部分。
provider:
name: aws
runtime: nodejs4.3
请用中文将以下内容翻译成一种方式:
请你完成下列题目。
provider:
name: aws
runtime: nodejs4.3
profile: serverlesstest
stage: dev
region: ap-northeast-1
部署
$ serverless deploy --provider aws --profile serverlesstest -v
若成功无事,画面将呈现如下所示。
确认AWS的每个服务
Lambda (拉姆达)
S3
Lambda函数的执行
让我们使用「invoke」命令来执行Lambda。
我们将尝试执行名为hello的函数,如下所示。
$ serverless invoke --function hello --provider aws --profile serverlesstest
{
"statusCode": 200,
"body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":{}}"
}
处理内容 (Process content)
让我们看一下作为模板生成的”handler.js”的内容。
作为响应,它返回了状态码200以及消息的内容。
$ cat handler.js
'use strict';
module.exports.hello = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
}),
};
callback(null, response);
// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};
编辑后记
我认为在这种情况下,我能够抓住氛围。但是现在我们的终点也没有公开,无法从外部使用。
下次让我们尝试使用AWS的API Gateway来修改一下示例应用程序并运行。