在本單元中,您會使用 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 且類型為 String 的分割區金鑰。表格名稱和分割區金鑰區分大小寫。確認使用提供的完整 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 Lambda 做為角色類型。

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

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

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

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

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

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

    9. 在「許可」標籤上,展開「內嵌政策」區段,然後選擇按一下這裡連結建立新的內嵌政策。

    10. 確認選取「Policy Generator (政策產生器)」,然後選擇「Select (選取)」。

    11. AWS Service 下拉式清單中,選取 Amazon DynamoDB

    12. 從「Actions (動作)」清單中,選取 PutItem

    13. Amazon Resource Name (ARN) 欄位中,貼上您在上個區段中建立的表格 ARN。

    14. 選擇「Add Statement (新增陳述)」。

    15. 依序選擇「Next Step (下一步)」、「Apply 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 (服務)」,然後再於「運算」區段選取 Lambda

    2. 選擇「Create function (建立功能)」。

    3. 選擇「Author from Scratch (從頭撰寫)」。

    4. 輸入 RequestUnicorn  (位於「 Name (名稱)」欄位)。

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

    6. 選取「Create function (建立功能)」。

    7. 將程式碼從 requestUnicorn.js 複製並貼至程式碼輸入區。

    8. 確認選取 Node.js 6.10 (位於「執行時間」下方)。

    9. 保留預設值 index.handler (針對「Handler (處理常式)」欄位)。

  • 步驟 4. 測試實作

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


    1. 依序選取「Select a test event (選取測試事件)」下拉式清單、「Configure test event (設定測試事件)」。

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

    {
        "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 (建立)」、「test (測試)」。

    2. 確認執行成功,且功能結果類似如下:

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