返回文章列表

CloudWatch 指標警示與日誌過濾器設定

本文介紹如何使用 Amazon CloudWatch 建立指標和警示,以及如何利用 AWS CLI 和管理控制檯設定日誌指標過濾器,並示範如何啟用 API Gateway 的 CORS 支援,讓不同網域的網頁應用程式可以存取 API。

雲端服務 監控

CloudWatch 作為 AWS 的監控服務,提供豐富的指標和警示功能,能有效監控系統執行狀態並及時發現異常。透過 AWS CLI 可以更有效率地建立和管理 CloudWatch 警示,並針對特定指標設定閾值和通知方式。此外,CloudWatch 也支援日誌指標過濾器,能將日誌事件轉換成可監控的指標,進一步提升監控的精細度。對於需要跨網域存取的 API,啟用 CORS 是不可或缺的步驟,本文也示範瞭如何在 API Gateway 中設定 CORS,確保不同來源的網頁應用程式都能正常使用 API。

使用 Amazon CloudWatch 進行監控和警示 Chapter 8

CloudWatch 警示狀態解析

在 Amazon CloudWatch 中,警示(Alarm)可能處於以下三種狀態之一:

  1. OK:表示警示未被觸發,系統執行正常。
  2. ALARM:表示警示已被觸發,系統出現異常。
  3. INSUFFICIENT_DATA:表示沒有足夠的資料來確定警示狀態,例如在指定的時間段內沒有資料。剛建立的警示也可能短暫處於此狀態。

當警示建立後立即進入 INSUFFICIENT_DATA 狀態時,會顯示 StateReason 為 “Unchecked: Initial alarm creation”。如果警示曾經處於 OKALARM 狀態,後因評估期間內資料不足而進入 INSUFFICIENT_DATA 狀態,則 StateReason 會顯示為 “Insufficient Data: 1 datapoint was unknown”。

建立具有維度的 CloudWatch 警示(AWS CLI)

在本文中,我們將學習如何為具有維度的指標建立 CloudWatch 警示,並透過傳送帶有維度的資料來驗證警示。

準備工作

  1. 具備有效的 AWS 帳戶。
  2. 可以存取 AWS 管理控制檯。
  3. 已經按照「Your First Lambda with AWS CLI」配方組態了 AWS CLI。
  4. 已經建立了一個名為 FailedLogins 且名稱空間為 ServerlessProgrammingCookbook 的指標。
  5. 已經建立了一個帶有電子郵件訂閱的 SNS 主題。

操作步驟

  1. 建立具有維度的警示
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 主題。
  1. 檢查警示狀態
aws cloudwatch describe-alarms \
--alarm-names FailedRequestsAlarm \
--region us-east-1 \
--profile admin

內容解密:

  • --alarm-names:指定要查詢的警示名稱。
  • 如果在建立警示後立即查詢或未在指定週期內傳送任何資料,則狀態將顯示為 INSUFFICIENT_DATA
  1. 傳送帶有維度的資料
aws cloudwatch put-metric-data \
--namespace 'ServerlessProgrammingCookbook' \
--metric-name 'FailedLogins' \
--value 1 \
--dimensions Device=Laptop \
--region us-east-1 \
--profile admin

內容解密:

  • --dimensions:指定傳送資料的維度,與建立警示時的維度一致。
  1. 檢查警示狀態變化

在傳送資料後,使用 describe-alarms 命令檢查警示狀態。如果平均值超過閾值,警示狀態將變為 ALARM,並觸發設定的動作,例如傳送電子郵件通知。

重點解析

  • 在建立具有維度的警示時,必須正確指定維度名稱和值,否則資料將被傳送到不同的維度,警示將保持在 INSUFFICIENT_DATA 狀態。
  • 指標名稱和維度名稱及值是區分大小寫的。

使用 CloudWatch 日誌指標過濾器

我們可以使用日誌過濾器定義日誌中的搜尋模式,將日誌轉換為指標,並使用這些指標觸發警示。

準備工作

  1. 有效的 AWS 帳戶。
  2. 可以存取 AWS 管理控制檯。
  3. 已組態 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:

  1. 點選側邊欄的 Metrics
  2. 選擇 Metrics with no dimensions,此時應可看到新建立的 HelloCountMetric

使用控制檯建立指標篩選器

  1. 登入 AWS 控制檯,導航至 CloudWatch。
  2. 點選側邊欄的 Logs,選擇一個日誌群組。
  3. 點選 Create Metric Filter,進入定義篩選器頁面。
  4. 輸入篩選模式(例如 Hello),選擇一個日誌串流,點選 Test Pattern
  5. 點選 Assign Metric,輸入篩選器名稱、指標名稱空間和指標名稱。
  6. 點選 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。

準備工作

  1. 一個可用的 AWS 帳戶
  2. 已組態的 AWS CLI,如第 1 章「Your first Lambda with the AWS CLI」配方中所述
  3. 已按照第 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
  4. 熟悉 CodePen 或任何根據瀏覽器的工具,可以從中向我們的 API 傳送 JavaScript 請求

使用 CodePen 連線到我們的 API

  1. 前往 https://codepen.io
  2. 點選「Create」標籤,然後選擇「Pen」選項
  3. 點選「Settings」選單,選擇「Behavior」標籤,並取消勾選「Auto-Updating Preview」選項。這將使我們能夠執行程式碼
  4. 在 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

建立步驟

  1. 建立一個 API:
aws apigateway create-rest-api \
    --name 'API WITH CORS' \
    --region us-east-1 \
    --profile admin
  1. 取得根資源路徑的 ID:
aws apigateway get-resources \
    --rest-api-id xenqybowjg
  1. 在根路徑下建立一個名為 greeting 的資源:
aws apigateway create-resource \
    --rest-api-id xenqybowjg \
    --parent-id p8yd8xde55 \
    --path-part greeting
  1. 建立一個帶有路徑引數的子資源,可以接受一個字串:
aws apigateway create-resource \
    --rest-api-id xenqybowjg \
    --parent-id xkjhh7 \
    --path-part "{name}"
  1. 建立 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.json
      
      put-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 admin
      
      response-template-get.json 的內容如下:
      {"application/json": "Hello $input.params('name')"}
      
      put-method-integration-get.json 的內容如下:
      {
          "method.response.header.Access-Control-Allow-Origin": "'*'"
      }
      
  2. 建立 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.json
      
      put-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
      }
      

內容解密:

  1. 建立 API 和資源:首先,我們使用 AWS CLI 建立了一個新的 API 和相關資源,包括根資源下的 greeting 資源和帶有路徑引數的子資源。
  2. 設定 GET 方法:接著,我們為子資源設定了 GET 方法,包括建立方法、設定方法回應、設定整合和整合回應。在這個過程中,我們使用了 MOCK 整合型別來模擬回應,並在回應中包含了 CORS 相關的標頭。
  3. 設定 OPTIONS 方法:為了支援 CORS,我們還需要設定 OPTIONS 方法。同樣地,我們建立了 OPTIONS 方法並設定了其回應引數,以允許跨來源請求。
  4. CORS 設定:在設定 CORS 時,我們在 put-method-responseput-integration-response 中指定了相關的標頭,如 Access-Control-Allow-Origin,以允許來自任何來源的請求。
  5. 測試 API:最後,我們可以使用 CodePen 或其他工具測試我們的 API,驗證 CORS 是否正確啟用。

程式碼邏輯與架構分析

本章節展示瞭如何使用 AWS CLI 建立一個啟用 CORS 的 API Gateway,並使用 CodePen 進行測試。關鍵步驟包括建立 API 和資源、設定 GET 和 OPTIONS 方法,以及正確組態 CORS 相關的標頭。這些步驟確保了我們的 API 可以被不同來源的網頁應用程式安全地存取。