有了 DynamoDB 可以存儲資料,接著需要透過適當的方法去存取 DynamoDB ,於是 AWS 提供了 AWS Lambda 作為撰寫程式的全托管服務。
AWS Lambda
AWS Lambda 是一種無伺服器的運算服務,可讓軟體設計者開發並執行程式但不必佈建或管理伺服器、建立工作負載感知叢集擴展邏輯、維護事件整合或管理執行階段。使用 Lambda,軟體設計者可以透過虛擬方式執行任何類型的應用程式或後端服務,全部無需管理。只要以 ZIP 檔案或容器映像上傳您的程式碼,Lambda 就可以自動並精準地分配運算執行力,並根據傳入請求或事件執行您的程式碼,適用於任何規模的流量。可以將自己的程式碼設成可以從超過 200 種 AWS 服務和 SaaS 應用程式自動觸發,或從任何 Web 或行動應用程式直接呼叫。可以用自己最喜愛的語言 (Node.js、Python、Go、Java 等) 寫入 Lambda 函式,而且可以使用 AWS SAM 或 Docker CLI 等無伺服器和容器工具建置、測試和部署您的函式。
下圖列出了傳統佈署與無服務器佈署的差異,在無服務器的環境中,軟體開發者可以更專心的在軟體的開發跟維運上。雲計算的其中一個優勢是,使用者可以抽象化基礎設施層,例如,選擇一個 Amazon Elastic Compute Cloud (Amazon EC2) 實例類型,並使用 Elastic Load Balancing 和 EC2 Auto Scaling 對其進行配置以處理需求。
然而,無伺服器計算進一步擴展了基礎設施抽象,軟體設計者可以專注於應用程式的代碼,不必管理實例、操作系統或伺服器,無服務器環境處理運行和擴展高度可用的應用程式所需的一切工作。此外,藉助無伺服器計算,您的代碼僅在需要時運行,代碼未運行時,您無需為任何基礎設施付費。
圖 1、傳統佈署與無服務器佈署的差異
AWS Lambda 工作原理
下圖說明 AWS Lambda 工作原理,事件源是向 AWS Lambda 發佈事件的實體,而 Lambda 函式是提供的用於處理事件的自定義代碼,AWS Lambda 執行 Lambda 函式,AWS Lambda 與其他 AWS 服務集成以調用函式,最後回應呼叫的事件源。
圖 2、AWS Lambda 工作原理
下圖說明 AWS Lambda 的內容組成包含了:
圖 3、AWS Lambda 的內容組成
下圖說明 AWS Lambda 的許可權類型,AWS Lambda 具有兩種類型的許可權:
調用和執行許可權通過 AWS Identity and Access Management (IAM) 進行處理。
圖 4、AWS Lambda 的調用許可權和執行許可權
AWS Lambda 結合 Amazon DynamoDB
如同圖 3. AWS Lambda 的內容組成中說明,整個 AWS Lambda 應該包含了訪問許可權、觸發事件、代碼、依賴項和庫、配置,基於由淺入深原則,我們只處理必要的元素就是訪問許可權和代碼這兩個部分,其他三個會在後續文章中提到。
訪問許可權
我們要透過 AWS Lambda 存取 DynamoDB ,所以需要賦予 DynamoDB 的執行許可權,這個部分可以透過 IAM 來完成,在 IAM 中建立一個角色 (Role),並賦予它存取 DynamoDB 的許可權。
打開 IAM 管理控制台,點擊左手邊功能選單的 角色,接著點擊右手邊主畫面的 建立角色 按鈕,如下圖所示。
圖 5、IAM 管理控制台中新增角色
建立角色共有四個步驟:
下圖是選擇使用案例畫面,使用案例指的是主動的 AWS 服務,也就是透過這個服務來調用其他 AWS 服務,我們的案例就是透過 AWS Lambda 來讀取 DynamoDB ,所以在這裡要選擇 Lambda,接著點擊 下一個:許可。
圖 6、新增角色中選擇使用案例
要存取的是 DynamoDB,所以在篩選政策中輸入 dynamo ,會看到下方出現很多跟 dynamo 有關的政策,選取 AmazonDynamoDBFullAccess,並點擊 下一個:標籤。其實以我們的功能指會讀取 DynamoDB,所以選取 AmazonDynamoDBReadOnlyAccess 更為洽當。
圖 7、AWS Lambda 的調用許可權和執行許可權
標籤部分我們就不設定,繼續跳到下一個檢閱畫面,下圖就是檢閱畫面,輸入角色名稱,特別注意一下底下的受信任實體與政策,這說明這個角色是可以被 AWS Lambda 所調用,且擁有完全存取 DynamoDB 的許可權。
圖 8、AWS Lambda 的調用許可權和執行許可權
代碼
進入 AWS Lambda 控制台,點擊左手邊功能選單的 函式 ,接著再點擊右手邊主畫面的 建立函式,如下圖所示。
圖 9、AWS Lambda 的建立函式畫面
輸入函式名稱,如 getDataFromDynamoDB ,指定執行時間所用的程式語言 Python 3.8,再指定執行角色,就是先前設定的角色,完成後點擊 建立函式。
圖 10、AWS Lambda 的函式配置畫面
進入函式編輯畫面,點選上方的函式名稱,再下方會有一個操作介面,選取 程式碼 頁籤,再撰寫程式碼後記得要先佈署 (Deploy),才可以進行測試 (Test):下方的畫面分布:左手邊為檔案管理畫面,右手邊則是代碼區。
圖 11、AWS Lambda 函式編輯畫面
撰寫代碼後要先進行測試來判斷代碼是否正確,點擊 Test 會進入AWS Lambda 的測試配置畫面,如下圖所示,輸入事件名稱,測試內容不用修改,直接存儲即可。
圖 12、AWS Lambda 的測試配置畫面
輸入以下代碼後,點擊 Deploy 後,在點擊 Test,就會出現代碼運行結果,如下圖,顯示測試名稱,回傳結果,運行時間,運行時所用的記憶體數量,如果需要觀察結果,還可以用 print() 來顯示內容。
import json
import boto3
client = boto3.client('dynamodb')
def lambda_handler(event, context):
data = client.get_item(
TableName='fishInfoTbl',
Key={
'LatinName': {
'S': 'Altolamprologus compressiceps'
}
}
)
print(data['Item'])
response = {
'statusCode': 200,
'body': json.dumps(data['Item']),
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
}
return response
圖 13、AWS Lambda 的測試結果