如何查询AWS Workspaces某个云桌面的使用总时长

一、背景

为了更好的统计云桌面使用率,管理员需要调查本账户内所有云桌面在某个时间范围内的运行时长,此时可通过CloudWatch查询统计数据。

二、从图形界面查询方法

1、生成使用量曲线

进入CloudWatch主界面,点击使用新界面按钮。如下截图。

点击左侧全部指标菜单,再右侧浏览位置,向下滚动屏幕,找到Workspaces按钮。点击进入。如下截图。

在Workspaces下级菜单选项中,点击按WorkSpace ID。如下截图。

在搜索框中,输入UserConnected。这个字段意味着查找所有桌面的用户连接数。输入后按回车键。如下截图。

输入后按回车键,查询到现有的桌面的名字,每个桌面有独一无二的名字。然后选中它。这里可以多选。然后点击右上角的操作按钮,再点击添加到控制面板按钮。

在弹出的添加到控制面板按钮上,输入控制面板的名字,点击新建按钮,然后点击右下角的添加到控制面板。如下截图。

现在进入控制面板界面,即可看到刚才添加的桌面的使用情况的曲线。

2、如何观察曲线

每个Workspaces被设计为只有一个用户可以登陆,因此有几个用户就有有几个名称ID独一无二的桌面。通过上述控制面板,查看UserConnected监控参数,数据为1则表示用户正在使用桌面,数据为0则表示用户没有使用桌面。由此即可获得用户使用情况。

三、通过CLI查询数据

首先安装部署AWSCLI并配置正确的AKSK。此部分内容请参考有关文档。

然后构建如下命令:

aws cloudwatch get-metric-statistics --namespace "AWS/WorkSpaces" --dimensions Name=WorkspaceId,Value=ws-kjcyqj9c2 --metric-name UserConnected --statistics Maximum --start-time 2022-08-01T00:00:00 --end-time 2022-08-05T00:00:00 --period 300 --output table | sort

请替换如上命令中的桌面ID也就是ws-kjcyqj9c2为要查询的ID,替换start-time和end-time定义的时间窗口,注意T00是表示格林尼治标准时间,+8小时即可换算为北京时间。

查询结果如下:

由此即可获得本桌面的使用数据,第一列Lable显示为0则表示这个时间点没有人登陆,显示为1则表示有用户登陆。

需要注意的是,AWSCLI一次仅能获取1440个数据点,那么对于一个月有720小时,每小时60分钟,数据点事远大于1440的,因此并不足以一次导出一个桌面的整个月的使用量数据。因此一般CLI只用于查询小范围的时间数据。

四、通过Python程序查询数据

通过Python代码调用AWS SDK可以获取CloudWatch数据,其方法与上一步通过AWSCLI获取是一样的,也需要注意一次只能获取1440个数据点。但是Python程序会更方便进行批量处理。以下为获取数据的代码样本。

import boto3
import json
from datetime import datetime
import time
import hmac
import hashlib
import base64
import urllib.parse
import requests
import sys

instanceid = "ws-kjcyqj9c2"

cloudwatch = boto3.client('cloudwatch')

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, obj)

response = cloudwatch.get_metric_statistics(
    Namespace='AWS/WorkSpaces',
    MetricName='UserConnected',
    Dimensions=[
        {
            'Name': 'WorkspaceId',
            'Value': instanceid 
        },
    ],
    StartTime = datetime(2022,7,25,0,00,0),
    EndTime = datetime(2022,7,26,0,00,0),
    Period=300, # Duraiton 300秒
    Statistics=[
        'Maximum', 
    ],
    Unit='Count'
)

print(json.dumps(response, cls=ComplexEncoder, indent=4))

返回示例结果如下。

在此场景下,用户可自行调整Python代码,多批次取回数据,然后根据需要进行时间运算。

全文完。