Qwiklab'实验-API Gateway, AWS Lambda'
Introduction to Amazon API Gateway
知识梳理
1. 技术概念
微服务架构:
“微服务架构格式是一种将单个应用程序作为一套小型服务开发的方法,每个小型服务部在自己的流程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务功能构建,可以完全独立部署自动部署机制。这些服务至少集中管理,可以用不同的编程语言编写,并使用不同的数据存储技术。“
微服务架构的想法是采用一个庞大而复杂的系统,并将其分解为易于管理和扩展的独立,分离的服务,这使开发人员能够实现其可扩展性,可用性和可维护性等关键设计目标。
Amazon API Gateway
Amazon API Gateway和AWS Lambda提供Web服务的完美组合,可轻松构建,交付和维护一套可作为复杂软件系统基础的微服务。
应用程序编程接口(API):
一个应用程序编程接口是一组指令,它定义开发人员如何与应用程序果面。AP背后的想法是创建一种标准化方法来连接应用程序提供的各种服务。AP1旨在与软件开发工具包(SDK)一起使用,后者是一组工具,允许开发人员基于API轻松创建下游应用程
序。
API优先战略:
许多软件组织正在采用API-First策略,其中堆代中的每个服务都是第一个,并且始终作为APl发布。RESTful API:表示性状态转移(REST)是指遵循六个约束的体系结构:
- 通过客户端-服务器模型分离关注点。
- 状态完全存储在客户端上,客户端和服务器之间的通信是无状态的。
- 客户端将缓存数据以提高网络效率
- 服务器和客户端之间有一个统一的接口(以API的形式)。
- 随着复杂性被添加到系统中,引入了层。可能有多层REST利组件。
- 遵循按需代码模式,其中代码可以即时下载,并且无需更新客户说明可进行再改。
2. 定义与作用
Amazon API Gateway 是一项 AWS 服务,让开发人员能够创建、发布、维护、监控和保护任何规模的 API。您可以创建能够访问 AWS、其他 Web 服务以及存储在 AWS 云中的数据的 API。 可将 API Gateway 视为云中的一个背板,用于连接 AWS 服务和其他公有或私有网站。它可以提供一致的 RESTful 应用程序编程接口 (API),让移动和 Web 应用程序可以访问 AWS 服务。
API Gateway 的架构如右图所示。
3. 核心概念
APIGateway是AwS提供的托管服务,可以轻松创建,部署和维护API。APIGateway包含以下功能:
-
转换传入API请求的正文和标头以匹配后端系统
-
转换传出API响应的正文和标题以匹配API要求
-
通过Amazon Identity and Access Management控制API访问
-
为第三方开发创建和应用API密钥
-
启用Amazon CloudWatch 集成以进行API监控
-
通过Amazon CloudFront缓存API响应,以缩短响应时间
-
将API部署到多个阶段,可以轻松区分开发,测试,生产和版本控制
-
将自定义域连接到API
-
定义模型以帮助标准化API请求和响应转换
4. Amazon API网关和AWS Lambda术语
- 资源:表示为URL端点和路径。例如,api.mysite/questions。可以将HTTP方法与资源相关联,并为每个方法定义不同的后端目标。在微服务架构中,资源将代表系统中的单个微服务。
- 方法:在API网关中,通过资源路径和HTTP谓词的组合来识别方法,例如GET , POST FODELETE
- 方法请求:API网关中的方法请求设置存储方法授权设置,并定义从客户端接收的URL查询字符串参数和HTTP请求标头。
- 集成请求:集成请求设置定义与方法一起使用的后端目标。可以在其中定义映射模板,以转换传入请求以匹配后端目标所期望的内容。
- 集成响应:集成响应设置是在后端目标的响应和API网关中的方法响应之间定义映射的位置。还可以转换从后端目标返回的数据,以适应最终用户和应用程序的期望。
- 方法响应:方法响应设置定义方法响应类型,其标头和内容类型。
- 模型:在API网关中,模型定义某些数据的格式,也称为模式或形状。可以创建和使用模型,以便更轻松地创建映射模板。由于API网关主要用于JavaScript Object Notation (JSON) 格式化数据, 因此API Gateway 使用JSON Schema定义数据的预期模式。
- 阶段:在API网关中,阶段定义可通过其访问AP廊署的路径。这通常用于区分版本,开发与生产端占等。
- 蓝图:Lambdacddambda函数,可用作构建新Lambda函数的基础。
5. API Gateway 的架构如图所示:
# Node.js 8.10
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!')
};
return response;
};
Introduction to AWS Lambda
知识梳理
1. 定义与作用
AWS Lambda 是一项计算服务,使客户无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行客户代码并自动缩放,从每天几个请求到每秒数千个请求。只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 AWS Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且无需执行任何管理。AWS Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录。只需要以 AWS Lambda 支持的一种语言 (目前为 Node.js、Java、C#、Go 和 Python) 提供您的代码。
2. AWS Lambda使用场景
AWS Lambda 是很多应用程序场景的理想计算平台,只要可以用 AWS Lambda 支持的语言 (即,Node.js、Java、Go、C# 和 Python) 编写应用程序代码并在 AWS Lambda 标准运行时环境和 Lambda 提供的资源中运行。
在使用 AWS Lambda 时,您只需负责自己的代码。AWS Lambda 管理提供内存、CPU、网络和其他资源均衡的计算机群。这是以灵活性为代价的,这意味着您不能登录计算实例,或自定义操作系统或语言运行时。通过这些约束,AWS Lambda 可以代表您执行操作和管理活动,包括预置容量、监控机群运行状况、应用安全补丁、部署您的代码以及监控和记录您的 Lambda 函数日志。
如果您需要管理自己的计算资源,Amazon Web Services 还提供了其他计算服务以满足您的需求。
- Amazon Elastic Compute Cloud (Amazon EC2) 服务提供灵活性和各种 EC2 实例类型供您选择。它允许您选择自定义操作系统、网络和安全性设置以及整个软件堆栈,但您负责预置容量、监控机群运行状况和性能以及使用可用区来实现容错。
- Elastic Beanstalk 提供易用的服务,您可将应用程序部署和扩展到 Amazon EC2 上,在其中您保留对底层 EC2 实例的所有权和完整控制权。
3. AWS 语言工具选项
AWS | 语言工具选项 |
---|---|
Node.js | AWS Lambda 控制台;Visual Studio,带 IDE 插件(请参阅 Visual Studio 中的 AWS Lambda 支持) |
Python | AWS Lambda 控制台;您自己的编写环境;有关更多信息,请参阅 部署代码和创建 Lambda 函数。 |
4. 用于使用 Python 编写 Lambda 函数的编程模型
https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/python-programming-model.html
基础Lambda 函数:
exports.handler = (event, context, callback) => {
// 字符串“Hello world!”已成功。
callback(null, 'Hello world!');
};
Lambda 代码说明(Python3.6):
import boto3
import os
import sys
import urllib
from PIL import Image
import PIL.Image
s3_client = boto3.client('s3')
def resize_image(image_path, resized_path):
with Image.open(image_path) as image:
image.thumbnail((128,128))
image.save(resized_path)
def handler(event, context):
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
raw_key = urllib.parse.unquote_plus(key)
download_path = '/tmp/{}'.format(key)
upload_path = '/tmp/resized-{}'.format(key)
s3_client.download_file(bucket, raw_key, download_path)
resize_image(download_path, upload_path)
s3_client.upload_file(upload_path,
'{}-resized'.format(bucket),
'thumbnail-{}'.format(raw_key),
ExtraArgs={'ContentType': 'image/jpeg'})
Lambda 代码之S3 put测试:
{
"Records": [
{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg",
"size": 1024
},
"bucket": {
"arn": "arn:aws:s3:::mybucket",
"name": "dingjianfeng-993",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-west-2",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}
]
}