此應用程式利用 AWS Lambda、API Gateway、DynamoDB、S3、RDS 和 CloudWatch 等服務,建構一個完整的無伺服器架構。首先,透過 API Gateway 建立安全入口,並使用 Lambda 函式驗證請求授權。接著,利用 S3 儲存城市資訊,並透過 Lambda 函式將其匯入 DynamoDB,以便快速查詢。同時,使用 RDS MySQL 資料函式庫儲存天氣資料,並透過 Lambda 函式從 OpenWeatherAPI 擷取天氣資訊並寫入資料函式庫。最後,利用 CloudWatch 監控系統運作狀態並記錄日誌,確保應用程式穩定執行。
設定 API Gateway 的授權機制與建立相關 AWS 資源
本章節將詳細介紹如何為 API Gateway 設定授權機制,以及建立相關的 AWS 資源,包括 Lambda 函式、S3 儲存桶和 DynamoDB 資料表。
建立 Authorizer Lambda 函式
- 首先,建立一個名為
weatherauthorizer的 Lambda 函式,用於驗證 API 請求的授權 Token。 - 該 Lambda 函式需要包含以下功能:
generate_policy:根據提供的principal_id、effect和resource生成 API Gateway 的政策檔案。lambda_handler:從事件中檢索authorizationToken,並與有效的 Token 進行比較。如果 Token 有效,則呼叫generate_policy生成允許政策;否則,生成拒絕政策。
Lambda 函式程式碼範例
def generate_policy(principal_id, effect, resource):
# 生成政策檔案的程式碼
pass
def lambda_handler(event, context):
authorization_token = event['authorizationToken']
valid_token = 'apressweatherapi'
if authorization_token == valid_token:
return generate_policy('user', 'Allow', event['methodArn'])
else:
return generate_policy('user', 'Deny', event['methodArn'])
內容解密:
generate_policy函式根據輸入引數生成符合 API Gateway 要求的政策檔案,確保只有授權的使用者可以存取指定的資源。lambda_handler是 Lambda 函式的入口點,負責驗證傳入的authorizationToken。如果 Token 正確,則允許請求;否則,拒絕請求。
設定 API Gateway 的 Authorizer
- 在 API Gateway 控制檯中,導航到「Authorizers」部分,並點選「Create Authorizer」。
- 名稱設為
weatherauthorizer,並選擇剛才建立的 Lambda 函式。 - 設定「Lambda event payload」為「Token」,並將「Token Source」設為
auth-token。 - 停用「Authorization caching」,然後點選「Create authorizer」。
將 Authorizer 新增到 GET 方法
- 在 API Gateway 控制檯中,導航到「countryweather」資源的 GET 方法。
- 編輯「Method request」,將「Authorization」設為
weatherauthorizer。 - 儲存變更後,重新佈署 API 以套用最新的設定。
建立 S3 儲存桶和 DynamoDB 資料表
- 建立一個名為
apressbucket的 S3 儲存桶,並上傳包含城市程式碼和名稱的 CSV 檔案。 - 建立一個名為
Citylist的 DynamoDB 資料表,用於儲存城市列表。
建立 DynamoDB 資料表的步驟
- 在 DynamoDB 控制檯中,點選「Create table」。
- 輸入資料表名稱和主鍵設定,然後點選「Create table」。
使用 Lambda 將 S3 中的 CSV 檔案匯入 DynamoDB
- 建立一個名為
csvprocessing的 Lambda 函式,賦予其讀取 S3 和寫入 DynamoDB 的許可權。 - 該 Lambda 函式需要讀取 S3 中的 CSV 檔案,並將其內容匯入 DynamoDB 資料表。
Lambda 函式程式碼範例
import boto3
import csv
def lambda_handler(event, context):
s3_client = boto3.client('s3')
dynamo_client = boto3.resource('dynamodb')
table_name = dynamo_client.Table('Citylist')
S3_BUCKET_NAME = 'apressbucket'
file_name = 'citylist.csv'
response = s3_client.get_object(Bucket=S3_BUCKET_NAME, Key=file_name)
filebytes = response['Body'].read().decode('utf-8')
csv_reader = csv.reader(filebytes.splitlines())
header = next(csv_reader)
for row in csv_reader:
result = dict(zip(header, row))
try:
table_name.put_item(Item=result)
print("Item added successfully!")
except Exception as e:
print(e)
內容解密:
- 該 Lambda 函式使用
boto3程式函式庫與 S3 和 DynamoDB 互動。 - 它讀取 S3 中的 CSV 檔案,並逐行將資料匯入 DynamoDB 資料表。
建立 RDS 資料函式庫例項
- 在 RDS 控制檯中,點選「Create database」。
- 選擇 MySQL 資料函式庫引擎,並設定資料函式庫名稱、使用者名稱和密碼等資訊。
- 設定外部存取許可權(不建議在生產環境中使用)。
透過上述步驟,您可以成功建立 API Gateway 的授權機制,以及相關的 AWS 資源,包括 Lambda 函式、S3 儲存桶、DynamoDB 資料表和 RDS 資料函式庫例項。這些資源將為您的無伺服器應用程式提供安全、可靠和可擴充套件的基礎架構。
在AWS上建立MySQL資料函式庫與Lambda函式的完整
在現代雲端運算中,資料函式庫的安全性和高效能是至關重要的。本篇文章將介紹如何在AWS上建立MySQL資料函式庫,並使用Lambda函式進行CRUD操作。
建立MySQL資料函式庫
首先,我們需要在AWS RDS上建立一個MySQL資料函式庫。以下是步驟:
- 登入AWS管理控制檯,導航至RDS儀錶板。
- 點選「建立資料函式庫」,選擇MySQL作為資料函式庫引擎。
- 選擇「密碼驗證」作為資料函式庫驗證選項,保持其他值為預設,然後點選「建立資料函式庫」。
重點注意事項
- 安全性至關重要,請確保組態適當的安全群組規則並使用強密碼。
- 考慮為生產工作負載啟用多可用區佈署,以確保高用性。
- 根據效能和儲存需求選擇適當的例項大小和儲存型別。
- 定期監控RDS例項,以確保最佳效能並識別任何潛在問題。
連線MySQL Workbench
預設情況下,RDS會建立幾個資料函式庫,如「information_schema」、「mysql」、「performance_schema」和「sys」。如果您想建立自己的資料函式庫,可以使用MySQL Workbench。
- 若要從本地機器使用MySQL Workbench連線資料函式庫,您需要在安全群組入站規則中允許0.0.0.0/0。
- 修改DB安全群組,點選「weatherreport」DB識別碼,然後點選「VPC安全群組」,編輯入站規則,新增規則,選擇「所有流量」和來源「Anywhere-IPV4」。
建立Lambda函式
接下來,我們將建立一個Lambda函式來對RDS例項執行CRUD操作。
- 名稱為「rdstablecreate」,並使用Python作為執行環境。
- 連線Lambda函式到RDS資料函式庫,使用「組態」標籤和RDS資料函式庫連結。
Lambda函式程式碼
import pymysql
def lambda_handler(event, context):
connection = pymysql.connect(
host='weatherreport.c3sew2om25ii.us-east-1.rds.amazonaws.com',
user='apress',
password='yourpassword',
database='weatherreport'
)
cursor = connection.cursor()
create_table_query = """CREATE TABLE weatherdata (
id INT AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(50) NOT NULL,
temperature FLOAT,
humidity INT,
description VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)"""
cursor.execute(create_table_query)
connection.commit()
connection.close()
return {
'statusCode': 200,
'body': 'Table created successfully'
}
程式碼解密:
- 使用
pymysql函式庫連線到MySQL資料函式庫。 lambda_handler函式是Lambda的入口點,用於處理事件。pymysql.connect用於建立與RDS資料函式庫的連線,需要提供主機、使用者名稱、密碼和資料函式庫名稱。cursor.execute(create_table_query)執行SQL查詢以建立名為weatherdata的表格。connection.commit()提交變更,connection.close()關閉資料函式庫連線。
使用AWS Secrets Manager管理敏感資訊
AWS Secrets Manager可以幫助您管理、檢索和輪換敏感資訊,如資料函式庫憑證、密碼、API金鑰等。與其在應用程式中硬編碼或以純文字儲存,不如使用Secrets Manager安全地儲存和檢索它們。
建立OpenWeatherAPI帳戶
- 請確保在https://home.openweathermap.org/上建立帳戶。
- 建立帳戶後,您可以產生自己的API金鑰。
建立fetchweatherdata Lambda函式
我們將建立一個名為「fetchweatherdata」的Lambda函式,從DynamoDB表格中擷取國家列表,然後從OpenWeatherAPI擷取每個城市的天氣資訊,最後將擷取到的天氣資料儲存在MySQL資料函式庫中。
- 增加Lambda函式的逾時時間,以適應預期的較長執行時間。
- 連線「fetchweatherdata」Lambda到DynamoDB和RDS,進行必要的組態。
重點注意事項
- Lambda函式需要適當的許可權才能存取DynamoDB和RDS。
- 使用
requests和pymysqlPython函式庫來執行程式碼,將它們封裝成ZIP檔案並上傳到Lambda函式。
本提供了在AWS上建立MySQL資料函式庫和Lambda函式的詳細步驟,強調了安全性和高效能的重要性。透過遵循這些步驟,您可以建立一個強大且可擴充套件的無伺服器應用程式。
建立天氣資料擷取與分析的無伺服器應用程式
本章節將詳細介紹如何建立一個完整的無伺服器應用程式,用於擷取天氣資料並進行分析。我們將使用AWS Lambda、Amazon DynamoDB、Amazon RDS(MySQL)及Amazon CloudWatch等服務來實作此應用程式。
實作步驟
1. 建立Lambda函式以擷取天氣資料
首先,我們需要建立一個Lambda函式,用於從OpenWeatherAPI擷取天氣資料並將其儲存到MySQL資料函式庫中。
import json
import boto3
import requests
import pymysql
def lambda_handler(event, context):
# 初始化DynamoDB資源
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Citylist')
# 設定OpenWeatherAPI的基本URL和請求頭
base_url = "http://api.openweathermap.org/data/2.5/weather"
headers = {
"Content-Type": "application/json"
}
# 連線MySQL資料函式庫
connection = pymysql.connect(
host='weatherreport.c3sew2om25ii.us-east-1.rds.amazonaws.com',
user='apress',
password='apress#weather',
database='weatherreport'
)
cursor = connection.cursor()
# 查詢以插入資料到weatherdata表中
insert_data_query = """INSERT INTO weatherdata (city, temperature, humidity, description) VALUES (%s, %s, %s, %s)"""
# 從DynamoDB的Citylist表中掃描所有城市名稱
response = table.scan()
items = response['Items']
city_names = [item['CityName'] for item in items]
# 處理分頁結果
while 'LastEvaluatedKey' in response:
response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
items.extend(response['Items'])
city_names.extend([item['CityName'] for item in response['Items']])
# 對每個城市名稱傳送請求到OpenWeatherAPI
for city_name in city_names:
params = {"q": city_name, "appid": "1196cd362b174690705a898ce384e396"}
urlresponse = requests.get(base_url, headers=headers, params=params)
responsedata = urlresponse.json()
# 提取需要的天氣資料
city = json.dumps(responsedata['name'])
temperature = json.dumps(responsedata['main']['temp'])
humidity = json.dumps(responsedata['main']['humidity'])
description = json.dumps(responsedata['weather'][0]['description']) # 已修正此行
# 將資料插入MySQL資料函式庫
cursor.execute(insert_data_query, (city, temperature, humidity, description))
# 提交變更並關閉資料函式庫連線
connection.commit()
connection.close()
return {
'statusCode': 200,
'body': json.dumps('成功擷取天氣資料!')
}
#### 內容解密:
- 初始化AWS服務: 使用boto3初始化DynamoDB資源,並連線到指定的表。
- 設定API請求: 設定OpenWeatherAPI的URL和請求頭,以JSON格式請求資料。
- 資料函式庫連線: 使用pymysql連線到MySQL資料函式庫,並準備執行插入操作的SQL查詢。
- 擷取城市名稱: 從DynamoDB的Citylist表中掃描所有城市名稱,並處理分頁結果。
- 請求天氣資料: 對每個城市名稱傳送GET請求到OpenWeatherAPI,擷取天氣資料。
- 資料儲存: 將擷取的天氣資料插入到MySQL資料函式庫的weatherdata表中。
- 錯誤處理: 未在此程式碼中明確展示,但建議加入適當的錯誤處理機制。
2. 自動化Lambda函式執行
為了自動化Lambda函式的執行,我們需要建立一個CloudWatch Events規則。
- 前往Amazon CloudWatch控制檯。
- 點選「事件」下的「規則」,然後點選「建立規則」。
- 定義規則的詳細資訊,選擇「排程」作為事件模式,並設定排程表示式為
rate(5 minutes),以每5分鐘觸發一次Lambda函式。 - 選擇目標為Lambda函式,並指定我們建立的
fetchweatherdata函式。
3. 從MySQL資料函式庫讀取天氣資訊
我們將使用另一個Lambda函式readweather來從MySQL資料函式庫中擷取天氣資料。
import json
import pymysql
def lambda_handler(event, context):
Location = event['headers']['location']
LikeLocation = "%" + Location + "%"
connection = pymysql.connect(
host='weatherreport.c3sew2om25ii.us-east-1.rds.amazonaws.com',
user='apress',
password='apress#weather',
database='weatherreport'
)
cursor = connection.cursor()
select_data_query = "SELECT city, temperature, humidity, description FROM weatherdata WHERE city LIKE %s"
dbresult = cursor.execute(select_data_query, LikeLocation)
rows = cursor.fetchall()
connection.commit()
connection.close()
return {
'statusCode': 200,
'body': json.dumps({
'message': "成功接收值",
'Location': rows[0]
})
}
#### 內容解密:
- 事件處理: 從事件物件中提取位置資訊。
- 資料函式庫查詢: 連線到MySQL資料函式庫,並執行查詢以根據城市名稱擷取天氣資料。
- 結果傳回: 將查詢結果以JSON格式傳回。
CloudWatch監控與儀錶板
- 日誌群組: 在CloudWatch中檢視日誌群組,以監控Lambda函式的日誌。
- 日誌洞察: 使用CloudWatch Logs Insights查詢和分析日誌資料。
- 儀錶板: 建立CloudWatch儀錶板,以視覺化方式呈現關鍵指標和圖表。
重點注意事項
- 日誌保留: 設定CloudWatch Logs的日誌保留政策,以決定日誌資料的儲存時間。
- 日誌流命名: 使用一致且具有資訊性的命名慣例,以便於查詢和分析日誌資料。
本章節詳細介紹瞭如何建立一個完整的無伺服器應用程式,用於擷取天氣資料並進行分析。透過使用AWS Lambda、Amazon DynamoDB、Amazon RDS及Amazon CloudWatch等服務,我們實作了一個自動化且可擴充套件的天氣資料擷取與分析系統。