經過了漫長的雲端之旅,小李的餐廳帝國已經建立了完整的監控體系(CloudWatch)、安全防護(Inspector + GuardDuty + Security Hub),以及強大的 EKS 容器平台。整個數位基礎設施運行得井井有條。
但在這個過程中,小李和小張發現了許多 AWS 提供的「小而美」工具,它們可能不是系統的核心組件,但卻能讓日常運維工作變得更加輕鬆愉快。
「就像廚房裡的各種小工具一樣,」小李對小張說,「雖然不是主要設備,但有了它們,工作效率會大大提升。」
這是我們故事的最後一章,讓我們來看看這些讓雲端生活更美好的實用小工具...
2024年6月的一個週六早晨,小李正在家裡享受悠閒的週末時光,突然接到緊急電話:生產環境的某個服務需要緊急重啟。
「糟糕,我的筆電在辦公室,」小李看著手邊只有一台平板電腦,「難道要開車回公司嗎?」
小張在電話裡笑了:「不用,你有 CloudShell 啊!只要有瀏覽器就能操作 AWS。」
「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 都已經預裝好了,」小李驚喜地發現,「而且還自動配置好了我的權限。」
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
「太方便了!」小李感嘆,「以後出門在外也不用擔心無法處理緊急狀況了。」
有一天,小李需要登入一台 EC2 實例檢查日誌,但發現 SSH 金鑰不在手邊。
「以前我們都要管理一堆 SSH 金鑰,」小張說,「現在有了 Session Manager,再也不需要 SSH 金鑰了。」
「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:
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
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 金鑰管理的問題了。」
有一天,開發團隊反映無法連接到資料庫,但奇怪的是,有些服務可以連接,有些不行。
「這種網路問題最難排查了,」小李頭痛地說,「要檢查安全群組、NACL、路由表...」
「現在有更好的方法,」小張說,「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:
aws ec2 create-network-insights-path \
--source i-1234567890abcdef0 \
--destination i-0987654321fedcba0 \
--destination-port 3306 \
--protocol tcp
aws ec2 start-network-insights-analysis \
--network-insights-path-id nip-12345678
{
"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 就是為了這個而存在的,」小張說,「它記錄了所有的 AWS API 呼叫。」
「CloudTrail 就像數位世界的監視器,」小張解釋,「記錄誰在什麼時候做了什麼事情。」
CloudTrail 記錄的資訊:
案例一:安全群組被修改
小張示範如何使用 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 (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"]
}
}
「這樣設定後,只有高嚴重程度、關鍵服務、生產環境的告警才會發送簡訊,」小張說,「避免半夜被不重要的告警吵醒。」
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'
}
}
)
「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
「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."
}
]
}
「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"
]
}
]
}
「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. 合適的工具做合適的事
2. 工具之間的協作
「這些工具不是孤立存在的,」小張說,「它們可以完美協作:」
CloudTrail 記錄事件 → SNS 發送通知 → Lambda 自動處理 → Session Manager 遠端修復
3. 持續學習和探索
「AWS 不斷推出新工具,」小張說,「保持學習的心態很重要。」
小李總結了他的雲端工具使用心得:
1. 從小工具開始
「不要一開始就想建立複雜的系統,先熟悉這些小工具,它們會讓你的工作更輕鬆。」
2. 自動化是關鍵
「能自動化的就不要手動做,這些工具的真正威力在於自動化。」
3. 安全永遠是第一位
「不管使用什麼工具,都要考慮安全性。Session Manager 比 SSH 安全,CloudTrail 提供稽核能力。」
4. 成本意識
「雖然這些工具大多很便宜,但要養成成本意識,定期檢視使用量。」
5. 文件化和分享
「把使用經驗記錄下來,與團隊分享,讓大家都能受益。」
「從一家小麵店到全球連鎖企業,從單台伺服器到複雜的雲端架構,」小李回顧著這段旅程,「技術在變,但解決問題的思維沒變 - 選對工具,用對方法,持續改進。」
小張笑著說:「AWS 還會繼續推出新工具,我們的學習之旅也會繼續。但有了這些基礎,面對任何新挑戰都不會害怕。」
小李點點頭:「是啊,工具會過時,但學習的能力和解決問題的思維是永恆的。」
他們看著窗外的夕陽,知道明天又會有新的挑戰和新的工具等著他們去探索。
這些工具雖小,但威力無窮。掌握它們,你的雲端之旅將更加順暢愉快!