Serverless 應(yīng)用開(kāi)發(fā)指南: serverless 的 hello, world

引用:https://www.phodal.com/blog/serverless-development-guid-serverless-framework-hello-world/
Posted by: Phodal Huang Oct. 29, 2017, 4:15 p.m.

在翻譯了幾篇 serverless 與物聯(lián)網(wǎng)相關(guān)的文章之后,我開(kāi)始想著好好掌握一下 serverless 的相關(guān)知識(shí)。

我對(duì)于 serverless 的第一認(rèn)知是:Serverless 是由一堆云服務(wù)構(gòu)建后端服務(wù)的,如存儲(chǔ)、計(jì)算、授權(quán)都是由不同的服務(wù)來(lái)構(gòu)建的。而作為一個(gè)開(kāi)發(fā)人員,我們所要做的就是了解如何搭配不同的云服務(wù)。

因此,在進(jìn)行更多的定義之前,我打算先熟悉一下 serverless,以便于我更好地了解什么是 serverless 應(yīng)用開(kāi)發(fā)。

Serverless 框架 hello, world

考慮到直接使用 aws lambda 編寫(xiě) serverless,對(duì)于我這樣的新手相當(dāng)?shù)挠刑魬?zhàn)性。于是,我便先選擇了 Serverless 框架,GitHub: https://github.com/serverless/serverless。

先讓我們按官網(wǎng)的 demo,進(jìn)行實(shí)驗(yàn)。開(kāi)始之前,除了擁有一臺(tái)電腦,你還需要有一個(gè) AWS 賬號(hào)。AWS 提供一年的免費(fèi)試用,你所需要做的就是辦一張支持 visa 的信用卡。

一、安裝 serverless 框架

npm install -g serverless

或者,和我一樣使用:

yarn global add serverless

二、設(shè)置 aws 憑證。

1.登錄 AWS 賬號(hào),然后點(diǎn)擊進(jìn)入 IAM (即,Identity & Access Management)。

2.點(diǎn)擊用戶(hù),然后添加用戶(hù),如 serveless-admin,并在『選擇 AWS 訪問(wèn)類(lèi)型』里,勾上編程訪問(wèn)。

允許編程訪問(wèn)

<figcaption>允許編程訪問(wèn)</figcaption>

3.點(diǎn)擊下一步權(quán)限,選擇『直接附加現(xiàn)有策略』,輸入AdministratorAccess,然后創(chuàng)建用戶(hù)。

注意:由于是 AdministratorAccess 權(quán)限,所以不要泄漏你的密鑰出去。

  1. 創(chuàng)建用戶(hù)。隨后,會(huì)生成訪問(wèn)密鑰 ID私有訪問(wèn)密鑰。請(qǐng)妥善保存好。

然后導(dǎo)出證書(shū),并使用 serverless depoy 保存到本地。

export AWS_ACCESS_KEY_ID=<your-key-here>
export AWS_SECRET_ACCESS_KEY=<your-secret-key-here>

serverless deploy

將會(huì)自動(dòng)生成配置到 ~/.aws/credentials

或者,如官方的示例:

serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

三、創(chuàng)建 hello-world 服務(wù)

serverless create --template aws-nodejs --path hello-world
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/fdhuang/learing/serverless-guide/hello-world"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.23.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"
(play-env)

生成兩個(gè)文件;

├── handler.js
└── serverless.yml

其中的 handler.js 的內(nèi)容是:

'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 });
};

serverless.yml 的內(nèi)容為:

service: hello-world

provider:
  name: aws
  runtime: nodejs6.10

functions:
  hello:
    handler: handler.hello

functions 字段中的 hello 表示了函數(shù),handler.hello 則用于指定對(duì)應(yīng)的處理邏輯函數(shù)名。

四、部署及測(cè)試:

$serverless deploy -v

日志如下:

Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (409 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - hello-world-dev
CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionPSzzisjnTvvYknuXwQOlAvdkQZ67qXYSvgoAi9T8W0
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionPSzzisjnTvvYknuXwQOlAvdkQZ67qXYSvgoAi9T8W0
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersionPSzzisjnTvvYknuXwQOlAvdkQZ67qXYSvgoAi9T8W0
CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - hello-world-dev
CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - hello-world-dev
Serverless: Stack update finished...
Service Information
service: hello-world
stage: dev
region: us-east-1
stack: hello-world-dev
api keys:
  None
endpoints:
  None
functions:
  hello: hello-world-dev-hello

Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:706605665335:function:hello-world-dev-hello:1
ServerlessDeploymentBucketName: hello-world-dev-serverlessdeploymentbucket-bk066p5c9zgl

然后,讓我們來(lái)觸發(fā)一下這個(gè)函數(shù):

$ serverless invoke -f hello -l

服務(wù)器返回了下面的結(jié)果:

{
    "statusCode": 200,
    "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":{}}"
}
--------------------------------------------------------------------
START RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d Version: $LATEST
END RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d
REPORT RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d  Duration: 2.49 ms   Billed Duration: 100 ms     Memory Size: 1024 MB    Max Memory Used: 20 MB

這意味著,我們的第一個(gè)服務(wù)已經(jīng)成功上線了。

我們也可以通過(guò)下面的命令來(lái)獲取相應(yīng)的日志:

serverless logs -f hello -t

如果只是測(cè)試用途,可以在執(zhí)行完成后執(zhí)行 serverless remove 來(lái)刪除對(duì)應(yīng)的服務(wù),以減少開(kāi)支。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容