简介
本文将创建一个微型网站,以达到综合运用AWS服务的目的:
- Dynamodb:一种完全托管的 NoSQL 数据库服务
- Lambda:实现具体的业务逻辑,基于python3编写,它会调用dynamodb数据库。
- API Gateway: 一种完全托管的服务,可以帮助开发者轻松创建、发布、维护、监控和保护任意规模的 API。
- S3: Host一个较为简单的静态网站,并调用开放出来的REST API
1. 创建Dynamodb
新建一张表(employee),以name为Primary key(partial key),再新增两行数据,如下图所示:
2. 编写Lambda逻辑
2.1 创建一个Lambda名为conglambda
2.2 lambda_function.py
lambda_function.lambda_handler 作为入口函数,它会调用dynamodb.
import json
from employee import Employee
from datetime import datetime, timezone, timedelta
from DynamoDBService import DynamoDBService
def lambda_handler(event, context):
myname = event.get('name', 'cong')
# tz_utc_8 = timezone(timedelta(hours=8))
# thebithday = datetime.now().replace(tzinfo=tz_utc_8)
# employee = Employee(name,20,True,thebithday)
# TODO implement
# return {
# 'statusCode': 200,
# 'body': json.dumps(employee,default = employee2json )
# }
dynamodb = DynamoDBService()
result = dynamodb.operate_table(name=myname)
return {
'statusCode': 200,
'body': result
}
def employee2json(e):
print(e)
return {
'name': e.name,
'birthday': e.birthday.strftime('%y-%m-%d')
}
2.3 DynamoDBService.py
此模块会使用boto3调用dynamodb, 其中AWS_ACCESS_ID和AWS_ACCESS_KEY可以在IAM--->Users-->Security credentials-->Create access key创建。
import boto3
from boto3 import Session
from boto3.dynamodb.conditions import Attr, Key
from datetime import datetime
import json
class DynamoDBService:
def __init__(self):
self.this_day = datetime.today()
# 这两个key像是账号和密码一般,需要在后台申请导出,唯一的
self.AWS_ACCESS_ID = 'AKIAQXXXXXXXXXLMGWH5'
self.AWS_ACCESS_KEY = 'yVqLsXXXXXXXXXXXXXXXXXXX3A4qCXPN'
def get_service(self, table_name):
"""将service单独拿出来的目的,我为了初始化类的时候不会那么慢"""
client = boto3.client('dynamodb', region_name='us-east-1',
aws_access_key_id=self.AWS_ACCESS_ID,
aws_secret_access_key=self.AWS_ACCESS_KEY)
dynamodb = boto3.resource('dynamodb', region_name='us-east-1',
aws_access_key_id=self.AWS_ACCESS_ID,
aws_secret_access_key=self.AWS_ACCESS_KEY)
# 通过dynamodb服务获取目标table的操作对象
table_handle = dynamodb.Table(table_name)
return table_handle
def operate_table(self, table_name="employee", name="congcong"):
# 通过dynamodb服务获取目标table的操作对象
table_handle_h5_visit_info = self.get_service(table_name)
"""查询,根据某一key(column)查询"""
response = table_handle_h5_visit_info.query(
KeyConditionExpression=Key('name').eq(name)
)
# response中包含了很多内容,response本身是个json字符串,其Items键的内容才是table中的内容
print(type(response))
items = response['Items']
print(items)
return json.dumps(items)
2.4 employee.py
相当于一个model类或是一个Dto类。
class Employee(object):
def __init__(self, name, age, gender,birthday):
self.__name=name
self.__age=age
self.__gender=gender
self.__birthday=birthday
@property
def name(self):
return self.__name
@property
def birthday(self):
return self.__birthday
@birthday.setter
def birthday(self,value):
self.__birthday = value
3. 创建一个API Gateway
命令为congAPI,在resources中创建一个新的Method,选择Get,选择刚创建的lambda
接下来,我们需要给API Gateway传递参数,点击Integration Request-->Mapping Templates中,输入如下内容,以便可以传入name参数给api gateway。
扫描二维码关注公众号,回复:
10649083 查看本文章
编辑好后,需要部署API Gateway, 点击Deploy API
输入Dev ,点击发布,会生成如下链接
我们在浏览器上输入相应的name参数,就可以成功访问到相应的数据了,此数据来源于dynamodb.
4.使用S3服务host一个较为简单的静态网站
4.1 准备index.html
它会使用jquery调用刚才创建的api gateway, 具体内容如下:
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$("#btn").click(function() {
var name = $.trim($("[name=name]").val());
var url = 'https://4gh0260hld.execute-api.us-east-1.amazonaws.com/dev?name=' + name;
$.get(url, function(data) {
$("pre").text(JSON.stringify(data, null, 2));
});
});
});
</script>
</head>
<body>
<input name="name" value="congcong">
<button id="btn" type="button">Search</button>
<br>
<pre></pre>
</body>
4.2 创建一个S3 bucket名为cong-bucket
上传此index.html
4.3 将 Permissions设置为public,以便公网可以访问到index.html
首先将Bock public access下面的4行全部改成off
将Bucket改成public有多种方式,这里使用Bucket Policy。即所有人都可以访问,如下图:
4.4 启用bucket hosting,将host一个较为简单的静态网站
4.5 验证与测试
访问此网站, 输入name,点击search,可以看到根据输入的不同,从数据库中抓取相应的内容并显示在网页上