在 Amazon ECS 上執行容器化應用程式時,有效地捕捉和管理日誌對於應用程式的監控、除錯和問題排查至關重要。透過 awslogs 驅動程式,可以將容器的標準輸出和標準錯誤輸出直接導向 CloudWatch Logs,方便集中管理和查詢。設定過程中,需要正確組態 IAM 角色以授予必要的許可權,並確保應用程式在容器內以 PID 1 執行。除了日誌管理,處理串流資料也是現代應用程式常見的需求。Amazon Kinesis 提供了強大的串流資料處理能力,可以即時擷取、處理和分析大量資料。利用 Kinesis Data Firehose,可以輕鬆地將串流資料傳送到 S3 等儲存服務,方便後續的批次處理和分析。理解分片、生產者和消費者等核心概念,以及 Kinesis 與其他 AWS 服務的整合方式,對於構建高效的串流資料架構至關重要。
在 Amazon ECS 上執行容器時捕捉日誌
6.8 使用 awslogs 驅動程式捕捉容器日誌
現在您已經有了 IAM 角色和 ECS 任務定義組態,您需要使用該組態建立 ECS 任務並關聯 IAM 角色:
aws ecs register-task-definition --execution-role-arn \
"arn:aws:iam::$AWS_ACCOUNT_ID:role/AWSCookbook608ECS" \
--cli-input-json file://taskdef.json
執行 ECS 任務
在您先前使用 AWS CDK 建立的 ECS 叢集上執行 ECS 任務:
aws ecs run-task --cluster $ECS_CLUSTER_NAME \
--launch-type FARGATE --network-configuration \
"awsvpcConfiguration={subnets=[$VPC_PUBLIC_SUBNETS],securityGroups=[$VPC_DEFAULT_SECURITY_GROUP],assignPublicIp=ENABLED}" \
--task-definition awscookbook608
驗證檢查
檢查任務狀態以確保任務正在執行。首先,找到任務的 Amazon 資源名稱(ARN):
TASK_ARNS=$(aws ecs list-tasks --cluster $ECS_CLUSTER_NAME \
--output text --query taskArns)
然後使用任務 ARN 以檢查 describe-tasks 命令輸出的 RUNNING 狀態:
aws ecs describe-tasks --cluster $ECS_CLUSTER_NAME --tasks $TASK_ARNS
檢視日誌
在任務達到 RUNNING 狀態後(大約 15 秒),使用以下命令檢視日誌:
aws logs describe-log-streams --log-group-name AWSCookbook608ECS
您應該會看到類別似以下的輸出:
{
"logStreams": [
{
"logStreamName": "LogStream/webserver/97635dab942e48d1bab11dbe88c8e5c3",
"creationTime": 1605584764184,
"firstEventTimestamp": 1605584765067,
"lastEventTimestamp": 1605584765067,
"lastIngestionTime": 1605584894363,
"uploadSequenceToken": "49612420096740389364147985468451499506623702081936625922",
"arn": "arn:aws:logs:us-east-1:111111111111:log-group:AWSCookbook608ECS:log-stream:LogStream/webserver/97635dab942e48d1bab11dbe88c8e5c3",
"storedBytes": 0
}
]
}
記下輸出的 logStreamName,然後執行 get-log-events 命令:
aws logs get-log-events --log-group-name AWSCookbook608ECS \
--log-stream-name <<logStreamName>>
日誌輸出範例
您應該會看到類別似以下的輸出:
{
"events": [
{
"timestamp": 1605590555566,
"message": "[Tue Nov 17 05:22:35.566054 2020] [mpm_event:notice] [pid 7:tid 140297116308608] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations",
"ingestionTime": 1605590559713
},
{
"timestamp": 1605590555566,
"message": "[Tue Nov 17 05:22:35.566213 2020] [core:notice] [pid 7:tid 140297116308608] AH00094: Command line: 'httpd -D FOREGROUND'",
"ingestionTime": 1605590559713
}
],
"nextForwardToken": "f/35805865872844590178623550035180924397996026459535048705",
"nextBackwardToken": "b/35805865872844590178623550035180924397996026459535048704"
}
清理
按照本章程式碼倉函式庫中本教程資料夾中的步驟進行清理。
討論
您使用了 awslogs 驅動程式和 IAM 角色,這使得執行的任務可以寫入 CloudWatch 日誌組。這是在 AWS 上處理容器時的常見模式,因為您很可能需要日誌輸出以進行故障排除和除錯您的應用程式。像 Copilot 這樣的工具可以處理這種組態,因為它是一種常見模式,但是當直接使用 Amazon ECS 時,例如定義和執行任務,開發人員需要了解這種組態。
PID 1 處理程式輸出到 /dev/stdout 和 /dev/stderr 被 awslogs 驅動程式捕捉。換句話說,容器中的第一個處理程式是唯一記錄到這些流的處理程式。請確保您希望檢視日誌的應用程式在容器內以 PID 1 執行。
為了使大多數 AWS 服務能夠相互通訊,您必須為它們分配一個角色,該角色允許所需的通訊許可權級別。在組態從容器 ECS 任務到 CloudWatch 的日誌記錄時也是如此;容器必須具有與其相關聯的角色,該角色允許透過 awslogs logConfiguration 驅動程式進行 CloudWatchLogs 操作。
相關的 IAM 策略範例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}
大資料簡介
第七章 大資料
資料有時被稱為“新的黃金”。隨著可用的資料科學工具不斷改進,許多公司每天都在以新的和令人興奮的方式利用資料。您現在可以使用現代分析工具快速挖掘大量的歷史資料以取得洞察力和模式。您可能還不知道需要針對資料執行哪些查詢和分析,但明天您可能會面臨一個挑戰,這個挑戰可以透過使用新的和新興的技術對歷史資料進行分析來支援。
隨著資料儲存成本的降低,許多組織和個人選擇保留資料而不是丟棄它,以便他們可以執行歷史分析以獲得業務洞察力,發現趨勢,訓練 AI/ML 模型,並為實施未來可以使用資料的技術做好準備。
除了您隨時間收集的資料量之外,您還以越來越快的速度收集更廣泛的資料型別和結構。想像一下,您可能會佈署 IoT 裝置來收集感測器資料,並且隨著您繼續佈署這些裝置,您需要一種方法以可擴充套件的方式捕捉和儲存資料。這可能是結構化、半結構化和非結構化的資料,其模式可能難以預測,因為新的資料來源被攝取。您需要工具來轉換和分析您的多樣化資料。
Francis Jayakumar 在 AWS re:Invent 2020 上發表了一篇資訊豐富且簡潔的演講,“AWS上的資料湖和分析簡介”,提供了 AWS 上大資料和分析的高階別介紹。我們本可以在本章中包含更多內容——足夠再寫一本文——但我們將重點介紹將資料傳送到 S3、發現 S3 上的資料以及轉換資料的基本配方,以給出在 AWS 上處理資料的示例。
使用 Kinesis 資料串流進行串流資料擷取
問題描述
您需要一種方法來擷取應用程式的串流資料。
解決方案
建立一個 Kinesis 資料串流,並使用 AWS CLI 將記錄放入串流中以驗證其運作,如圖 7-1 所示。
步驟
建立 Kinesis 資料串流:
aws kinesis create-stream --stream-name AWSCookbook701 --shard-count 1分片是理解 Kinesis 資料串流的重要概念,因為您需要擴充套件串流以處理更大的傳入串流資料。每個分片每秒最多可支援五次讀取交易,最大總資料讀取速率為每秒 2 MB。對於寫入,每個分片每秒最多可支援 1,000 筆記錄,最大總資料寫入速率為每秒 1 MB(包括分割鍵)。如果需要處理更多資料,您可以隨時重新分片您的串流。
確認串流處於 ACTIVE 狀態:
aws kinesis describe-stream-summary --stream-name AWSCookbook701您應該會看到類別似以下的輸出:
{ "StreamDescriptionSummary": { "StreamName": "AWSCookbook701", "StreamARN": "arn:aws:kinesis:us-east-1:111111111:stream/AWSCookbook701", "StreamStatus": "ACTIVE", "RetentionPeriodHours": 24, "StreamCreationTimestamp": "2021-10-12T17:12:06-04:00", "EnhancedMonitoring": [ { "ShardLevelMetrics": [] } ], "EncryptionType": "NONE", "OpenShardCount": 1, "ConsumerCount": 0 } }
驗證檢查
將記錄放入 Kinesis 資料串流:
aws kinesis put-record --stream-name AWSCookbook701 \ --partition-key 111 \ --cli-binary-format raw-in-base64-out \ --data='{"Data":"1"}'您應該會看到類別似以下的輸出:
{ "ShardId": "shardId-000000000000", "SequenceNumber": "49622914081337086513355510347442886426455090590105206786" }從 Kinesis 資料串流取得記錄。首先取得分片迭代器,然後執行
get-records命令:SHARD_ITERATOR=$(aws kinesis get-shard-iterator \ --shard-id shardId-000000000000 \ --shard-iterator-type TRIM_HORIZON \ --stream-name AWSCookbook701 \ --query 'ShardIterator' \ --output text) aws kinesis get-records --shard-iterator $SHARD_ITERATOR \ --query Records[0].Data --output text | base64 --decode您應該會看到類別似以下的輸出:
{"Data":"1"}
程式碼解密:
aws kinesis put-record命令的作用:將一筆記錄放入指定的 Kinesis 資料串流中。透過--stream-name指定串流名稱,--partition-key指定分割鍵,--data指定要放入的資料。aws kinesis get-records命令的作用:從 Kinesis 資料串流中取得記錄。首先需要透過aws kinesis get-shard-iterator取得分片迭代器,然後使用該迭代器取得記錄。base64 --decode的作用:由於放入 Kinesis 的資料是 base64 編碼的,因此在取得資料後需要進行解碼,以取得原始資料。
清理
按照本章節程式碼儲存函式庫中的資料夾中的步驟進行清理。
討論
串流資料可以來自多種來源。將記錄放入串流的來源稱為生產者,從串流中取得記錄的實體稱為消費者。在處理串流資料時,您正在處理即時資訊,可能需要立即對其進行處理或將其儲存以供稍後使用(參見配方 7.2)。一些常見的生產者範例包括即時金融市場資料、IoT 和感測器資料,以及來自網頁和行動應用程式的終端使用者點選流活動。
您可以在應用程式中使用 Kinesis 生產者函式庫(KPL)和 Kinesis 使用者端函式庫(KCL)來滿足您的特定需求。當從 Kinesis 資料串流中消費資料時,您可以設定應用程式從串流中讀取記錄並回應,直接從串流中呼叫 Lambda 函式,甚至直接在 Kinesis 服務中使用 Kinesis 資料分析應用程式(由 Apache Flink 提供支援)。
Kinesis 服務將自動擴充套件以滿足您的需求,但您需要注意配額和限制,以確保您的分片組態不會超出容量。
挑戰
自動觸發 Lambda 函式以處理傳入的 Kinesis 資料。
將串流資料透過 Amazon Kinesis Data Firehose 輸送到 Amazon S3
問題描述
您需要將傳入的串流資料傳送到物件儲存。
解決方案
建立一個 S3 值區,建立一個 Kinesis 資料串流,並組態 Kinesis Data Firehose 將串流資料傳送到 S3 值區。如圖 7-2 所示。
前提條件
- Kinesis 資料串流
- 包含 CSV 檔案的 S3 值區
準備步驟
按照本章節程式碼儲存函式庫中的資料夾中的步驟進行準備。
步驟
開啟 Kinesis Data Firehose 控制檯,點選「Create delivery stream」按鈕;選擇 Amazon Kinesis Data Streams 作為來源,Amazon S3 作為目的地,如圖 7-3 所示。
在來源設定中,選擇您在準備步驟中建立的 Kinesis 資料串流,如圖 7-4 所示。
將「Transform and convert records」選項保持預設值(Disabled)。在目的地設定中,瀏覽並選擇您在準備步驟中建立的 S3 值區,如圖 7-5 所示,並保持其他選項的預設值(停用分割和無字首)。
在進階設定部分,確認已選取「Create or update IAM role」。這將建立一個 IAM 角色,讓 Kinesis 可以存取串流和 S3 值區,如圖 7-6 所示。
驗證檢查
您可以從 Kinesis 控制檯測試傳送到串流的資料。點選左側導覽功能表中的「Delivery streams」連結,選擇您建立的串流,展開「Test with demo data」部分,然後點選「Start sending demo data」按鈕。這將開始向您的串流傳送範例資料,以便您驗證它是否已到達您的 S3 值區。如圖 7-7 所示。
圖表解說:
此圖示呈現了使用 Amazon Kinesis Data Firehose 將串流資料傳送到 Amazon S3 的流程。主要步驟包括建立 Kinesis 資料串流、組態 Kinesis Data Firehose,以及將資料傳送到 S3 值區。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
skinparam defaultTextAlignment center
title Kinesis Data Firehose 串流資料處理架構
package "資料來源" {
component [應用程式] as app
component [IoT 裝置] as iot
component [日誌生產者] as log
}
package "串流處理層" {
component [Kinesis Data Stream] as kds {
[Shard 1]
[Shard 2]
[Shard N]
}
component [Kinesis Data Firehose] as kdf {
[資料緩衝區]
[資料轉換]
[壓縮]
}
}
package "儲存與分析層" {
database [S3 Bucket] as s3 {
[原始資料]
[分析結果]
}
component [CloudWatch Logs] as cw
component [Athena 查詢] as athena
}
package "監控與管理" {
component [CloudWatch Metrics] as metrics
component [IAM 角色] as iam
}
app --> kds : 發送記錄
iot --> kds : 串流資料
log --> kds : 日誌事件
kds --> kdf : 讀取串流
kdf --> s3 : 批次寫入
kdf --> cw : 錯誤日誌
s3 --> athena : SQL 查詢
metrics ..> kds : 監控分片
metrics ..> kdf : 監控傳輸
iam ..> kdf : 授權存取
iam ..> s3 : 寫入權限
note right of kds
每個分片支援:
- 讀取: 5 次/秒, 2 MB/秒
- 寫入: 1000 筆/秒, 1 MB/秒
end note
note right of kdf
Firehose 功能:
- 自動批次處理
- 資料轉換 (Lambda)
- 壓縮 (GZIP, Snappy)
- 加密 (KMS)
end note
note bottom of s3
S3 儲存策略:
- 分區存儲(依時間)
- 生命週期管理
- 版本控制
end note
@enduml
圖表解密:
- Kinesis Data Stream:來源資料串流,負責接收和暫存即時資料。
- Kinesis Data Firehose:負責將資料從 Kinesis Data Stream 傳送到目的地 S3 Bucket。
- S3 Bucket:最終的資料儲存位置,用於儲存透過 Kinesis Data Firehose 傳送的資料。