AWS CloudWatch 監控與告警設定

CloudWatch 簡介

Amazon CloudWatch 是 AWS 提供的監控和可觀測性服務,讓您能夠收集和追蹤指標、收集和監控日誌檔案,以及設定告警。CloudWatch 可以監控 AWS 資源(如 EC2 執行個體、DynamoDB 資料表和 RDS 資料庫執行個體),也可以監控您應用程式和服務產生的自訂指標。

主要功能

  • 指標收集:自動收集 AWS 服務的指標資料
  • 日誌管理:集中儲存和分析日誌資料
  • 告警機制:根據閾值觸發通知或自動化動作
  • 儀表板:視覺化呈現監控資料
  • 事件規則:回應系統狀態變化

指標與日誌

指標(Metrics)

CloudWatch 指標是代表一組按時間排序的資料點。您可以將其視為要監控的變數,而資料點則代表該變數隨時間的值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 使用 AWS CLI 列出可用的指標
aws cloudwatch list-metrics --namespace AWS/EC2

# 取得特定指標的統計資料
aws cloudwatch get-metric-statistics \
    --namespace AWS/EC2 \
    --metric-name CPUUtilization \
    --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
    --start-time 2023-09-01T00:00:00Z \
    --end-time 2023-09-01T23:59:59Z \
    --period 3600 \
    --statistics Average

常用 EC2 指標

指標名稱說明
CPUUtilizationCPU 使用率百分比
NetworkIn接收的網路流量(位元組)
NetworkOut傳送的網路流量(位元組)
DiskReadOps磁碟讀取操作次數
DiskWriteOps磁碟寫入操作次數
StatusCheckFailed狀態檢查失敗次數

日誌(Logs)

CloudWatch Logs 可讓您集中管理來自所有系統、應用程式和 AWS 服務的日誌。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 建立日誌群組
aws logs create-log-group --log-group-name my-application-logs

# 建立日誌串流
aws logs create-log-stream \
    --log-group-name my-application-logs \
    --log-stream-name web-server-01

# 設定日誌保留期限(天數)
aws logs put-retention-policy \
    --log-group-name my-application-logs \
    --retention-in-days 30

安裝 CloudWatch Agent

若要收集自訂指標和系統層級的日誌,需要安裝 CloudWatch Agent:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 下載並安裝 CloudWatch Agent(Amazon Linux 2)
sudo yum install amazon-cloudwatch-agent -y

# 啟動設定精靈
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

# 啟動 Agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
    -a fetch-config \
    -m ec2 \
    -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \
    -s

建立告警

CloudWatch 告警可在指標超過您定義的閾值時執行動作。告警可以發送通知到 SNS 主題、執行 Auto Scaling 動作,或觸發 Lambda 函數。

告警狀態

  • OK:指標在定義的閾值內
  • ALARM:指標超出定義的閾值
  • INSUFFICIENT_DATA:資料不足以判斷狀態

建立 CPU 使用率告警

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 建立 SNS 主題用於告警通知
aws sns create-topic --name cloudwatch-alerts

# 訂閱電子郵件通知
aws sns subscribe \
    --topic-arn arn:aws:sns:ap-northeast-1:123456789012:cloudwatch-alerts \
    --protocol email \
    --notification-endpoint your-email@example.com

# 建立 CPU 使用率告警
aws cloudwatch put-metric-alarm \
    --alarm-name "High-CPU-Utilization" \
    --alarm-description "當 CPU 使用率超過 80% 時發送告警" \
    --metric-name CPUUtilization \
    --namespace AWS/EC2 \
    --statistic Average \
    --period 300 \
    --threshold 80 \
    --comparison-operator GreaterThanThreshold \
    --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
    --evaluation-periods 2 \
    --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:cloudwatch-alerts \
    --unit Percent

建立複合告警

複合告警可以結合多個告警的狀態:

1
2
3
4
5
aws cloudwatch put-composite-alarm \
    --alarm-name "Critical-System-Alarm" \
    --alarm-rule "ALARM(High-CPU-Utilization) AND ALARM(High-Memory-Usage)" \
    --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:critical-alerts \
    --alarm-description "當 CPU 和記憶體同時過高時觸發"

儀表板設定

CloudWatch 儀表板提供可自訂的首頁,讓您在單一檢視中監控資源。

使用 AWS CLI 建立儀表板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
aws cloudwatch put-dashboard \
    --dashboard-name "MyApplicationDashboard" \
    --dashboard-body '{
        "widgets": [
            {
                "type": "metric",
                "x": 0,
                "y": 0,
                "width": 12,
                "height": 6,
                "properties": {
                    "metrics": [
                        ["AWS/EC2", "CPUUtilization", "InstanceId", "i-1234567890abcdef0"]
                    ],
                    "period": 300,
                    "stat": "Average",
                    "region": "ap-northeast-1",
                    "title": "EC2 CPU 使用率"
                }
            },
            {
                "type": "metric",
                "x": 12,
                "y": 0,
                "width": 12,
                "height": 6,
                "properties": {
                    "metrics": [
                        ["AWS/EC2", "NetworkIn", "InstanceId", "i-1234567890abcdef0"],
                        [".", "NetworkOut", ".", "."]
                    ],
                    "period": 300,
                    "stat": "Sum",
                    "region": "ap-northeast-1",
                    "title": "網路流量"
                }
            }
        ]
    }'

儀表板 Widget 類型

Widget 類型說明
metric顯示指標資料的圖表
text顯示 Markdown 格式的文字
log顯示日誌查詢結果
alarm顯示告警狀態
explorer動態探索資源指標

與其他服務整合

與 SNS 整合

透過 SNS 發送告警通知到多個端點:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 建立 SNS 主題
aws sns create-topic --name cloudwatch-notifications

# 新增多種訂閱方式
# Email 訂閱
aws sns subscribe \
    --topic-arn arn:aws:sns:ap-northeast-1:123456789012:cloudwatch-notifications \
    --protocol email \
    --notification-endpoint admin@example.com

# SMS 訂閱
aws sns subscribe \
    --topic-arn arn:aws:sns:ap-northeast-1:123456789012:cloudwatch-notifications \
    --protocol sms \
    --notification-endpoint +886912345678

與 Lambda 整合

使用 Lambda 執行自動化回應:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# lambda_function.py
import json
import boto3

def lambda_handler(event, context):
    # 解析 CloudWatch 告警事件
    message = json.loads(event['Records'][0]['Sns']['Message'])
    alarm_name = message['AlarmName']
    new_state = message['NewStateValue']

    # 根據告警狀態執行動作
    if new_state == 'ALARM':
        # 執行修復動作,例如重啟執行個體
        ec2 = boto3.client('ec2')
        instance_id = message['Trigger']['Dimensions'][0]['value']
        ec2.reboot_instances(InstanceIds=[instance_id])

        return {
            'statusCode': 200,
            'body': f'已重啟執行個體 {instance_id}'
        }

    return {
        'statusCode': 200,
        'body': '無需執行動作'
    }

與 Auto Scaling 整合

根據 CloudWatch 指標自動調整資源:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 建立擴展策略
aws autoscaling put-scaling-policy \
    --auto-scaling-group-name my-asg \
    --policy-name scale-out-policy \
    --policy-type TargetTrackingScaling \
    --target-tracking-configuration '{
        "TargetValue": 70.0,
        "PredefinedMetricSpecification": {
            "PredefinedMetricType": "ASGAverageCPUUtilization"
        }
    }'

與 EventBridge 整合

使用 EventBridge 規則回應 CloudWatch 事件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 建立規則:當 EC2 執行個體狀態變更時觸發
aws events put-rule \
    --name "EC2StateChangeRule" \
    --event-pattern '{
        "source": ["aws.ec2"],
        "detail-type": ["EC2 Instance State-change Notification"],
        "detail": {
            "state": ["stopped", "terminated"]
        }
    }'

# 新增 Lambda 目標
aws events put-targets \
    --rule "EC2StateChangeRule" \
    --targets "Id"="1","Arn"="arn:aws:lambda:ap-northeast-1:123456789012:function:HandleEC2StateChange"

最佳實踐

  1. 設定適當的告警閾值:避免過於敏感導致告警疲勞
  2. 使用維度過濾:針對特定資源設定監控
  3. 建立分層儀表板:概覽層級和詳細層級的儀表板
  4. 設定日誌保留政策:平衡成本和合規需求
  5. 使用 Metric Math:組合多個指標進行進階分析
  6. 啟用跨帳戶監控:集中管理多帳戶環境

結論

AWS CloudWatch 是建構可靠雲端應用程式的關鍵服務。透過適當的監控策略、告警設定和自動化回應,您可以確保應用程式的高可用性和效能。建議從基本的指標監控開始,逐步擴展到日誌分析和自動化運維。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy