AWS: 在AWS上創建一個網站,綜合運用(Lambda + Api Gateway + Dynamodb + S3)

簡介

本文將創建一個微型網站,以達到綜合運用AWS服務的目的:

  1. Dynamodb:一種完全託管的 NoSQL 數據庫服務
  2. Lambda:實現具體的業務邏輯,基於python3編寫,它會調用dynamodb數據庫。
  3. API Gateway: 一種完全託管的服務,可以幫助開發者輕鬆創建、發佈、維護、監控和保護任意規模的 API。
  4. 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。

編輯好後,需要部署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,可以看到根據輸入的不同,從數據庫中抓取相應的內容並顯示在網頁上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章