AWS S3 云存储 是按照存储容量,请求数,及网络流量三个维度进行收费。而如果涉及到使用S3 对外提供SaaS服务,成本分布及估算自然称为比较重要的需求。自然而言需要监控以上三个指标。

先上官网说明性文档:
https://docs.amazonaws.cn/AmazonS3/latest/dev/monitoring-overview.html


文章目录

  • 1 监控指标
  • 2 Cloudwatch使用
  • 2.1 S3创建监控指标
  • 2.2 调用Cloudwatch获取指标数据



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 创建监控筛选条件。
正如上面所说这种筛选器只能统计请求及流量不能统计存储容量。

Mango 监控数据变化 监控数据量_Mango 监控数据变化

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' } ] }