iT邦幫忙

2025 iThome 鐵人賽

DAY 30
1
Build on AWS

AWS 雲原生,學起來比泡咖啡還快系列 第 30

DAY30 - 小李的工具箱:那些讓雲端生活更美好的 AWS 小工具

  • 分享至 

  • xImage
  •  

前情提要

經過了漫長的雲端之旅,小李的餐廳帝國已經建立了完整的監控體系(CloudWatch)、安全防護(Inspector + GuardDuty + Security Hub),以及強大的 EKS 容器平台。整個數位基礎設施運行得井井有條。

但在這個過程中,小李和小張發現了許多 AWS 提供的「小而美」工具,它們可能不是系統的核心組件,但卻能讓日常運維工作變得更加輕鬆愉快。

「就像廚房裡的各種小工具一樣,」小李對小張說,「雖然不是主要設備,但有了它們,工作效率會大大提升。」

這是我們故事的最後一章,讓我們來看看這些讓雲端生活更美好的實用小工具...

第一章:CloudShell - 「隨身攜帶的雲端終端機」

那個忘記帶筆電的早晨

2024年6月的一個週六早晨,小李正在家裡享受悠閒的週末時光,突然接到緊急電話:生產環境的某個服務需要緊急重啟。

「糟糕,我的筆電在辦公室,」小李看著手邊只有一台平板電腦,「難道要開車回公司嗎?」

小張在電話裡笑了:「不用,你有 CloudShell 啊!只要有瀏覽器就能操作 AWS。」

什麼是 CloudShell?

「CloudShell 就像隨身攜帶的雲端終端機,」小張解釋,「不需要安裝任何軟體,直接在瀏覽器裡就能使用完整的 Linux 環境。」

小李打開 AWS Console,在右上角找到了 CloudShell 圖示,點擊後幾秒鐘就出現了一個熟悉的終端機介面。

[cloudshell-user@ip-10-0-123-456 ~]$ aws --version
aws-cli/2.13.25 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exe/x86_64.amzn.2

「哇!AWS CLI 都已經預裝好了,」小李驚喜地發現,「而且還自動配置好了我的權限。」

CloudShell 的貼心功能

1. 預裝工具齊全

# 檢查預裝的工具
[cloudshell-user@ip-10-0-123-456 ~]$ which aws
/usr/local/bin/aws

[cloudshell-user@ip-10-0-123-456 ~]$ which kubectl  
/usr/local/bin/kubectl


[cloudshell-user@ip-10-0-123-456 ~]$ python3 --version
Python 3.11.4

2. 持久化儲存空間
「你的 home 目錄有 1GB 的持久化儲存,」小張說,「檔案不會因為關閉瀏覽器而消失。」

[cloudshell-user@ip-10-0-123-456 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      1.0G   64M  937M   7% /home/cloudshell-user

3. 檔案上傳下載
小李發現可以直接在 CloudShell 中上傳和下載檔案,非常方便。

# 上傳本地檔案到 CloudShell
# 使用 Actions -> Upload file

# 下載 CloudShell 檔案到本地  
# 使用 Actions -> Download file

實際應用場景

場景一:緊急故障排除

# 快速檢查 EKS 集群狀態
[cloudshell-user@ip-10-0-123-456 ~]$ aws eks update-kubeconfig --name production-cluster

[cloudshell-user@ip-10-0-123-456 ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
default       payment-service-abc123     0/1     Error     3          5m
default       order-service-def456       1/1     Running   0          1h

# 重啟有問題的 Pod
[cloudshell-user@ip-10-0-123-456 ~]$ kubectl delete pod payment-service-abc123
pod "payment-service-abc123" deleted

場景二:快速腳本執行

# 建立一個快速修復腳本
[cloudshell-user@ip-10-0-123-456 ~]$ cat > fix-security-groups.sh << 'EOF'
#!/bin/bash
# 修復過於寬鬆的安全群組

aws ec2 describe-security-groups \
  --filters "Name=ip-permission.cidr,Values=0.0.0.0/0" \
  --query 'SecurityGroups[*].[GroupId,GroupName]' \
  --output table

echo "發現 $(aws ec2 describe-security-groups --filters "Name=ip-permission.cidr,Values=0.0.0.0/0" --query 'length(SecurityGroups)') 個過於寬鬆的安全群組"
EOF

[cloudshell-user@ip-10-0-123-456 ~]$ chmod +x fix-security-groups.sh
[cloudshell-user@ip-10-0-123-456 ~]$ ./fix-security-groups.sh

「太方便了!」小李感嘆,「以後出門在外也不用擔心無法處理緊急狀況了。」

第二章:Session Manager - 「安全的遠端連線管家」

SSH 金鑰的煩惱

有一天,小李需要登入一台 EC2 實例檢查日誌,但發現 SSH 金鑰不在手邊。

「以前我們都要管理一堆 SSH 金鑰,」小張說,「現在有了 Session Manager,再也不需要 SSH 金鑰了。」

什麼是 Session Manager?

「Session Manager 是 AWS Systems Manager 的一部分,」小張解釋,「它讓你可以安全地連線到 EC2 實例,不需要 SSH 金鑰、不需要開放 SSH 端口、不需要堡壘機。」

傳統 SSH 連線 vs Session Manager:

傳統 SSH 方式:
本地電腦 → 網際網路 → SSH (Port 22) → EC2 實例
需要:SSH 金鑰、開放端口、公網 IP

Session Manager 方式:
本地電腦 → AWS Console → Session Manager → EC2 實例  
需要:IAM 權限(就這樣!)

實際使用 Session Manager

小張示範如何使用 Session Manager:

1. 在 AWS Console 中連線
「進入 EC2 Console,選擇實例,點擊『Connect』,選擇『Session Manager』。」

幾秒鐘後,一個終端機視窗就出現了:

Starting session with SessionId: admin-0123456789abcdef0

sh-4.2$ whoami
ssm-user

sh-4.2$ sudo su -
[root@ip-10-0-1-123 ~]# 

2. 使用 AWS CLI 連線

# 從本地電腦直接連線
$ aws ssm start-session --target i-1234567890abcdef0

Starting session with SessionId: admin-0123456789abcdef0
sh-4.2$ 

3. 透過 CloudShell 連線

[cloudshell-user@ip-10-0-123-456 ~]$ aws ssm start-session --target i-1234567890abcdef0

Session Manager 的進階功能

1. 端口轉發
「最酷的功能是端口轉發,」小張說,「可以安全地存取內部服務。」

# 將遠端的 3306 端口(MySQL)轉發到本地 3306
$ aws ssm start-session \
  --target i-1234567890abcdef0 \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["3306"],"localPortNumber":["3306"]}'

# 現在可以用本地工具連接遠端資料庫
$ mysql -h localhost -P 3306 -u admin -p

實際應用場景

場景一:安全的資料庫維護

# 連線到私有子網路中的資料庫伺服器
$ aws ssm start-session --target i-database-server

# 執行資料庫維護腳本
sh-4.2$ sudo mysql -u root -p < /tmp/maintenance.sql

「Session Manager 真的改變了我們的運維方式,」小李說,「再也不用擔心 SSH 金鑰管理的問題了。」

第三章:VPC Reachability Analyzer - 「網路偵探工具」

神秘的連線問題

有一天,開發團隊反映無法連接到資料庫,但奇怪的是,有些服務可以連接,有些不行。

「這種網路問題最難排查了,」小李頭痛地說,「要檢查安全群組、NACL、路由表...」

「現在有更好的方法,」小張說,「VPC Reachability Analyzer 可以幫我們分析網路路徑。」

什麼是 VPC Reachability Analyzer?

「它就像網路偵探,」小張解釋,「可以分析兩個網路端點之間的完整路徑,告訴你為什麼連得通或連不通。」

分析範例:

來源:EC2 實例 i-web-server-123 (10.0.1.100)
目標:RDS 實例 db-prod-456 (10.0.2.200:3306)

分析結果:❌ 不可達

路徑分析:
1. ✅ 來源實例安全群組允許出站流量
2. ✅ 子網路 NACL 允許出站流量  
3. ✅ 路由表正確指向目標子網路
4. ✅ 目標子網路 NACL 允許入站流量
5. ❌ 目標 RDS 安全群組拒絕來源 IP

問題:RDS 安全群組沒有允許 Web 伺服器的安全群組
建議:在 RDS 安全群組中添加規則允許 sg-web-servers

實際使用場景

場景一:新服務無法連接資料庫
小張示範如何使用 Reachability Analyzer:

  1. 建立分析
aws ec2 create-network-insights-path \
  --source i-1234567890abcdef0 \
  --destination i-0987654321fedcba0 \
  --destination-port 3306 \
  --protocol tcp
  1. 執行分析
aws ec2 start-network-insights-analysis \
  --network-insights-path-id nip-12345678
  1. 查看結果
{
  "NetworkInsightsAnalysis": {
    "Status": "succeeded",
    "NetworkPathFound": false,
    "Explanations": [
      {
        "Direction": "ingress",
        "ExplanationCode": "SECURITY_GROUP_RULE_DENIED",
        "SecurityGroup": {
          "GroupId": "sg-database-123"
        },
        "Port": 3306
      }
    ]
  }
}

場景二:跨 VPC 連線問題

分析:VPC-A 中的應用無法連接到 VPC-B 中的服務

結果:
1. ✅ VPC Peering 連線存在
2. ✅ 路由表配置正確
3. ❌ VPC-B 的路由表缺少回程路由

解決方案:在 VPC-B 的路由表中添加指向 VPC-A 的路由

場景三:NAT Gateway 連線檢查

分析:私有子網路中的實例無法存取網際網路

路徑:EC2 實例 → NAT Gateway → Internet Gateway

結果:❌ 不可達
原因:私有子網路的路由表沒有指向 NAT Gateway

「這個工具太實用了,」小李說,「以前要花幾小時排查的網路問題,現在幾分鐘就能找到原因。」

第四章:CloudTrail - 「數位世界的監視器」

誰動了我的設定?

有一天早上,小李發現生產環境的某個安全群組規則被修改了,但沒有人承認做過這個變更。

「我們需要找出是誰在什麼時候做了這個變更,」小李說。

「CloudTrail 就是為了這個而存在的,」小張說,「它記錄了所有的 AWS API 呼叫。」

什麼是 CloudTrail?

「CloudTrail 就像數位世界的監視器,」小張解釋,「記錄誰在什麼時候做了什麼事情。」

CloudTrail 記錄的資訊:

  • 誰(使用者或角色)
  • 什麼時候(精確到秒)
  • 做了什麼(API 呼叫)
  • 從哪裡(IP 位址、User Agent)
  • 結果如何(成功或失敗)

實際調查案例

案例一:安全群組被修改
小張示範如何使用 CloudTrail 調查:

# 搜尋安全群組相關的事件
aws logs filter-log-events \
  --log-group-name CloudTrail/SecurityEvents \
  --filter-pattern "{ $.eventName = AuthorizeSecurityGroupIngress || $.eventName = RevokeSecurityGroupIngress }" \
  --start-time 1684800000000 \
  --end-time 1684886400000

調查結果:

{
  "eventTime": "2024-06-15T08:30:25Z",
  "eventName": "AuthorizeSecurityGroupIngress",
  "eventSource": "ec2.amazonaws.com",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDACKCEVSQ6C2EXAMPLE",
    "arn": "arn:aws:iam::123456789012:user/john.doe",
    "accountId": "123456789012",
    "userName": "john.doe"
  },
  "sourceIPAddress": "203.0.113.12",
  "userAgent": "aws-cli/2.1.34 Python/3.8.8",
  "requestParameters": {
    "groupId": "sg-1234567890abcdef0",
    "ipPermissions": {
      "items": [
        {
          "ipProtocol": "tcp",
          "fromPort": 22,
          "toPort": 22,
          "ipRanges": {
            "items": [
              {
                "cidrIp": "0.0.0.0/0"
              }
            ]
          }
        }
      ]
    }
  },
  "responseElements": {
    "requestId": "12345678-1234-1234-1234-123456789012",
    "return": true
  }
}

「找到了!」小李說,「是 john.doe 在早上 8:30 開放了 SSH 端口給所有 IP。」

第五章:SNS - 「雲端通知小幫手」

通知的重要性

「在我們的監控和安全系統中,SNS 扮演了重要角色,」小張說,「它負責把重要資訊及時通知給相關人員。」

什麼是 SNS?

「SNS (Simple Notification Service) 就像一個智能的通知中心,」小張解釋,「可以透過多種方式發送通知:郵件、簡訊、Slack、甚至觸發其他 AWS 服務。」

實際應用場景

場景一:多層次告警通知

{
  "TopicArn": "arn:aws:sns:us-east-1:123456789012:critical-alerts",
  "DisplayName": "Critical System Alerts",
  "Subscriptions": [
    {
      "Protocol": "email",
      "Endpoint": "admin@company.com"
    },
    {
      "Protocol": "sms", 
      "Endpoint": "+1234567890"
    },
    {
      "Protocol": "https",
      "Endpoint": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
    },
    {
      "Protocol": "lambda",
      "Endpoint": "arn:aws:lambda:us-east-1:123456789012:function:ProcessAlert"
    }
  ]
}

場景二:智能通知過濾

{
  "FilterPolicy": {
    "severity": ["HIGH", "CRITICAL"],
    "service": ["payment", "authentication"],
    "environment": ["production"]
  }
}

「這樣設定後,只有高嚴重程度、關鍵服務、生產環境的告警才會發送簡訊,」小張說,「避免半夜被不重要的告警吵醒。」

SNS 的進階功能

1. 訊息屬性和過濾

# 發送帶有屬性的訊息
import boto3

sns = boto3.client('sns')

response = sns.publish(
    TopicArn='arn:aws:sns:us-east-1:123456789012:alerts',
    Message='Database connection failed',
    MessageAttributes={
        'severity': {
            'DataType': 'String',
            'StringValue': 'HIGH'
        },
        'service': {
            'DataType': 'String', 
            'StringValue': 'database'
        },
        'environment': {
            'DataType': 'String',
            'StringValue': 'production'
        }
    }
)

第六章:其他實用小工具

AWS Config - 「配置變更追蹤器」

「Config 就像系統的『變更日記』,」小張說,「記錄所有資源配置的變化。」

實用查詢範例:

# 查詢 S3 儲存桶的配置歷史
aws configservice get-resource-config-history \
  --resource-type AWS::S3::Bucket \
  --resource-id my-important-bucket

# 查詢不合規的資源
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name s3-bucket-public-access-prohibited

AWS Personal Health Dashboard - 「個人健康助手」

「Personal Health Dashboard 會主動通知影響你資源的 AWS 服務問題,」小張說。

{
  "eventTypeCode": "AWS_EC2_INSTANCE_RETIREMENT_SCHEDULED",
  "eventTypeCategory": "scheduledChange",
  "region": "us-east-1",
  "startTime": "2024-07-01T00:00:00.000Z",
  "endTime": "2024-07-01T06:00:00.000Z",
  "lastUpdatedTime": "2024-06-15T10:30:00.000Z",
  "statusCode": "open",
  "eventDescription": [
    {
      "language": "en_US",
      "latestDescription": "Your EC2 instance i-1234567890abcdef0 is scheduled for retirement on July 1, 2024."
    }
  ]
}

AWS Trusted Advisor - 「雲端顧問」

「Trusted Advisor 就像一位經驗豐富的雲端顧問,」小張說,「會主動提供成本優化、安全、效能改善建議。」

建議範例:

{
  "checkId": "Qch7DwouX1",
  "checkName": "Low Utilization Amazon EC2 Instances",
  "status": "warning",
  "resourcesSummary": {
    "resourcesProcessed": 15,
    "resourcesFlagged": 3,
    "resourcesIgnored": 0,
    "resourcesSuppressed": 0
  },
  "flaggedResources": [
    {
      "resourceId": "i-1234567890abcdef0",
      "region": "us-east-1",
      "metadata": [
        "Instance Name: web-server-backup",
        "Instance Type: m5.large", 
        "Average CPU Utilization: 2.5%",
        "Estimated Monthly Savings: $45.60"
      ]
    }
  ]
}

AWS Cost Explorer - 「成本分析師」

「Cost Explorer 幫助我們了解和優化 AWS 支出,」小張說。

# 使用 Cost Explorer API 分析成本
import boto3
from datetime import datetime, timedelta

ce = boto3.client('ce')

# 查詢過去 30 天的成本
end_date = datetime.now().strftime('%Y-%m-%d')
start_date = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')

response = ce.get_cost_and_usage(
    TimePeriod={
        'Start': start_date,
        'End': end_date
    },
    Granularity='DAILY',
    Metrics=['BlendedCost'],
    GroupBy=[
        {
            'Type': 'DIMENSION',
            'Key': 'SERVICE'
        }
    ]
)

# 分析結果
for result in response['ResultsByTime']:
    date = result['TimePeriod']['Start']
    for group in result['Groups']:
        service = group['Keys'][0]
        cost = group['Metrics']['BlendedCost']['Amount']
        print(f"{date}: {service} = ${cost}")

結語:工具箱的智慧

小李的感悟

經過這麼長時間的雲端之旅,小李對著滿桌子的「虛擬工具」感慨萬千。

「你知道嗎?」小李對小張說,「剛開始我以為雲端就是把伺服器搬到網路上,現在才發現,雲端真正的價值在於這些智能工具。」

小張點頭:「沒錯,就像廚師的價值不只在於食材,更在於對工具的熟練運用。」

工具使用的哲學

1. 合適的工具做合適的事

  • CloudShell:緊急操作和快速腳本
  • Session Manager:安全的遠端存取
  • Reachability Analyzer:網路問題診斷
  • CloudTrail:安全稽核和調查
  • SNS:智能通知和自動化觸發

2. 工具之間的協作
「這些工具不是孤立存在的,」小張說,「它們可以完美協作:」

CloudTrail 記錄事件 → SNS 發送通知 → Lambda 自動處理 → Session Manager 遠端修復

3. 持續學習和探索
「AWS 不斷推出新工具,」小張說,「保持學習的心態很重要。」

給未來的建議

小李總結了他的雲端工具使用心得:

1. 從小工具開始
「不要一開始就想建立複雜的系統,先熟悉這些小工具,它們會讓你的工作更輕鬆。」

2. 自動化是關鍵
「能自動化的就不要手動做,這些工具的真正威力在於自動化。」

3. 安全永遠是第一位
「不管使用什麼工具,都要考慮安全性。Session Manager 比 SSH 安全,CloudTrail 提供稽核能力。」

4. 成本意識
「雖然這些工具大多很便宜,但要養成成本意識,定期檢視使用量。」

5. 文件化和分享
「把使用經驗記錄下來,與團隊分享,讓大家都能受益。」

最後的話

「從一家小麵店到全球連鎖企業,從單台伺服器到複雜的雲端架構,」小李回顧著這段旅程,「技術在變,但解決問題的思維沒變 - 選對工具,用對方法,持續改進。」

小張笑著說:「AWS 還會繼續推出新工具,我們的學習之旅也會繼續。但有了這些基礎,面對任何新挑戰都不會害怕。」

小李點點頭:「是啊,工具會過時,但學習的能力和解決問題的思維是永恆的。」

他們看著窗外的夕陽,知道明天又會有新的挑戰和新的工具等著他們去探索。


附錄:工具快速參考

CloudShell

  • 用途:瀏覽器中的 Linux 終端機
  • 優勢:免安裝、預配置、持久化儲存
  • 適用場景:緊急操作、快速腳本、學習實驗

Session Manager

  • 用途:安全的 EC2 遠端存取
  • 優勢:無需 SSH 金鑰、無需開放端口、完整稽核
  • 適用場景:伺服器維護、故障排除、安全存取

VPC Reachability Analyzer

  • 用途:網路連線問題診斷
  • 優勢:視覺化路徑分析、精確問題定位
  • 適用場景:網路故障排除、安全配置驗證

CloudTrail

  • 用途:AWS API 呼叫記錄和稽核
  • 優勢:完整的操作記錄、安全調查、合規稽核
  • 適用場景:安全事件調查、合規稽核、變更追蹤

SNS

  • 用途:多管道通知服務
  • 優勢:多種通知方式、智能過濾、自動化觸發
  • 適用場景:告警通知、工作流程觸發、跨服務通訊

這些工具雖小,但威力無窮。掌握它們,你的雲端之旅將更加順暢愉快!


上一篇
DAY29 - 小李的安全指揮中心:AWS Security Hub 統一管理平台
系列文
AWS 雲原生,學起來比泡咖啡還快30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言