教學課程:建立RESTAPI包含兩個 AWS 服務整合和一個 Lambda 非代理整合的計算器 - Amazon API 网关

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:建立RESTAPI包含兩個 AWS 服務整合和一個 Lambda 非代理整合的計算器

專門教學課程:使RESTAPI用 Lambda 非代理整合建立使用Lambda Function集成。 Lambda Function整合是整合類型的特殊案例,可為您執行大部分整合設定,例如自動新增所需的以資源為基礎的權限以呼叫 Lambda 函數。AWS Service在這裡,三種整合中的兩種會使用 AWS Service 整合。在此整合類型中,您有更多控制權,但您需要手動執行工作,例如建立和指定包含適當權限的IAM角色。

在本教學課程中,您將建立 Calc Lambda 函數,以實作基本的算術運算、接受和傳回JSON格式化的輸入和輸出。然後,您將以下列方式建立RESTAPI並將其與 Lambda 函數整合:

  1. GET 資源上公開 /calc 方法來叫用 Lambda 函數,並提供輸入做為查詢字串參數。(AWS Service 整合)

  2. POST 資源上公開 /calc 方法來叫用 Lambda 函數,並在方法請求酬載中提供輸入。(AWS Service 整合)

  3. 在巢狀 GET 資源上公開 /calc/{operand1}/{operand2}/{operator} 來叫用 Lambda 函數,並提供輸入做為路徑參數 (Lambda Function 整合)

除了試用本自學課程之外,您可能還希望研究的開啟API定義檔案 CalcAPI,您可以依照中的指示將其匯入 API Gateway RESTAPIs使用 API「在API閘道開啟」開發

建立可擔任的 IAM 角色

API若要叫用 Calc Lambda 函數,您必須具有API閘道可設定IAM角色,這是具有下列信任關係的IAM角色:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

您建立的角色必須具有 Lambda InvokeFunction權限。否則,呼API叫者將收到500 Internal Server Error回應。若要授予角色此權限,您需要將下列IAM原則附加至該角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }

以下是如何完成此全部操作的方式:

建立API閘道可設定角IAM色
  1. 登入 IAM 主控台。

  2. 選擇角色

  3. 選擇 Create Role (建立角色)

  4. 選取可信任執行個體類型下,選取 AWS 服務

  5. Choose the service that will use this role (選擇將使用此角色的服務) 下,選擇 Lambda (Lambda)

  6. 選擇 Next: Permissions (下一步:許可)

  7. 選擇 Create Policy (建立政策)

    Create Policy (建立政策) 主控台將開啟新的時段。在該視窗中,執行下列作業:

    1. JSON標籤中,以下列項目取代現有策略:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
    2. 選擇 Review policy (檢閱政策)

    3. Review Policy (檢閱政策) 下,執行下列操作:

      1. Name (名稱) 中輸入名稱,例如 lambda_execute

      2. 選擇 Create Policy (建立政策)

  8. 在原本的 Create Role (建立角色) 主控台視窗中,執行下列動作:

    1. Attach permissions policies (連接許可政策) 下方,從下拉式清單中選擇您的 lambda_execute 政策。

      如果您在清單中沒有看到您的政策,請選擇清單頂端的重新整理按鈕。(請不要重新整理瀏覽器頁面!)

    2. 選擇 Next: Add Tags (下一步:新增標籤)

    3. 選擇 Next:Review (下一步:檢閱)

    4. Role name (角色名稱) 中輸入名稱,例如 lambda_invoke_function_assume_apigw_role

    5. 選擇 Create Role (建立角色)。

  9. 從角色清單中選擇您的 lambda_invoke_function_assume_apigw_role

  10. 選擇 Trust Relationships (信任關係) 標籤。

  11. 選擇 Edit trust relationship (編輯信任關係)

  12. 用以下內容取代現有政策:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "apigateway.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
  13. 選擇 Update Trust Policy (更新信任政策)

  14. 記下您剛建立ARN之角色的角色。以供稍後使用。

建立 Calc Lambda 函數

接下來,您會使用 Lambda 主控台建立 Lambda 函數。

  1. 在 Lambda 主控台中,請選擇 Create function (建立函數)

  2. 選擇 Author from Scratch (從頭開始撰寫)

  3. 針對名稱,輸入 Calc

  4. 針對執行期,請選擇最新支援的 Node.jsPython 執行期。

  5. 對於所有其他選項,請使用預設設定。

  6. 選擇建立函數

  7. 在 Lambda 主控台中,複製下列 Lambda 函數,並將其貼入程式碼編輯器。

    Node.js
    export const handler = async function (event, context) { console.log("Received event:", JSON.stringify(event)); if ( event.a === undefined || event.b === undefined || event.op === undefined ) { return "400 Invalid Input"; } const res = {}; res.a = Number(event.a); res.b = Number(event.b); res.op = event.op; if (isNaN(event.a) || isNaN(event.b)) { return "400 Invalid Operand"; } switch (event.op) { case "+": case "add": res.c = res.a + res.b; break; case "-": case "sub": res.c = res.a - res.b; break; case "*": case "mul": res.c = res.a * res.b; break; case "/": case "div": if (res.b == 0) { return "400 Divide by Zero"; } else { res.c = res.a / res.b; } break; default: return "400 Invalid Operator"; } return res; };
    Python
    import json def lambda_handler(event, context): print(event) try: (event['a']) and (event['b']) and (event['op']) except KeyError: return '400 Invalid Input' try: res = { "a": float( event['a']), "b": float( event['b']), "op": event['op']} except ValueError: return '400 Invalid Operand' if event['op'] == '+': res['c'] = res['a'] + res['b'] elif event['op'] == '-': res['c'] = res['a'] - res['b'] elif event['op'] == '*': res['c'] = res['a'] * res['b'] elif event['op'] == '/': if res['b'] == 0: return '400 Divide by Zero' else: res['c'] = res['a'] / res['b'] else: return '400 Invalid Operator' return res
  8. 在執行角色下,選擇選擇現有的角色

  9. 輸入您先前建立之lambda_invoke_function_assume_apigw_role角色的角色。ARN

  10. 選擇 Deploy (部署)

此函數需要 a 輸入參數有兩個運算元 (bop) 和一個運算子 (event)。輸入是以下格式的JSON對象:

{ "a": "Number" | "String", "b": "Number" | "String", "op": "String" }

此函數會傳回計算的結果 (c) 和輸入。對於無效的輸入,該函數會傳回 null 值或「無效 op」字串做為結果。輸出格JSON式如下:

{ "a": "Number", "b": "Number", "op": "String", "c": "Number" | "String" }

您應該先在 Lambda 主控台中測試函數,然後再將其與下API一個步驟整合。

測試 Calc Lambda 函式

以下是在 Lambda 主控台測試 Calc 函數的方式:

  1. 選擇測試標籤。

  2. 針對測試事件名稱,輸入 calc2plus5

  3. 將測試事件定義取代為下列內容:

    { "a": "2", "b": "5", "op": "+" }
  4. 選擇 Save (儲存)。

  5. 選擇 Test (測試)

  6. 展開 Execution result: succeeded (執行結果:成功)。請查看下列事項:

    { "a": 2, "b": 5, "op": "+", "c": 7 }

創建一個 Calc API

下列程序顯示如何API為您剛建立的 Calc Lambda 函數建立。在後續幾節中,您會將資源和方法新增至其中。

若要建立 API
  1. https://console.aws.amazon.com/ap igateway 登入API閘道主控台。

  2. 如果這是您第一次使用 API Gateway,您會看到一個介紹服務功能的頁面。在下方 RESTAPI,選擇 [建置]。出現 [建立範例] API 快顯視窗時,選擇 [確定]

    如果這不是您第一次使用API閘道,請選擇 [建立] API。在下方 RESTAPI,選擇 [建置]。

  3. 對於API名稱,輸入LambdaCalc

  4. 描述,請輸入描述。

  5. 保持API端點類型設定為 [地區]。

  6. 選擇 [建立] API。

整合 1:建立 GET 方法與查詢參數搭配來呼叫 Lambda 函數

藉由建立將查詢字串參數傳遞至 Lambda 函數的GET方法,您可API以啟用從瀏覽器叫用的。這種方法可能很有用,特別APIs是對於允許開放訪問。

建立資源之後API,即可建立資源。通常情況下,API資源是根據應用程序邏輯在資源樹中組織的。在此步驟中,您會建立 /calc 資源。

建立 /calc 資源
  1. 選擇建立資源

  2. 代理資源保持關閉。

  3. 資源路徑保持為 /

  4. 針對資源名稱,輸入 calc

  5. 保持 CORS(跨源資源共享)關閉。

  6. 選擇建立資源

藉由建立將查詢字串參數傳遞至 Lambda 函數的GET方法,您可API以啟用從瀏覽器叫用的。這種方法可能很有用,特別APIs是對於允許開放訪問。

在此方法中,Lambda 需要使用 POST 請求來叫用任何 Lambda 函數。此範例顯示前端HTTP方法要求中的方法可能與後端中的整合要求不同。

建立 GET 方法
  1. 選取 /calc 資源,然後選擇建立方法

  2. 針對方法類型,選取 GET

  3. 針對整合類型,選取 AWS 服務

  4. 在中 AWS 區域,選取 AWS 區域 您建立 Lambda 函數的位置。

  5. 針對 AWS 服務,選取 Lambda

  6. AWS 子網域保持空白。

  7. 對於HTTP方法,選取POST

  8. 針對動作類型,選取使用路徑覆寫。此選項允許我們指定ARN的 Invoke 動作來執行我們的Calc功能。

  9. 針對路徑覆寫,輸入 2015-03-31/functions/arn:aws:lambda:us-east-2:account-id:function:Calc/invocations。對於 account-id,輸入您的 AWS 帳戶 ID。在中us-east-2,輸入 AWS 區域 您建立 Lambda 函數的位置。

  10. 對於執行角色,請輸入ARN的角色lambda_invoke_function_assume_apigw_role

  11. 請勿變更憑證快取預設逾時的設定。

  12. 選擇 [方法要求設定]

  13. 對於請求驗證程式,選取驗證查詢字串參數與標頭

    如果用戶端未指定所需參數,則此設定會造成系統傳回錯誤訊息。

  14. 選擇URL查詢字串參數

    現在,您可以在 /calc 資源上為方GET法設定查詢字串參數,以便它可以代表後端 Lambda 函數接收輸入。

    若要建立查詢字串參數,請執行下列動作:

    1. 選擇新增查詢字串

    2. 針對名稱,輸入 operand1

    3. 開啟必要

    4. 快取保持關閉。

    重複相同的步驟,並建立名為 operand2 的查詢字串和名為 operator 的查詢字串。

  15. 選擇建立方法

現在,請建立對應範本,以將用戶端提供的查詢字串翻譯為 Calc 函數所需的整合請求承載。此範本會將 M ethod 要求中宣告的三個查詢字串參數對應至JSON物件的指定屬性值,做為後端 Lambda 函數的輸入。轉換的JSON物件將包含為整合要求承載。

將輸入參數對應至整合請求
  1. 整合請求索引標籤上,於整合請求設定下,選擇編輯

  2. 針對請求內文傳遞,選取未定義範本時 (建議)

  3. 選擇對應範本

  4. 選擇新增對應範本

  5. 針對內容類型,輸入 application/json

  6. 針對範本內文,輸入下列程式碼:

    { "a": "$input.params('operand1')", "b": "$input.params('operand2')", "op": "$input.params('operator')" }
  7. 選擇 Save (儲存)。

您現在可以測試您的 GET 方法,確認它已正確設定,可以叫用 Lambda 函數。

測試 GET 方法
  1. 選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。

  2. 針對查詢字串,輸入 operand1=2&operand2=3&operator=+

  3. 選擇測試

    結果看起來會與下列類似:

    建立API內部API閘道作為 Lambda 代理伺服器

整合 2:建立含有JSON效負載的POST方法以呼叫 Lambda 函數

透過建立具有有JSON效負載的POST方法來呼叫 Lambda 函數,您可以進行設定,以便用戶端必須向要求主體中的後端函數提供必要的輸入。為了確保用戶端上傳正確的輸入資料,您將在承載上啟用請求驗證。

若要建立具有JSON承載的POST方法
  1. 選取 /calc 資源,然後選擇建立方法

  2. 針對方法類型,選取 POST

  3. 針對整合類型,選取 AWS 服務

  4. 在中 AWS 區域,選取 AWS 區域 您建立 Lambda 函數的位置。

  5. 針對 AWS 服務,選取 Lambda

  6. AWS 子網域保持空白。

  7. 對於HTTP方法,選取POST

  8. 針對動作類型,選取使用路徑覆寫。此選項允許我們指定ARN的 Invoke 動作來執行我們的Calc功能。

  9. 針對路徑覆寫,輸入 2015-03-31/functions/arn:aws:lambda:us-east-2:account-id:function:Calc/invocations。對於 account-id,輸入您的 AWS 帳戶 ID。在中us-east-2,輸入 AWS 區域 您建立 Lambda 函數的位置。

  10. 對於執行角色,請輸入ARN的角色lambda_invoke_function_assume_apigw_role

  11. 請勿變更憑證快取預設逾時的設定。

  12. 選擇建立方法

現在,請建立輸入模型來說明輸入資料結構,並驗證傳入請求內文。

建立輸入模型
  1. 在主導覽窗格中,選擇模型

  2. 選擇建立模型

  3. 針對名稱,輸入 input

  4. 針對內容類型,輸入 application/json

    如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入 $default

  5. 針對模型結構描述,輸入下列模型:

    { "type":"object", "properties":{ "a":{"type":"number"}, "b":{"type":"number"}, "op":{"type":"string"} }, "title":"input" }
  6. 選擇建立模型

您現在要建立輸出模型。此模型說明來自後端之計算輸出的資料結構。它可以用來將整合回應資料對應至不同模型。本教學依賴傳遞行為,而且不會使用此模型。

建立輸出模型
  1. 選擇建立模型

  2. 針對名稱,輸入 output

  3. 針對內容類型,輸入 application/json

    如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入 $default

  4. 針對模型結構描述,輸入下列模型:

    { "type":"object", "properties":{ "c":{"type":"number"} }, "title":"output" }
  5. 選擇建立模型

您現在會建立結果模型。此模型說明所傳回回應資料的資料結構。它會參考您中定義的輸入輸出結構描述API。

建立結果模型
  1. 選擇建立模型

  2. 針對名稱,輸入 result

  3. 針對內容類型,輸入 application/json

    如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入 $default

  4. 對於模型模式,輸入以下模型 restapi-id。 您的 restapi-id 在下列流程中,在控制台頂部的括號中列出:API Gateway > APIs > LambdaCalc (abc123).

    { "type":"object", "properties":{ "input":{ "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/input" }, "output":{ "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/output" } }, "title":"result" }
  5. 選擇建立模型

現在,您可以設定方法的方POST法要求,以便在傳入要求主體上啟用要求驗證。

若要在POST方法上啟用要求驗證
  1. 在主導覽窗格中,選擇資源,然後從資源樹狀目錄中選取 POST 方法。

  2. 方法請求索引標籤的方法請求設定下,選擇編輯

  3. 對於請求驗證程式,選取驗證內文

  4. 選擇請求內文,然後選擇新增模型

  5. 針對內容類型,輸入 application/json

    如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入 $default

  6. 針對模型,選取輸入

  7. 選擇 Save (儲存)。

您現在可以測試您的 POST 方法,確認它已正確設定,可以叫用 Lambda 函數。

測試 POST 方法
  1. 選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。

  2. 針對要求主體,輸入下列JSON承載。

    { "a": 1, "b": 2, "op": "+" }
  3. 選擇 測試

    您應該會看到下列輸出:

    { "a": 1, "b": 2, "op": "+", "c": 3 }

整合 3:建立 GET 方法與路徑參數搭配來呼叫 Lambda 函數

現在,您將在透過一系列路徑參數所指定的資源上建立 GET 方法,來呼叫後端 Lambda 函數。路徑參數值指定 Lambda 函數的輸入資料。您需要使用映射範本將傳入路徑參數值對應至所需的整合請求承載。

產生的API資源結構將如下所示:

建立API內部API閘道作為 Lambda 代理伺服器
建立 /{operand1}/{operand2}/{operator} 資源
  1. 選擇建立資源

  2. 針對資源路徑,選取 /calc

  3. 針對資源名稱,輸入 {operand1}

  4. 保持 CORS(跨源資源共享)關閉。

  5. 選擇建立資源

  6. 針對資源路徑,選取 /calc/{operand1}/

  7. 針對資源名稱,輸入 {operand2}

  8. 保持 CORS(跨源資源共享)關閉。

  9. 選擇建立資源

  10. 針對資源路徑,選取 /calc/{operand1}/{operand2}/

  11. 針對資源名稱,輸入 {operator}

  12. 保持 CORS(跨源資源共享)關閉。

  13. 選擇建立資源

這次您將使用API閘道主控台中的內建 Lambda 整合來設定方法整合。

設定方法整合
  1. 選取 /{operand1}/{operand2}/{operator} 資源,然後選擇建立方法

  2. 針對方法類型,選取 GET

  3. 針對整合類型,選取 Lambda

  4. Lambda 代理整合保持關閉。

  5. 對於 Lambda 函數,請選取 AWS 區域 您建立 Lambda 函數的位置,然後輸入Calc

  6. 預設逾時保持開啟。

  7. 選擇建立方法

現在,您可以建立對應範本,將建立 /calc/ {operand1}/{operand2}/{運算子} 資源時宣告的三個URL路徑參數對應至物件中的指定屬性值。JSON因為URL路徑必須經過URL編碼,因此除法運算子必須指定為%2F而非。/此範本會先將 %2F 翻譯為 '/',再將它傳遞給 Lambda 函數。

建立對應範本
  1. 整合請求索引標籤上,於整合請求設定下,選擇編輯

  2. 針對請求內文傳遞,選取未定義範本時 (建議)

  3. 選擇對應範本

  4. 針對內容類型,輸入 application/json

  5. 針對範本內文,輸入下列程式碼:

    { "a": "$input.params('operand1')", "b": "$input.params('operand2')", "op": #if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end }
  6. 選擇 Save (儲存)。

您現在可以測試您的 GET 方法,確認其已正確設定,可以叫用 Lambda 函數,並透過整合回應傳遞原始輸出,而不需要對應。

測試 GET 方法
  1. 選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。

  2. 對於路徑,執行下列動作:

    1. 對於 operand1,輸入 1

    2. 對於 operand2,輸入 1

    3. 對於運算子,輸入 +

  3. 選擇 Test (測試)

  4. 結果應如下所示:

    在API閘道主控台中測試GET方法。

接著,您將模型化 result 結構描述後面之方法回應承載的資料結構。

在預設情況下,方法回應內文會獲指派空白模型。這會造成傳遞整合回應內文,而不進行對應。但是,當您SDK為其中一種強式類型語言(例如 Java 或 Objective-C)生成一個時,您的SDK用戶將收到一個空對象作為結果。若要確保用戶REST端和用SDK戶端都能收到想要的結果,您必須使用預先定義的結構描述來建立回應資料的模型。在這裡,您將定義方法回應內文的模型,以及如何建構對應範本,將整合回應內文翻譯為方法回應內文。

建立方法回應
  1. 方法回應索引標籤上的回應 200 下,選擇編輯

  2. 請求內文下,選擇新增模型

  3. 針對內容類型,輸入 application/json

  4. 針對模型,選取結果

  5. 選擇 Save (儲存)。

為方法響應主體設置模型可確保響應數據將被轉換到給定的result對象中SDK。為了確保據此映射整合回應資料,您將需要映射範本。

建立對應範本
  1. 整合回應索引標籤上,於預設 - 回應下,選擇編輯

  2. 選擇對應範本

  3. 針對內容類型,輸入 application/json

  4. 針對範本內文,輸入下列程式碼:

    #set($inputRoot = $input.path('$')) { "input" : { "a" : $inputRoot.a, "b" : $inputRoot.b, "op" : "$inputRoot.op" }, "output" : { "c" : $inputRoot.c } }
  5. 選擇 Save (儲存)。

測試對應範本
  1. 選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。

  2. 對於路徑,執行下列動作:

    1. 對於 operand1,輸入 1

    2. 對於 operand2,輸入 2

    3. 對於運算子,輸入 +

  3. 選擇 測試

  4. 結果如下所示:

    { "input": { "a": 1, "b": 2, "op": "+" }, "output": { "c": 3 } }

此時,您只能呼叫API使用API閘道主控台中的 [測試] 功能。若要將其提供給用戶端,您需要部署API. API每當您新增、修改或刪除資源或方法、更新資料對應或更新階段設定時,請務必重新部署您的資源。否則,您的用戶端將無法使用新功能或更新API。如下所示:

部署 API
  1. 選擇部署API

  2. 針對階段,選取新階段

  3. 針對階段名稱,輸入 Prod

  4. 描述,請輸入描述。

  5. 選擇部署

  6. (選擇性) 在階段詳細資料下URL,對於叫用,您可以選擇複製圖示來複製您API的呼叫URL。您可以將其與郵差c 之類的工具一起使用URL來測試您的API.

注意

API每當您新增、修改或刪除資源或方法、更新資料對應或更新階段設定時,請務必重新部署您的資源。否則,您的用戶端將無法使用新功能或更新API。