AWS S3 雲存儲 是按照存儲容量,請求數,及網絡流量三個維度進行收費。而如果涉及到使用S3 對外提供SaaS服務,成本分佈及估算自然稱爲比較重要的需求。自然而言需要監控以上三個指標。
先上官網說明性文檔:
https://docs.amazonaws.cn/AmazonS3/latest/dev/monitoring-overview.html
1 監控指標
本人用到主要就是監控上訴存儲容量,請求數,及網絡流量 三個維度。而cloudwatch方式完全滿足需求
https://docs.amazonaws.cn/AmazonS3/latest/dev/cloudwatch-monitoring.html
這裏歸類一下本人用到的監控指標及相應限制
BucketSizeBytes (桶大小) |
此值通過彙總存儲桶中所有對象(當前對象和非當前對象)的大小計算得出,包括所有向存儲桶進行分段上傳而未完成的所有部分的大小。 |
---|---|
NumberOfObjects (桶對象總數) |
存儲桶中存儲的除 GLACIER 存儲類之外的所有存儲類的對象總量。 |
AllRequests (總請求數) |
向 Amazon S3 存儲桶提出的 HTTP 請求 (不論類型如何) 的總數 |
GetRequests (對象get請求數) |
向 Amazon S3 存儲桶中的對象提出的 HTTP GET 請求的數量 |
PutRequests (對象Put請求數) |
向 Amazon S3 存儲桶中的對象提出的 HTTP PUT 請求的數量。 |
BytesDownloaded | 爲向 Amazon S3 存儲桶提出的請求下載的字節數(請求的響應包含正文)。 |
BytesUploaded |
包含向 Amazon S3 存儲桶提出的請求正文的已上傳字節數。 |
有了上面的指標,已經可以知道
- 存儲容量: 桶存儲容量大小,桶對象數
- 請求: 可以知道總請求數及GET PUT請求數了
- 流量: 下載容量
如果需要更多指標請參考本節開頭文檔。
這裏要描述一下遇到的問題:
請求數及流量,可以使用監控過濾器進行統計。即可以根據S3 存儲前綴及 S3存儲標籤 來統計。
比如不同客戶使用不同篩選條件匹配S3前綴進行統計。主要這裏的監控條件均需要付費。
但存儲容量並不能使用這種方式進行監控。容量監控粒度大小僅能到桶
2 Cloudwatch使用
2.1 S3創建監控指標
在 AWS S3 控制檯管理 項目可以以前綴或tag 創建監控篩選條件。
正如上面所說這種篩選器只能統計請求及流量不能統計存儲容量。
2.2 調用Cloudwatch獲取指標數據
獲取指標主要用到AWS SDK 中Cloudwatch 類中 getMetricStatistics 這裏提供一個sample(Nodejs) 進行說明
一下函數爲統計當前月的數據(流量及請求數)
該函數AWS 文檔:https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricStatistics.html
以下有部分代碼爲獲取月初時間和月末時間
const AWS = require('aws-sdk');
const cloudwatch = new AWS.CloudWatch({accessKeyId: '', secretAccessKey: '', region: 'cn-northwest-1'});
const time = new Date();
const startTime = new Date(time);
startTime.setDate(1);
startTime.setHours(0, 0, 0, 1);
const endTime = new Date(time);
const endTimeMonth = endTime.getMonth();
if(endTimeMonth+1 === 12){
const endTimeYear =endTime.getFullYear();
endTime.setFullYear(endTimeYear+1);
endTime.setMonth(0);
endTime.setDate(1);
endTime.setHours(0, 0, 0, 0);
}else{
endTime.setMonth(endTimeMonth+1);
endTime.setDate(1);
endTime.setHours(0, 0, 0, 0);
}
console.info(startTime);
console.info(endTime);
const params = {
EndTime: endTime, /* required */
MetricName: 'GetRequests', //'AllRequests' BytesDownloaded BytesUploaded 1.1中指的各指標
Namespace: 'AWS/S3', //S3 指標
Period: 3600*24*31, /* required */ //以月份爲座標軸刻度
StartTime: startTime, /* required */
Dimensions: [
{
Name: 'BucketName', /* required */
Value: 'TESTBucketName'//桶名
},
{
Name: 'FilterId', /* required */
Value:"5d132dd06d0da00d01000110" //篩選器ID
},
],
Statistics: [
'Sum'//' ', 計數方式
]
};
cloudwatch.getMetricStatistics(params, function(err, data) {
if (err){
console.info(err);
}
else{
console.info(data); // successful response
}
});
返回的值如下:
GetRequests:
{ ResponseMetadata: { RequestId: '697567b9-c912-4c55-80da-62a602f62e47' },
Label: 'GetRequests',
Datapoints:
[ { Timestamp: 2019-11-30T16:00:00.000Z, Sum: 128, Unit: 'Count' } ] }
BytesDownloaded:
{ ResponseMetadata: { RequestId: 'd5253e68-7a36-4235-a1e1-3442409d6fbb' },
Label: 'BytesDownloaded',
Datapoints:
[ { Timestamp: 2019-11-30T16:00:00.000Z,
Sum: 17243087,
Unit: 'Bytes' } ] }