[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: 使用 Python 构建 Lambda 函数

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)

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-08-17 23:15  郝壹贰叁  阅读(691)  评论(0编辑  收藏  举报