CloudWatch 作為 AWS 的監控服務,提供豐富的指標和警示功能,能有效監控系統執行狀態並及時發現異常。透過 AWS CLI 可以更有效率地建立和管理 CloudWatch 警示,並針對特定指標設定閾值和通知方式。此外,CloudWatch 也支援日誌指標過濾器,能將日誌事件轉換成可監控的指標,進一步提升監控的精細度。對於需要跨網域存取的 API,啟用 CORS 是不可或缺的步驟,本文也示範瞭如何在 API Gateway 中設定 CORS,確保不同來源的網頁應用程式都能正常使用 API。
使用 Amazon CloudWatch 進行監控和警示 Chapter 8
CloudWatch 警示狀態解析
在 Amazon CloudWatch 中,警示(Alarm)可能處於以下三種狀態之一:
- OK:表示警示未被觸發,系統執行正常。
- ALARM:表示警示已被觸發,系統出現異常。
- INSUFFICIENT_DATA:表示沒有足夠的資料來確定警示狀態,例如在指定的時間段內沒有資料。剛建立的警示也可能短暫處於此狀態。
當警示建立後立即進入 INSUFFICIENT_DATA 狀態時,會顯示 StateReason 為 “Unchecked: Initial alarm creation”。如果警示曾經處於 OK 或 ALARM 狀態,後因評估期間內資料不足而進入 INSUFFICIENT_DATA 狀態,則 StateReason 會顯示為 “Insufficient Data: 1 datapoint was unknown”。
建立具有維度的 CloudWatch 警示(AWS CLI)
在本文中,我們將學習如何為具有維度的指標建立 CloudWatch 警示,並透過傳送帶有維度的資料來驗證警示。
準備工作
- 具備有效的 AWS 帳戶。
- 可以存取 AWS 管理控制檯。
- 已經按照「Your First Lambda with AWS CLI」配方組態了 AWS CLI。
- 已經建立了一個名為
FailedLogins且名稱空間為ServerlessProgrammingCookbook的指標。 - 已經建立了一個帶有電子郵件訂閱的 SNS 主題。
操作步驟
- 建立具有維度的警示
aws cloudwatch put-metric-alarm \
--alarm-name FailedRequestsAlarmWithDimensions \
--alarm-description 'Alarm for failed login requests' \
--metric-name 'FailedLogins' \
--namespace 'ServerlessProgrammingCookbook' \
--statistic 'Average' \
--period 60 \
--threshold 5 \
--comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1 \
--dimensions Name=Device,Value=Laptop \
--alarm-actions arn:aws:sns:us-east-1:<account id>:my-first-sns-topic \
--region us-east-1 \
--profile admin
內容解密:
--alarm-name:指定警示名稱為FailedRequestsAlarmWithDimensions。--metric-name和--namespace:指定要監控的指標名稱和名稱空間。--statistic和--period:指定統計方法和評估週期。--threshold和--comparison-operator:設定閾值和比較運算子。--dimensions:指定維度名稱和值,用於區分不同的指標例項。--alarm-actions:指定當警示觸發時要執行的動作,例如傳送通知到 SNS 主題。
- 檢查警示狀態
aws cloudwatch describe-alarms \
--alarm-names FailedRequestsAlarm \
--region us-east-1 \
--profile admin
內容解密:
--alarm-names:指定要查詢的警示名稱。- 如果在建立警示後立即查詢或未在指定週期內傳送任何資料,則狀態將顯示為 INSUFFICIENT_DATA。
- 傳送帶有維度的資料
aws cloudwatch put-metric-data \
--namespace 'ServerlessProgrammingCookbook' \
--metric-name 'FailedLogins' \
--value 1 \
--dimensions Device=Laptop \
--region us-east-1 \
--profile admin
內容解密:
--dimensions:指定傳送資料的維度,與建立警示時的維度一致。
- 檢查警示狀態變化
在傳送資料後,使用 describe-alarms 命令檢查警示狀態。如果平均值超過閾值,警示狀態將變為 ALARM,並觸發設定的動作,例如傳送電子郵件通知。
重點解析
- 在建立具有維度的警示時,必須正確指定維度名稱和值,否則資料將被傳送到不同的維度,警示將保持在 INSUFFICIENT_DATA 狀態。
- 指標名稱和維度名稱及值是區分大小寫的。
使用 CloudWatch 日誌指標過濾器
我們可以使用日誌過濾器定義日誌中的搜尋模式,將日誌轉換為指標,並使用這些指標觸發警示。
準備工作
- 有效的 AWS 帳戶。
- 可以存取 AWS 管理控制檯。
- 已組態 AWS CLI 並建立了 Lambda 函式
demo-lambda-with-cli。
使用 Amazon CloudWatch 進行監控和警示設定
建立指標篩選器
在無伺服器架構中,監控應用程式的執行狀態至關重要。Amazon CloudWatch 提供了一套完整的監控和警示機制。本篇將介紹如何使用 AWS CLI 和管理控制檯建立指標篩選器。
使用 AWS CLI 建立指標篩選器
首先,我們需要準備指標轉換的 JSON 檔案,範例如下:
[
{
"metricName": "HelloCountMetric",
"metricNamespace": "ServerlessProgrammingCookbook",
"metricValue": "1"
}
]
將上述內容儲存至 metric-transformations.json 檔案中。
接著,使用 put-metric-filter 命令建立指標篩選器:
aws logs put-metric-filter \
--log-group-name /aws/lambda/demo-lambda-with-cli \
--filter-name 'HelloCountFilter' \
--filter-pattern 'Hello' \
--metric-transformations file://metric-transformations.json \
--region us-east-1 \
--profile admin
執行 Lambda 函式數次,以產生日誌資料:
aws lambda invoke \
--invocation-type RequestResponse \
--function-name demo-lambda-with-cli \
--log-type Tail \
--payload '{"name": "Heartin"}' \
--region us-east-1 \
--profile admin \
outputfile.txt
從控制檯驗證指標
登入 AWS 控制檯,導航至 CloudWatch:
- 點選側邊欄的 Metrics。
- 選擇 Metrics with no dimensions,此時應可看到新建立的
HelloCountMetric。
使用控制檯建立指標篩選器
- 登入 AWS 控制檯,導航至 CloudWatch。
- 點選側邊欄的 Logs,選擇一個日誌群組。
- 點選 Create Metric Filter,進入定義篩選器頁面。
- 輸入篩選模式(例如
Hello),選擇一個日誌串流,點選 Test Pattern。 - 點選 Assign Metric,輸入篩選器名稱、指標名稱空間和指標名稱。
- 點選 Create Filter 以完成建立。
#### 指標篩選器的工作原理
指標篩選器用於匹配日誌事件中的特定詞彙、短語或值。當匹配成功時,可以增加 CloudWatch 指標的值。例如,建立一個指標篩選器來計數 ERROR 詞彙的出現次數。
指標篩選器還可以從以空格分隔的日誌事件中提取數值,並根據實際數值增加指標值。此外,還可以使用條件運算元和萬用字元進行匹配。
無伺服器程式設計的最佳實踐與模式
本章節涵蓋了多項無伺服器程式設計的最佳實踐與架構模式,包括:
- 為 API Gateway 啟用 CORS,並使用 CodePen 進行測試。
- 使用 JavaScript SDK 實作和測試 Cognito 操作。
- 使用 Amazon Cognito 建立聯邦身份。
- 使用 AWS Certificate Manager (ACM) 建立 SSL 憑證。
- 使用 AWS 的 fan-in 和 fan-out 架構模式。
在前面的章節中,我們已經介紹了多種 AWS 服務。在本章中,我們將探討涉及這些服務的最佳實踐和模式。我們將使用 AWS CLI API 和 Java Lambda,並討論如何與 UI 元件互動的服務,如 API Gateway 和 Cognito。
啟用 API 的 CORS 支援並使用 CodePen 進行測試
CORS(跨來源資源分享)是一種機制,允許執行在一個網域(origin)上的網頁應用程式存取另一個不同伺服器上的特定資源。沒有 CORS 的情況下,伺服器會以 403 狀態碼回應。本章節將建立一個與第 2 章類別似的 API Gateway 服務,但會啟用 CORS。
熟悉 CodePen
首先,我們會熟悉 CodePen 網站,並使用 JavaScript SDK 程式碼從 CodePen 網站內呼叫我們的 API。這將複習第 2 章中學習的 API Gateway 概念,並額外支援 CORS。
準備工作
- 一個可用的 AWS 帳戶
- 已組態的 AWS CLI,如第 1 章「Your first Lambda with the AWS CLI」配方中所述
- 已按照第 2 章「Your first API using the AWS CLI」配方的步驟,建立並佈署了一個具有
https://<rest-api-id>.execute-api.us-east-1.amazonaws.com/dev/greeting/Heartin形式的 GET URL 的 API - 熟悉 CodePen 或任何根據瀏覽器的工具,可以從中向我們的 API 傳送 JavaScript 請求
使用 CodePen 連線到我們的 API
- 前往 https://codepen.io
- 點選「Create」標籤,然後選擇「Pen」選項
- 點選「Settings」選單,選擇「Behavior」標籤,並取消勾選「Auto-Updating Preview」選項。這將使我們能夠執行程式碼
- 在 CodePen UI 的 JS 部分輸入以下程式碼,然後點選「Run」:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://8vqyyjelad.execute-api.us-east-1.amazonaws.com/dev/greeting/Heartin');
xhr.onreadystatechange = function (event) {
console.log(event.target.response);
}
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send();
我們應該在 CodePen UI 中收到一個空白的回應。但是,如果我們開啟瀏覽器的開發者工具(例如 Chrome 開發者工具),我們應該會看到實際的錯誤訊息。
建立一個啟用 CORS 的 API
建立步驟
- 建立一個 API:
aws apigateway create-rest-api \
--name 'API WITH CORS' \
--region us-east-1 \
--profile admin
- 取得根資源路徑的 ID:
aws apigateway get-resources \
--rest-api-id xenqybowjg
- 在根路徑下建立一個名為
greeting的資源:
aws apigateway create-resource \
--rest-api-id xenqybowjg \
--parent-id p8yd8xde55 \
--path-part greeting
- 建立一個帶有路徑引數的子資源,可以接受一個字串:
aws apigateway create-resource \
--rest-api-id xenqybowjg \
--parent-id xkjhh7 \
--path-part "{name}"
建立 GET 方法:
- 執行
put-method以建立 GET 方法:aws apigateway put-method \ --rest-api-id xenqybowjg \ --resource-id sfgfk6 \ --http-method GET \ --authorization-type "NONE" - 執行
put-method-response以設定 GET 方法的回應:aws apigateway put-method-response \ --rest-api-id xenqybowjg \ --resource-id sfgfk6 \ --http-method GET \ --status-code 200 \ --response-parameters file://put-method-response-get.jsonput-method-response-get.json的內容如下:{ "method.response.header.Access-Control-Allow-Origin": false } - 執行
put-integration以設定 GET 方法的整合:aws apigateway put-integration \ --rest-api-id xenqybowjg \ --resource-id sfgfk6 \ --http-method GET \ --type MOCK \ --integration-http-method GET \ --request-templates "{\"application/json\": \"{\"statusCode\": \"200\"}\"}" - 執行
put-integration-response以設定 GET 方法的整合回應:aws apigateway put-integration-response \ --rest-api-id xenqybowjg \ --resource-id sfgfk6 \ --http-method GET \ --status-code 200 \ --response-templates file://response-template-get.json \ --response-parameters file://put-method-integration-get.json \ --selection-pattern "" \ --region us-east-1 --profile adminresponse-template-get.json的內容如下:{"application/json": "Hello $input.params('name')"}put-method-integration-get.json的內容如下:{ "method.response.header.Access-Control-Allow-Origin": "'*'" }
- 執行
建立 OPTIONS 方法:
- 執行
put-method以建立 OPTIONS 方法:aws apigateway put-method \ --rest-api-id xenqybowjg \ --resource-id sfgfk6 \ --http-method OPTIONS \ --authorization-type "NONE" - 執行
put-method-response以設定 OPTIONS 方法的回應:aws apigateway put-method-response \ --rest-api-id xenqybowjg \ --resource-id sfgfk6 \ --http-method OPTIONS \ --status-code 200 \ --response-parameters file://put-method-options.jsonput-method-options.json的內容如下:{ "method.response.header.Access-Control-Allow-Origin": false, "method.response.header.Access-Control-Allow-Headers": false, "method.response.header.Access-Control-Allow-Methods": false }
- 執行
內容解密:
- 建立 API 和資源:首先,我們使用 AWS CLI 建立了一個新的 API 和相關資源,包括根資源下的
greeting資源和帶有路徑引數的子資源。 - 設定 GET 方法:接著,我們為子資源設定了 GET 方法,包括建立方法、設定方法回應、設定整合和整合回應。在這個過程中,我們使用了 MOCK 整合型別來模擬回應,並在回應中包含了 CORS 相關的標頭。
- 設定 OPTIONS 方法:為了支援 CORS,我們還需要設定 OPTIONS 方法。同樣地,我們建立了 OPTIONS 方法並設定了其回應引數,以允許跨來源請求。
- CORS 設定:在設定 CORS 時,我們在
put-method-response和put-integration-response中指定了相關的標頭,如Access-Control-Allow-Origin,以允許來自任何來源的請求。 - 測試 API:最後,我們可以使用 CodePen 或其他工具測試我們的 API,驗證 CORS 是否正確啟用。
程式碼邏輯與架構分析
本章節展示瞭如何使用 AWS CLI 建立一個啟用 CORS 的 API Gateway,並使用 CodePen 進行測試。關鍵步驟包括建立 API 和資源、設定 GET 和 OPTIONS 方法,以及正確組態 CORS 相關的標頭。這些步驟確保了我們的 API 可以被不同來源的網頁應用程式安全地存取。