[AWS] Lambda by Python to build serverless Rest API
当前统治数据分析的语言还是Python,还是暂时走:Python + GPU的常规路线好了。
numba, pyculib (分装了cublas)
Ref: https://aws.amazon.com/blogs/compute/parallel-processing-in-python-with-aws-lambda/
Ref: AWS Lambda Pricing
512m | $0.0000008333 | 100 ms/sec |
大概是:0.03 per hour
Lambda by Python call serverless
Ref: Intro to AWS Lambda with Python | AWS Lambda Python Tutorial
AWS Lambda with Python calls S3
创建lambda函数
修改为python环境
注意将Runtime改为Python3.7
进入IDE
自动提供了基本模板代码。
测试模板代码
右上角"Test"按钮,打开测试模板代码。
Python Lambda --> S3
代码展示
import json import boto3 s3 = boto3.resource('s3') def lambda_handler(event, context): bucket_list = [] for bucket in s3.buckets.all(): print(bucket.name) bucket_list.append(bucket.name)
return { 'statusCode': 200 'body': bucket_list }
IAM --> Role
给lambda添加访问S3特定数据的权限。
AWS Lambda with Python calls DynomoDB
创建lambda函数 - get_item
import json import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('planets') def lambda_handler(event, context): response = table.get_item( Key={ 'id': 'mercury' } ) print(response) return { 'statusCode':200, 'body':response }
IAM --> Role
给Lambda添加访问DynamoDB特定数据的权限。
然后就能获得数据。
创建lambda函数 - put_item
import json import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('planets') def lambda_handler(event, context): response = table.put_item( Item={ 'id': 'neptune', 'temp': 'super cold' } ) response = {
'message': 'Item added'
} return { 'statusCode':200, 'body': response }
Serverless Rest API using AWS and Python
Ref: Serverless Rest API using AWS and Python
Serverless Rest API using AWS and Python | Introduction to AWS (Part-1)
Nothing else.
Serverless Rest API using AWS and Python | Introduction to AWS Lambda (Part-2)
-
配置 Lambda
Lambda: UI 右上角,Configure test events,查看模拟"发送的测试"msg。
-
配置 SQS
Lamdba --> SQS
然后,配置SQS;配置完毕,返回Lambda,添加Trigger。
-
添加 Trigger
添加Trigger时,要提前把sqs的权限给Lambda。
-
-
怎么解决?
-
之前是要配置IAM。目前改为更为简单的方式,如下:
/* create another one to repeat it. */
Trigger配置完毕。
Serverless Rest API using AWS and Python | Introduction to API Gateway (Part-3)
-
API Gateway
简单的来说,API Gateway给你提供一个URL,当这个url被访问的时候,就会调用你设置的某个Lambda函数,这个函数执行完了之后就会返回你设定的数据。也就是说,以前你在服务器端收到一个请求,然后“做一堆事”完了之后发出响应Response的这个“做一堆事”和Response,写在一个Lambda函数里就可以了。
通常如果浏览器端使用ajax访问这个URL都会存在跨域的问题,API Gateway当然很贴心的提供了enable CROS选项!
-
响应式主动图片处理服务
Ref: 深入Serverless—让Lambda 和 API Gateway支持二进制数据
经典架构的案例——响应式主动图片处理服务。
Lambda配合 S3 文件上传事件触发在后台进行图片处理,比如生成缩略图,然后再上传到 S3,这是Lambda用于事件触发的一个经典场景。
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
[方案]
我们使用用户触发的架构来实现实时图片处理服务,即当用户请求某个缩略图时实时生成该尺寸的缩略图,然后通过 CloudFront缓存在CDN上。这其实还是事件触发执行Lambda,只是由文件上传的事件主动触发,变成了用户访问的被动触发。但是只有原图存储在S3,任何尺寸的缩图都不生成文件不存储到S3。要实现此架构方案,核心技术点就是让Lambda和API Gateway可以响应输出二进制的图片数据流。
-
生产环境设置
Ref: AWS API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置
-
Create one API
点击 Create Method。
为一个 URL 挂上一个 Lambda触发函数。
然后“创建”,并测试下。
-
Deploy API
访问制定的URL,触发 Lambda 返回 (GET) 以下内容。
{"message": "Hello, world!"}
Serverless Rest API using AWS and Python | Introduction to AWS CloudFormation (Part-4)
-
初步认识
Ref: AWS CloudFormation Get Started
有点 docker file的感觉。
Serverless Rest API using AWS and Python | Project Setup using AWS SAM (Part-5)
$ pip install aws-sam-cli
$ sam init
Serverless Rest API using AWS and Python | Flask Lambda Integration (Part-6)