在無伺服器架構中,AWS Lambda 與 API Gateway 的整合至關重要。本文首先介紹如何使用 Guice 進行依賴注入,並利用 JUnit 和 Mockito 進行單元測試,確保 Lambda 函式的穩定性。接著,我們將引導讀者使用 Serverless 框架簡化 Lambda 函式的佈署流程,並探討 Serverless 框架如何與 CloudFormation 協同工作,自動化資源組態。最後,我們將深入講解如何使用 AWS CLI 建置 REST API,包含建立資源、設定 HTTP 方法、定義整合與回應,以及佈署至 API Gateway 的完整步驟。
使用 AWS 進行無伺服器運算的起步 Chapter 1
依賴注入與單元測試的實作
在前面的章節中,我們已經建立了一個簡單的 Lambda 函式。在本章節中,我們將進一步探討如何使用 Guice 進行依賴注入,以及如何使用 JUnit 和 Mockito 進行單元測試。
首先,我們建立了一個靜態的 Injector 類別,並使用 Guice 設定類別進行初始化。我們新增了一個預設建構函式,以便 Guice 可以注入這個類別。使用 Objects.requireNonNull 驗證實作是否成功注入,並使用 Java 的 @Inject 註解標記 Guice 需要注入的依賴。
新增 Maven 依賴
要進行單元測試,我們需要新增 JUnit 和 Mockito 的 Maven 依賴:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.21.0</version>
<scope>test</scope>
</dependency>
編寫單元測試
接下來,我們建立一個簡單的測試類別來檢查 Lambda Handler 的服務實作是否被正確注入:
package tech.heartin.books.serverlesscookbook;
import org.junit.Test;
public class MyLambdaHandlerTest {
@Test
public void testDependencies() throws Exception {
MyLambdaHandler testHandler = new MyLambdaHandler();
}
}
我們還建立了一個測試類別,使用 Mockito 來模擬 AWS 的呼叫:
@RunWith(MockitoJUnitRunner.class)
public class IAMServiceImplTest {
@Mock
private AmazonIdentityManagement iamClient;
private IAMService service;
@Before
public void setUp() {
service = new IAMServiceImpl(iamClient);
Objects.requireNonNull(service);
}
// 實際的測試方法未在此展示
}
測試方法的實作
我們新增了測試方法來檢查建立使用者、檢查使用者和刪除使用者的功能:
@Test
public void testCreateUser() {
IAMOperationResponse expectedResponse = new IAMOperationResponse("Created user test_user", null);
when(iamClient.createUser(any())).thenReturn(new CreateUserResult().withUser(new User().withUserName("test_user")));
IAMOperationResponse actualResponse = service.createUser("test_user");
Assert.assertEquals(expectedResponse, actualResponse);
}
@Test
public void testCheckUser() {
IAMOperationResponse expectedResponse = new IAMOperationResponse("User test_user exist", null);
when(iamClient.listUsers(any())).thenReturn(getListUsersResult());
IAMOperationResponse actualResponse = service.checkUser("test_user");
Assert.assertEquals(expectedResponse, actualResponse);
}
@Test
public void testDeleteUser() {
IAMOperationResponse expectedResponse = new IAMOperationResponse("Deleted user test_user", null);
when(iamClient.deleteUser(any())).thenReturn(new DeleteUserResult());
IAMOperationResponse actualResponse = service.deleteUser("test_user");
Assert.assertEquals(expectedResponse, actualResponse);
}
封裝、佈署和驗證
要封裝、佈署和驗證 Lambda 函式,請參考「使用 AWS SDK、Amazon CloudFormation 和 AWS CLI 與 Lambda」配方,並呼叫 Lambda 函式進行驗證。
使用 Serverless 框架建立第一個 Lambda 函式
Serverless 是一個開源的命令列工具框架,用於建立和佈署無伺服器應用程式。Serverless 支援多個雲端供應商,如 Amazon Web Services、Microsoft Azure、IBM OpenWhisk、Google Cloud Platform 等。
安裝 Serverless 框架
要使用 Serverless 框架,首先需要安裝 Node.js 和 AWS CLI。可以參考「使用 AWS CLI 佈署和呼叫 Lambda」配方來安裝 AWS CLI。可以使用 Node.js 的套件管理器來安裝 Node.js。
建立 Serverless 使用者
需要在 AWS 中建立一個 Serverless 使用者,通常會建立一個名為 serverless-admin 的使用者,並授予管理員許可權。
使用 Serverless 建立 Lambda 函式
安裝 Serverless 後,可以使用以下命令建立一個簡單的 Lambda 函式:
npm install -g serverless
serverless config credentials --provider aws --key <access key> --secret <secret access key> --profile serverless-admin
sls create --template aws-java-maven --path hello-world-java-maven
這將建立一個名為 hello-world-java-maven 的資料夾,其中包含 pom.xml 和 serverless.yml 檔案,以及 src 資料夾。
#### 內容解密:
此段落介紹如何使用 Serverless 框架建立第一個 Lambda 函式。Serverless 是一個開源的命令列工具框架,用於建立和佈署無伺服器應用程式。首先,需要安裝 Node.js 和 AWS CLI,然後建立一個 Serverless 使用者。接著,使用 Serverless 命令列工具建立一個簡單的 Lambda 函式。過程中會產生相關的設定檔和程式碼,方便開發者快速開始無伺服器應用的開發。
使用 AWS 開始無伺服器運算 Chapter 1
正如你所見,Serverless 建立的遠遠不止一個簡單的 hello world。Serverless 幫我們處理了大部分手動操作,包括建立角色、設定記憶體、設定超時等等。
在 serverless.yml 中新增使用者組態檔案和區域(區域是可選的,如果你使用預設區域)
首先,使用以下命令構建 jar 檔案:
mvn clean package
然後,將 jar 檔案佈署到 AWS:
sls deploy -v
你可以登入 AWS 控制檯並驗證新的 Lambda 服務。從日誌陳述式中,你可以看到 Serverless 框架在內部使用了 CloudFormation。你也可以從 AWS 管理控制檯驗證這一點。
使用 sls 呼叫函式:
sls invoke -f hello -l
選項 -f 指定了函式名稱,而 -l 指定了需要將日誌列印到終端。需要呼叫的函式名稱是 hello,並且可以在 serverless.yml 檔案中找到。你可以在終端上看到輸出和日誌。
從 CLI 檢查日誌:
sls logs -f hello -t
選項 -f 指定了函式名稱,而 -t 表示跟隨日誌。你現在可以從另一個終端執行呼叫命令,並檢視正在列印的日誌。
清理所有內容:
sls remove
登入 AWS 管理控制檯並驗證所有內容是否已清理乾淨。
它是如何工作的…
Serverless 框架在內部使用 AWS CloudFormation 來組態 AWS 資源。你可以登入管理控制檯,進入 CloudFormation 服務,選擇名為 hello-world-java-maven-dev 的堆積疊,然後點選 Template 標籤以檢視完整的 CloudFormation 範本。
你可以進一步點選「在設計器中檢視/編輯範本」選項,以視覺化的方式檢視範本。Serverless 框架為我們的示例建立的 CloudFormation 範本的設計器檢視如下所示:
還有更多…
Serverless 框架是 serverless.com Serverless 平台的一部分。Serverless 平台的其他兩個元件是 Serverless 儀錶板和事件閘道器。Serverless 框架還與其他流程和工具(如 CI 和 CD)整合良好。
參見
https://serverless.com/framework/docs。
使用 API Gateway 建立無伺服器 REST APIs Chapter 2
本章將涵蓋以下主題:
- 使用 AWS CLI 建立第一個 API
- 使用 Amazon CloudFormation 建立第一個 API
- 建立具有 Lambda 整合的第一個 API
- 建立和測試第一個 POST API 方法
- 使用對映範本對映請求和回應
- 使用模型驗證請求負載
- 使用 Lambda 和具有代理整合的 APIs
簡介
應用程式程式設計介面(API)是一組允許我們透過程式設計方式存取某個元件的方法。API 可以為不同的層(如 Web(http/rest)、資料函式庫和作業系統層等)構建。代表性狀態轉移(REST)API 是一種使用 REST 原則和 HTTP 協定來構建 Web API 的 API,可以透過網路(如 Internet)被客戶端以程式設計方式使用。
Amazon API Gateway 是 AWS 中用於構建無伺服器、可擴充套件和安全的 REST APIs 的主要服務。它充當應用程式和外部世界之間的閘道器。你只需為 API 呼叫和傳輸的資料付費,而不必維護伺服器。它還提供對測試、授權、API 版本管理、佈署以及維護和監控 REST APIs 的支援。
Amazon API Gateway 通常與 AWS Lambda 一起使用,以構建無伺服器應用程式。在本章中,我們將討論 API 閘道器的一些核心使用案例,例如建立、佈署和測試與 AWS Lambda 相互作用的 APIs。其他使用案例(如安全性和與使用者介面的整合)將在後續章節中討論。我們還將討論 REST 原則和 HTTP 要點。
使用 AWS CLI 建立第一個 API
在本配方中,我們將使用 CLI 命令建立一個具有模擬整合的簡單 REST API。我們將指定一個名為「name」的路徑引數,API 將向該人員問候。在下一個配方中,我們將使用 CloudFormation 範本建立 API。從那時起,我們將主要關注使用 CloudFormation 範本,但我們將首先討論相應的 CLI 命令,因為它們可以幫助我們更好地理解範本。
如何做…
我們將使用 CLI 命令建立我們的第一個具有 API 閘道器的 REST API。請記住在每個命令中用自己的 ID(rest-api-id、parent-id 等)替換各種 ID,如前一步的結果所示。正如你在下一個配方中將看到的,使用 CloudFormation 範本時,我們不必像使用 CLI 命令那樣手動指定 ID。
在 us-east-1 區域建立一個 REST API,如下所示:
aws apigateway create-rest-api \
--name 'API Gateway Hello World' \
內容解密:
aws apigateway create-rest-api:此命令用於在 AWS 上建立一個新的 REST API。--name 'API Gateway Hello World':此選項指定了新建立的 REST API 的名稱。- 在
us-east-1區域執行此命令表示該 API 將在該特定區域建立。
本章節介紹瞭如何使用 AWS CLI 和 Serverless 框架來建立和管理無伺服器應用程式,包括建立 REST API 和 Lambda 函式,並展示瞭如何透過 CLI 命令和組態檔案(如 serverless.yml)進行佈署和管理。同時,也提到了 Serverless 框架如何利用 AWS CloudFormation 來進行資源組態。
使用 API Gateway 建置無伺服器 REST APIs:第 2 章重點整理與實作解析
在現代雲端運算架構中,無伺服器(Serverless)技術已成為開發者建置可擴充套件且經濟高效應用程式的熱門選擇。其中,AWS API Gateway 是實作無伺服器 RESTful APIs 的關鍵服務。本篇文章將探討如何透過 AWS CLI 指令來設定 API Gateway,建置一個簡單的 REST API,並對相關指令進行詳細解析。
1. 建立 REST API 與資源設定
首先,我們需要建立一個新的 REST API,並設定相關資源。以下指令展示瞭如何使用 AWS CLI 完成這項任務:
aws apigateway create-rest-api \
--name 'GreetingAPI' \
--region us-east-1 \
--profile admin
取得回應中的 rest-api-id,並用於後續指令中。
內容解密:
create-rest-api:建立新的 REST API。--name:指定 API 名稱。--region:選擇 AWS 區域。--profile:指定使用的 AWS 組態檔。
接著,取得根資源(/)的 ID:
aws apigateway get-resources \
--rest-api-id c82tpsb7ka \
--region us-east-1 \
--profile admin
內容解密:
get-resources:取得指定 REST API 的資源列表。--rest-api-id:指定要查詢的 REST API ID。
2. 建立子資源與路徑引數
在根資源下建立子資源 greeting,並在其下建立路徑引數 {name}:
aws apigateway create-resource \
--rest-api-id c82tpsb7ka \
--region us-east-1 \
--parent-id rosgmsjlb5 \
--path-part greeting \
--profile admin
aws apigateway create-resource \
--rest-api-id c82tpsb7ka \
--region us-east-1 \
--parent-id oaslzo \
--path-part '{name}' \
--profile admin
內容解密:
create-resource:在指定的父資源下建立子資源。--parent-id:指定父資源的 ID。--path-part:定義子資源的路徑部分。
3. 設定 HTTP 方法與整合
為 {name} 資源新增 GET 方法,並設定 MOCK 整合:
aws apigateway put-method \
--rest-api-id c82tpsb7ka \
--resource-id lyb17y \
--http-method GET \
--authorization-type "NONE" \
--region us-east-1 \
--profile admin
aws apigateway put-integration \
--rest-api-id c82tpsb7ka \
--resource-id lyb17y \
--http-method GET \
--type MOCK \
--integration-http-method GET \
--request-templates '{ "application/json": "{\"statusCode\": 200}" }' \
--region us-east-1 \
--profile admin
內容解密:
put-method:為指定的資源設定 HTTP 方法。put-integration:設定該方法的整合型別,此處使用 MOCK。--request-templates:定義請求範本。
4. 設定回應與佈署
設定整合回應,並將 API 佈署到 dev 環境:
aws apigateway put-integration-response \
--rest-api-id c82tpsb7ka \
--resource-id lyb17y \
--http-method GET \
--status-code 200 \
--selection-pattern "" \
--response-templates '{"application/json": "{\"message\": \"Hello $input.params('"'"'name'"'"')\"}"}' \
--region us-east-1 \
--profile admin
aws apigateway create-deployment \
--rest-api-id c82tpsb7ka \
--region us-east-1 \
--stage-name dev \
--stage-description 'Dev stage' \
--description 'First deployment' \
--profile admin
內容解密:
put-integration-response:定義整合回應範本。create-deployment:將 API 佈署到指定的階段。
測試與驗證
完成佈署後,可以透過以下 URL 測試 API:
https://c82tpsb7ka.execute-api.us-east-1.amazonaws.com/dev/greeting/Heartin
預期會收到類別似以下的回應:
{
"message": "Hello Heartin"
}
Plantuml 圖示說明
@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2
title 無伺服器運算入門與 API 建置實踐
actor "客戶端" as client
participant "API Gateway" as gateway
participant "認證服務" as auth
participant "業務服務" as service
database "資料庫" as db
queue "訊息佇列" as mq
client -> gateway : HTTP 請求
gateway -> auth : 驗證 Token
auth --> gateway : 認證結果
alt 認證成功
gateway -> service : 轉發請求
service -> db : 查詢/更新資料
db --> service : 回傳結果
service -> mq : 發送事件
service --> gateway : 回應資料
gateway --> client : HTTP 200 OK
else 認證失敗
gateway --> client : HTTP 401 Unauthorized
end
@enduml此圖示展示了建置 REST API 的流程,從建立 API 到最終佈署的各個步驟之間的關聯。透過視覺化的呈現,可以更直觀地理解整個設定的流程與邏輯關係。