本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:建立RESTAPI包含兩個 AWS 服務整合和一個 Lambda 非代理整合的計算器
專門教學課程:使RESTAPI用 Lambda 非代理整合建立使用Lambda Function
集成。 Lambda Function
整合是整合類型的特殊案例,可為您執行大部分整合設定,例如自動新增所需的以資源為基礎的權限以呼叫 Lambda 函數。AWS
Service
在這裡,三種整合中的兩種會使用 AWS Service
整合。在此整合類型中,您有更多控制權,但您需要手動執行工作,例如建立和指定包含適當權限的IAM角色。
在本教學課程中,您將建立 Calc
Lambda 函數,以實作基本的算術運算、接受和傳回JSON格式化的輸入和輸出。然後,您將以下列方式建立RESTAPI並將其與 Lambda 函數整合:
-
在
GET
資源上公開/calc
方法來叫用 Lambda 函數,並提供輸入做為查詢字串參數。(AWS Service
整合) -
在
POST
資源上公開/calc
方法來叫用 Lambda 函數,並在方法請求酬載中提供輸入。(AWS Service
整合) -
在巢狀
GET
資源上公開/calc/{operand1}/{operand2}/{operator}
來叫用 Lambda 函數,並提供輸入做為路徑參數 (Lambda Function
整合)
除了試用本自學課程之外,您可能還希望研究的開啟API定義檔案 Calc
API,您可以依照中的指示將其匯入 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色
-
登入 IAM 主控台。
-
選擇角色。
-
選擇 Create Role (建立角色)。
-
在選取可信任執行個體類型下,選取 AWS 服務。
-
在 Choose the service that will use this role (選擇將使用此角色的服務) 下,選擇 Lambda (Lambda)。
-
選擇 Next: Permissions (下一步:許可)。
-
選擇 Create Policy (建立政策)。
Create Policy (建立政策) 主控台將開啟新的時段。在該視窗中,執行下列作業:
-
在JSON標籤中,以下列項目取代現有策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
-
選擇 Review policy (檢閱政策)。
-
在 Review Policy (檢閱政策) 下,執行下列操作:
-
在 Name (名稱) 中輸入名稱,例如
lambda_execute
。 -
選擇 Create Policy (建立政策)。
-
-
-
在原本的 Create Role (建立角色) 主控台視窗中,執行下列動作:
-
在 Attach permissions policies (連接許可政策) 下方,從下拉式清單中選擇您的
lambda_execute
政策。如果您在清單中沒有看到您的政策,請選擇清單頂端的重新整理按鈕。(請不要重新整理瀏覽器頁面!)
-
選擇 Next: Add Tags (下一步:新增標籤)。
-
選擇 Next:Review (下一步:檢閱)。
-
在 Role name (角色名稱) 中輸入名稱,例如
lambda_invoke_function_assume_apigw_role
。 -
選擇 Create Role (建立角色)。
-
-
從角色清單中選擇您的
lambda_invoke_function_assume_apigw_role
。 -
選擇 Trust Relationships (信任關係) 標籤。
-
選擇 Edit trust relationship (編輯信任關係)。
-
用以下內容取代現有政策:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "apigateway.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
-
選擇 Update Trust Policy (更新信任政策)。
-
記下您剛建立ARN之角色的角色。以供稍後使用。
建立 Calc
Lambda 函數
接下來,您會使用 Lambda 主控台建立 Lambda 函數。
-
在 Lambda 主控台中,請選擇 Create function (建立函數)。
-
選擇 Author from Scratch (從頭開始撰寫)。
-
針對名稱,輸入
Calc
。 -
針對執行期,請選擇最新支援的 Node.js 或 Python 執行期。
對於所有其他選項,請使用預設設定。
-
選擇建立函數。
-
在 Lambda 主控台中,複製下列 Lambda 函數,並將其貼入程式碼編輯器。
-
在執行角色下,選擇選擇現有的角色。
-
輸入您先前建立之
lambda_invoke_function_assume_apigw_role
角色的角色。ARN -
選擇 Deploy (部署)。
此函數需要 a
輸入參數有兩個運算元 (b
和 op
) 和一個運算子 (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
函數的方式:
-
選擇測試標籤。
-
針對測試事件名稱,輸入
calc2plus5
。 -
將測試事件定義取代為下列內容:
{ "a": "2", "b": "5", "op": "+" }
-
選擇 Save (儲存)。
-
選擇 Test (測試)。
-
展開 Execution result: succeeded (執行結果:成功)。請查看下列事項:
{ "a": 2, "b": 5, "op": "+", "c": 7 }
創建一個 Calc
API
下列程序顯示如何API為您剛建立的 Calc
Lambda 函數建立。在後續幾節中,您會將資源和方法新增至其中。
若要建立 API
在 https://console.aws.amazon.com/ap
igateway 登入API閘道主控台。 -
如果這是您第一次使用 API Gateway,您會看到一個介紹服務功能的頁面。在下方 RESTAPI,選擇 [建置]。出現 [建立範例] API 快顯視窗時,選擇 [確定]。
如果這不是您第一次使用API閘道,請選擇 [建立] API。在下方 RESTAPI,選擇 [建置]。
對於API名稱,輸入
LambdaCalc
。在描述,請輸入描述。
保持API端點類型設定為 [地區]。
選擇 [建立] API。
整合 1:建立 GET
方法與查詢參數搭配來呼叫 Lambda 函數
藉由建立將查詢字串參數傳遞至 Lambda 函數的GET
方法,您可API以啟用從瀏覽器叫用的。這種方法可能很有用,特別APIs是對於允許開放訪問。
建立資源之後API,即可建立資源。通常情況下,API資源是根據應用程序邏輯在資源樹中組織的。在此步驟中,您會建立 /calc 資源。
建立 /calc 資源
選擇建立資源。
讓代理資源保持關閉。
將資源路徑保持為
/
。針對資源名稱,輸入
calc
。保持 CORS(跨源資源共享)關閉。
選擇建立資源。
藉由建立將查詢字串參數傳遞至 Lambda 函數的GET
方法,您可API以啟用從瀏覽器叫用的。這種方法可能很有用,特別APIs是對於允許開放訪問。
在此方法中,Lambda 需要使用 POST
請求來叫用任何 Lambda 函數。此範例顯示前端HTTP方法要求中的方法可能與後端中的整合要求不同。
建立 GET
方法
選取 /calc 資源,然後選擇建立方法。
針對方法類型,選取 GET。
針對整合類型,選取 AWS 服務。
在中 AWS 區域,選取 AWS 區域 您建立 Lambda 函數的位置。
針對 AWS 服務,選取 Lambda。
讓 AWS 子網域保持空白。
對於HTTP方法,選取POST。
針對動作類型,選取使用路徑覆寫。此選項允許我們指定ARN的 Invoke 動作來執行我們的
Calc
功能。針對路徑覆寫,輸入
2015-03-31/functions/arn:aws:lambda:
。對於us-east-2
:account-id
:function:Calc/invocationsaccount-id
,輸入 AWS 區域 您建立 Lambda 函數的位置。us-east-2
對於執行角色,請輸入ARN的角色
lambda_invoke_function_assume_apigw_role
。請勿變更憑證快取和預設逾時的設定。
選擇 [方法要求設定]。
對於請求驗證程式,選取驗證查詢字串參數與標頭。
如果用戶端未指定所需參數,則此設定會造成系統傳回錯誤訊息。
選擇URL查詢字串參數。
現在,您可以在 /calc 資源上為方GET法設定查詢字串參數,以便它可以代表後端 Lambda 函數接收輸入。
若要建立查詢字串參數,請執行下列動作:
選擇新增查詢字串。
針對名稱,輸入
operand1
。開啟必要。
讓快取保持關閉。
重複相同的步驟,並建立名為
operand2
的查詢字串和名為operator
的查詢字串。選擇建立方法。
現在,請建立對應範本,以將用戶端提供的查詢字串翻譯為 Calc
函數所需的整合請求承載。此範本會將 M ethod 要求中宣告的三個查詢字串參數對應至JSON物件的指定屬性值,做為後端 Lambda 函數的輸入。轉換的JSON物件將包含為整合要求承載。
將輸入參數對應至整合請求
在整合請求索引標籤上,於整合請求設定下,選擇編輯。
針對請求內文傳遞,選取未定義範本時 (建議)。
選擇對應範本。
選擇新增對應範本。
針對內容類型,輸入
application/json
。針對範本內文,輸入下列程式碼:
{ "a": "$input.params('operand1')", "b": "$input.params('operand2')", "op": "$input.params('operator')" }
選擇 Save (儲存)。
您現在可以測試您的 GET
方法,確認它已正確設定,可以叫用 Lambda 函數。
測試 GET
方法
-
選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。
針對查詢字串,輸入
operand1=2&operand2=3&operator=+
。-
選擇測試。
結果看起來會與下列類似:
整合 2:建立含有JSON效負載的POST
方法以呼叫 Lambda 函數
透過建立具有有JSON效負載的POST
方法來呼叫 Lambda 函數,您可以進行設定,以便用戶端必須向要求主體中的後端函數提供必要的輸入。為了確保用戶端上傳正確的輸入資料,您將在承載上啟用請求驗證。
若要建立具有JSON承載的POST
方法
選取 /calc 資源,然後選擇建立方法。
針對方法類型,選取 POST。
針對整合類型,選取 AWS 服務。
在中 AWS 區域,選取 AWS 區域 您建立 Lambda 函數的位置。
針對 AWS 服務,選取 Lambda。
讓 AWS 子網域保持空白。
對於HTTP方法,選取POST。
針對動作類型,選取使用路徑覆寫。此選項允許我們指定ARN的 Invoke 動作來執行我們的
Calc
功能。針對路徑覆寫,輸入
2015-03-31/functions/arn:aws:lambda:
。對於us-east-2
:account-id
:function:Calc/invocationsaccount-id
,輸入 AWS 區域 您建立 Lambda 函數的位置。us-east-2
對於執行角色,請輸入ARN的角色
lambda_invoke_function_assume_apigw_role
。請勿變更憑證快取和預設逾時的設定。
選擇建立方法。
現在,請建立輸入模型來說明輸入資料結構,並驗證傳入請求內文。
建立輸入模型
-
在主導覽窗格中,選擇模型。
-
選擇建立模型。
-
針對名稱,輸入
input
。 -
針對內容類型,輸入
application/json
。如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入
$default
。 -
針對模型結構描述,輸入下列模型:
{ "type":"object", "properties":{ "a":{"type":"number"}, "b":{"type":"number"}, "op":{"type":"string"} }, "title":"input" }
選擇建立模型。
您現在要建立輸出模型。此模型說明來自後端之計算輸出的資料結構。它可以用來將整合回應資料對應至不同模型。本教學依賴傳遞行為,而且不會使用此模型。
建立輸出模型
-
選擇建立模型。
-
針對名稱,輸入
output
。 -
針對內容類型,輸入
application/json
。如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入
$default
。 -
針對模型結構描述,輸入下列模型:
{ "type":"object", "properties":{ "c":{"type":"number"} }, "title":"output" }
選擇建立模型。
您現在會建立結果模型。此模型說明所傳回回應資料的資料結構。它會參考您中定義的輸入和輸出結構描述API。
建立結果模型
-
選擇建立模型。
-
針對名稱,輸入
result
。 -
針對內容類型,輸入
application/json
。如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入
$default
。 -
對於模型模式,輸入以下模型
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" } 選擇建立模型。
現在,您可以設定方法的方POST法要求,以便在傳入要求主體上啟用要求驗證。
若要在POST方法上啟用要求驗證
-
在主導覽窗格中,選擇資源,然後從資源樹狀目錄中選取
POST
方法。 -
在方法請求索引標籤的方法請求設定下,選擇編輯。
對於請求驗證程式,選取驗證內文。
選擇請求內文,然後選擇新增模型。
針對內容類型,輸入
application/json
。如果找不到相符的內容類型,則不會執行請求驗證。若要使用相同的模型,而不論內容類型為何,請輸入
$default
。針對模型,選取輸入。
選擇 Save (儲存)。
您現在可以測試您的 POST
方法,確認它已正確設定,可以叫用 Lambda 函數。
測試 POST
方法
-
選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。
針對要求主體,輸入下列JSON承載。
{ "a": 1, "b": 2, "op": "+" }
-
選擇 測試。
您應該會看到下列輸出:
{ "a": 1, "b": 2, "op": "+", "c": 3 }
整合 3:建立 GET
方法與路徑參數搭配來呼叫 Lambda 函數
現在,您將在透過一系列路徑參數所指定的資源上建立 GET
方法,來呼叫後端 Lambda 函數。路徑參數值指定 Lambda 函數的輸入資料。您需要使用映射範本將傳入路徑參數值對應至所需的整合請求承載。
產生的API資源結構將如下所示:
建立 /{operand1}/{operand2}/{operator} 資源
選擇建立資源。
針對資源路徑,選取
/calc
。針對資源名稱,輸入
{operand1}
。保持 CORS(跨源資源共享)關閉。
選擇建立資源。
針對資源路徑,選取
/calc/{operand1}/
。針對資源名稱,輸入
{operand2}
。保持 CORS(跨源資源共享)關閉。
選擇建立資源。
針對資源路徑,選取
/calc/{operand1}/{operand2}/
。針對資源名稱,輸入
{operator}
。保持 CORS(跨源資源共享)關閉。
選擇建立資源。
這次您將使用API閘道主控台中的內建 Lambda 整合來設定方法整合。
設定方法整合
選取 /{operand1}/{operand2}/{operator} 資源,然後選擇建立方法。
針對方法類型,選取 GET。
針對整合類型,選取 Lambda。
將 Lambda 代理整合保持關閉。
對於 Lambda 函數,請選取 AWS 區域 您建立 Lambda 函數的位置,然後輸入
Calc
。讓預設逾時保持開啟。
選擇建立方法。
現在,您可以建立對應範本,將建立 /calc/ {operand1}/{operand2}/{運算子} 資源時宣告的三個URL路徑參數對應至物件中的指定屬性值。JSON因為URL路徑必須經過URL編碼,因此除法運算子必須指定為%2F
而非。/
此範本會先將 %2F
翻譯為 '/'
,再將它傳遞給 Lambda 函數。
建立對應範本
在整合請求索引標籤上,於整合請求設定下,選擇編輯。
針對請求內文傳遞,選取未定義範本時 (建議)。
選擇對應範本。
針對內容類型,輸入
application/json
。針對範本內文,輸入下列程式碼:
{ "a": "$input.params('operand1')", "b": "$input.params('operand2')", "op": #if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end }
選擇 Save (儲存)。
您現在可以測試您的 GET
方法,確認其已正確設定,可以叫用 Lambda 函數,並透過整合回應傳遞原始輸出,而不需要對應。
測試 GET
方法
-
選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。
-
對於路徑,執行下列動作:
對於 operand1,輸入
1
。對於 operand2,輸入
1
。對於運算子,輸入
+
。
-
選擇 Test (測試)。
-
結果應如下所示:
接著,您將模型化 result
結構描述後面之方法回應承載的資料結構。
在預設情況下,方法回應內文會獲指派空白模型。這會造成傳遞整合回應內文,而不進行對應。但是,當您SDK為其中一種強式類型語言(例如 Java 或 Objective-C)生成一個時,您的SDK用戶將收到一個空對象作為結果。若要確保用戶REST端和用SDK戶端都能收到想要的結果,您必須使用預先定義的結構描述來建立回應資料的模型。在這裡,您將定義方法回應內文的模型,以及如何建構對應範本,將整合回應內文翻譯為方法回應內文。
建立方法回應
-
在方法回應索引標籤上的回應 200 下,選擇編輯。
-
在請求內文下,選擇新增模型。
-
針對內容類型,輸入
application/json
。 -
針對模型,選取結果。
-
選擇 Save (儲存)。
為方法響應主體設置模型可確保響應數據將被轉換到給定的result
對象中SDK。為了確保據此映射整合回應資料,您將需要映射範本。
建立對應範本
在整合回應索引標籤上,於預設 - 回應下,選擇編輯。
選擇對應範本。
針對內容類型,輸入
application/json
。針對範本內文,輸入下列程式碼:
#set($inputRoot = $input.path('$')) { "input" : { "a" : $inputRoot.a, "b" : $inputRoot.b, "op" : "$inputRoot.op" }, "output" : { "c" : $inputRoot.c } }
選擇 Save (儲存)。
測試對應範本
-
選擇測試標籤。您可能需要選擇向右箭頭按鈕才能顯示此索引標籤。
-
對於路徑,執行下列動作:
對於 operand1,輸入
1
。對於 operand2,輸入
2
。對於運算子,輸入
+
。
-
選擇 測試。
-
結果如下所示:
{ "input": { "a": 1, "b": 2, "op": "+" }, "output": { "c": 3 } }
此時,您只能呼叫API使用API閘道主控台中的 [測試] 功能。若要將其提供給用戶端,您需要部署API. API每當您新增、修改或刪除資源或方法、更新資料對應或更新階段設定時,請務必重新部署您的資源。否則,您的用戶端將無法使用新功能或更新API。如下所示:
部署 API
注意
API每當您新增、修改或刪除資源或方法、更新資料對應或更新階段設定時,請務必重新部署您的資源。否則,您的用戶端將無法使用新功能或更新API。