[AWS]Serverless API(三)

GaryLin
Gary的程式學習紀錄簿
Aug 17, 2023

lambda+api gateway+DynamoDB環境版本控制

這次要記錄一下過版控制的方式,在舊有的程式裡版本控制基本上就是用git然後在不同環境內設置環境變數來進行上版,由於不同環境就是切不同環境設定所以相對單純,但這次Serverless架構牽涉到多個aws服務,每個服務間的環境版本管控方式就變得很重要,不然一個不小心把測試環境和正式環境的資料混用或是還沒到時間就上版就糟了。

API Gateway

首先先從API Gateway來,從前面可以知道API Gateway要部署到階段上,例如我們建立了2個階段test和sit,然後我們先在階段變數裡加上env的環境變數,之後會在lambda裡加上怎麼讀取這變數的方式

然後是部署歷史,這邊可以看到所選階段目前的版本(部署日期),如下圖所示,目前我SIT版本是8/7的(這邊建議描述加上版本號或需求單號之類的方便區隔),上面還有個8/16是test版本,如果要把SIT版本切換成8/16版本只要點選後按右下變更部署就好,這個在環境過版時只要一鍵就可以上版或還原

不過一定也有人好奇接的Lambda不都同一個,Lambda Deploy後不就更新了,這個後面說到Lambda版控的時候會說到,簡單來說就是要加上版本號來控管,像下面Lambda函數後面就比之前演練時多了:1

DynamoDB

這邊的控管主要是搭配上面API Gateway裡設定的env環境變數來進行,經由在lambda上組合env變數和table名稱來對對應的Table做操作,所以就像下面那樣,簡單的建立各環境專用table(可以加上標籤方便之後查詢)

這邊就很簡單這樣,因為主要控制還是在lambda那邊

Lambda

先來說版本控制的部分,在版本那邊可以建立新的版本,建立會以當下的程式碼成為一個新的版本

這個版本就是剛剛在API Gateway時在Lambda函數後面的編號,寫定版本號後不論Lambda怎麼Deploy都不會改變呼叫API的內容,如果要測試最新版本的,可以弄一個新階段,然後部署一個沒有版本號的給他,之後那個就可以用來及時修改測試用

接下來稍微展示一下程式碼的部分,這段主要是(一)裡的程式修改,後面其他部分就不節錄了

# define the DynamoDB table that Lambda will connect to
tableName = "user"
# create the DynamoDB resource
db = boto3.resource('dynamodb')

def get_user_by_id(member_id: str):
query = {'id': member_id}
user = get_userdb(request).get_item(Key=query)
return user.get('Item')

def get_token_id(request: Request):
return request.scope["aws.event"].get("requestContext").get("authorizer").get("claims").get("sub")

def get_stageVariables(request: Request):
return request.scope["aws.event"].get("stageVariables")

def get_userdb(request: Request):
env = get_stageVariables(request).get("env")
envTable = env + "_" + tableName if env else tableName
print("envTable: " + envTable)
return db.Table(envTable)


@app.get('/member')
def get_data(request: Request):
return get_userdb(request).scan().get('Items')

如果修改成功,我們可以看到針對不同部署的url打API會在不同的table進行CRUD,這樣基本上我們環境控制也成功了

未來程式過板步驟就會是
1. Lambda Deploy
2. 建立新版本
3. API Gateway修改lambda對應版本
4. API Gateway部署到測試階段
5. 測試完成後prod階段變更成和測試同版本進行過版
這基本的5個步驟,當然DynamoDB也要配合過版階段進行修改,不過因為Nosql不像RDBMS要先建立好所有的欄位和對應關係,只要先把要的table建立好即可

--

--