在本單元中,您會使用 AWS Lambda 和 Amazon DynamoDB 來建立後端程序,以處理 web 應用程式的請求。您在第一個單元中部署的瀏覽器應用程式,可讓使用者請求將獨角獸傳送至其所選擇的位置。為了實現以上請求,運作於瀏覽器的 JavaScript 必須叫用在雲端運作的服務。

Serverless_Web_App_LP_assets-04

每當使用者請求獨角獸時,您皆會實作叫用 Lambda 函數。此函數會從隊列中選取一個獨角獸、在 DynamoDB 表中記錄請求,然後再向前端應用程式回應有關目前所分派獨角獸的詳細資訊。

使用 Amazon API Gateway 從瀏覽器叫用此函數。您會在下個單元中實作連線。針對本單元,您僅需獨立測試功能。

單元完成時間:30 分鐘

使用的服務:AWS Lambda、Amazon DynamoDB


依照以下的逐步說明,建立無伺服器後端程序。按一下各個步驟編號以展開區段。

  • 步驟 1. 建立 Amazon DynamoDB 表

    使用 Amazon DynamoDB 主控台建立新的 DynamoDB 表。呼叫您的 Rides 表格,並為其提供含類型字串的分割區金鑰,並將該金鑰命名為 RideId。表格名稱和分割區金鑰區分大小寫。確認使用提供的完整 ID。使用適用於其他所有設定的預設值。

    建立表格後,記下 ARN 以在下個步驟中使用。


    1. 在「AWS 管理主控台」中,選擇「Services (服務)」,然後再於「Databases (資料庫)」下方選取 DynamoDB

    2. 選擇「Create table (建立表格)」。

    3. 輸入 Rides 做為「Table name (表格名稱) 」。此欄位區分大小寫。

    4. 輸入 RideId 做為「Partition key (分割區金鑰)」,然後選取「String (字串)」做為金鑰類型。此欄位區分大小寫。

    5. 勾選「Use default settings (使用預設設定)」方塊,然後選擇「Create (建立)」。

    6. 捲動至新表格的「概觀」區段底部,並記下 ARN。您會在下個區段中使用該值。

  • 步驟 2. 為 Lambda 函數建立 IAM 角色

    每個 Lambda 函數皆有與其關聯的 IAM 角色。此角色會定義允許函數與哪些其他 AWS 服務進行互動。針對本研習營之用途,您必須建立一個 IAM 角色,授與 Lambda 函數許可將記錄寫入至 Amazon CloudWatch Logs,以及將項目寫入至 DynamoDB 表格的存取權。

    使用 IAM 主控台建立新角色。將其命名為 WildRydesLambda,然後選取 AWS Lambda 做為角色類型。您必須連接政策,針對函數授與寫入至 Amazon CloudWatch Logs,以及將項目置入 DynamoDB 表格的許可。

    將名為 AWSLambdaBasicExecutionRole 的受管政策連接到這個角色,以授與所需的 CloudWatch Logs 許可。此外並為角色建立自訂內嵌政策,針對您在上個區段中建立的表格允許 ddb:PutItem 動作。


    1. 在「AWS 管理主控台」中,按一下「Services (服務)」,然後再於「Security, Identity & Compliance (安全、身分與合規)」區段下方選取 IAM

    2. 在左側導覽列中選取「Roles (角色)」,然後再選擇「Create New Role (建立新角色)」。

    3. 從「AWS service (AWS 服務)」組中選擇 Lambda 作為角色類型,然後按一下「Next: Permissions (下一步:許可)」。

      注意:選取角色類型會自動為角色建立信任政策,允許 AWS 服務代表您假定此角色。若您已使用 CLI、AWS CloudFormation 或其他機制建立此角色,則可直接指定信任政策。

    4. 在「Filter (篩選條件)」文字方塊中輸入 AWSLambdaBasicExecutionRole,然後勾選該角色旁的方塊。

    5. 選擇「Next Step (下一步)」。

    6. 輸入 WildRydesLambda 做為「Role Name (角色名稱)」。

    7. 選擇「Create Role (建立角色)」。

    8. 在角色頁面上的篩選條件方塊中輸入 WildRydesLambda,然後選擇剛建立的角色。

    9. 在「Permissions (許可)」標籤上,選擇右下角的「Add inline policy (新增內嵌政策)」連結來建立新的內嵌策略。

    10. 選擇「Choose a service (選擇服務)」。

    11. 在「Find a service (尋找服務)」搜尋方塊中輸入 DynamoDB,並在顯示時選擇 DynamoDB

    12. 選擇「Select actions (選擇動作)」。

    13. 在「Filter actions (篩選動作)」搜尋方塊中輸入 PutItem,並在它顯示時勾選 PutItem 旁的方塊。

    14. 選擇「Resources (資源)」部分。

    15. 選擇「Specific (具體)」選項後,再選擇「table (表格)」部分中的「Add ARN (新增 ARN)」。

    16. 在「Specify ARN for table (指定表格 ARN)」欄位貼上在上個部分建立之表格的 ARN,然後選擇「Add (新增)」。

    17. 選擇「Review Policy (審查政策)」。

    18. 輸入 DynamoDBWriteAccess 做為政策名稱,然後選擇「Create policy (建立政策)」。

  • 步驟 3. 建立 Lambda 函數以處理請求

    AWS Lambda 會執行程式碼,以回應諸如 HTTP 請求等事件。在此步驟中,您會建立核心功能來處理 web 應用程式的 API 請求,以分派獨角獸。在下個單元中,您會使用 Amazon API Gateway 來建立 RESTful API,其會公開可自使用者瀏覽器叫用的 HTTP 終端節點。接著,您會將此步驟中建立的 Lambda 函數連線至該 API,以為 web 應用程式建立完整功能的後端。

    使用 AWS Lambda 主控台建立名為 RequestUnicorn 的新 Lambda 函數,用以處理 API 請求。針對函數程式碼,使用提供的 requestUnicorn.js 範例實作。只要從該檔案複製並貼至 AWS Lambda 主控台的編輯器即可。

    務必將函數設為使用您在上個區段中建立的 WildRydesLambda IAM 角色。


    1. 選擇「Services (服務)」,然後再於「Compute (運算)」區段選取 Lambda

    2. 按一下「Create function (建立函數)」。

    3. 保持選擇預設的「Author from scratch (從新創作)」卡。

    4. 在「Name (名稱)」欄位中,輸入 RequestUnicorn

    5. 為「Runtime (執行時間)」選擇 Node.js 6.10

    6. 務必從「Role (角色)」下拉式清單選取 Choose an existing role

    7. 從「Existing Role (現有的角色)」下拉式清單中選取 WildRydesLambda

    8. 按一下「Create function (建立函數)」。

    9. 向下捲動到「Function code (函數程式碼)」部分,並將 index.js 程式碼編輯器中的退出程式碼替換為 requestUnicorn.js 的內容。

    10. 按一下頁面右上角的「Save (儲存)」。

  • 步驟 4. 測試實作

    在本單元中,您會測試使用 AWS Lambda 主控台建立的函數。在下個單元中,您會使用 API Gateway 來新增 REST API,如此即可從您在第一個單元中部署,且以瀏覽器為基礎的應用程式,來叫用函數。


    1. 在函數的主編輯畫面上,從「Select a test event... (選擇測試事件)」下拉清單中選擇「Configure test event (配置測試事件)」。

    2. 保持選擇「Create new test event (建立新的測試事件)」。

    3. 在「Event name (事件名稱)」欄位中,輸入 TestRequestEvent

    4. 將下列測試事件複製並貼至編輯器:

    {
        "path": "/ride",
        "httpMethod": "POST",
        "headers": {
            "Accept": "*/*",
            "Authorization": "eyJraWQiOiJLTzRVMWZs",
            "content-type": "application/json; charset=UTF-8"
        },
        "queryStringParameters": null,
        "pathParameters": null,
        "requestContext": {
            "authorizer": {
                "claims": {
                    "cognito:username": "the_username"
                }
            }
        },
        "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}"
    }
    1. 按一下「Create (建立)」。

    2. 在主要函數編輯畫面中,按一下「Test (測試)」並在下拉清單中選擇 TestRequestEvent

    3. 捲動到頁面頂部並展開「Execution result (執行結果)」部分的「Details (詳細資訊)」部分。

    4. 確認執行成功,且函數結果類似如下:

    {
        "statusCode": 201,
        "body": "{\"RideId\":\"SvLnijIAtg6inAFUBRT+Fg==\",\"Unicorn\":{\"Name\":\"Rocinante\",\"Color\":\"Yellow\",\"Gender\":\"Female\"},\"Eta\":\"30 seconds\"}",
        "headers": {
            "Access-Control-Allow-Origin": "*"
        }
    }