场景
在使用阿里云的一些API调用类的服务时,如果用按量付费往往价格会较高,为了节省成本用户往往会选择购买对应的 API 资源包,比如:NLP的模型调用资源包、函数调用资源包、共享流量资源包等等。
资源包的使用情况在 个人中心>资源实例管理>资源包 中我们可以查看,默认的阿里云会对用户购买的资源包余量进行阈值报警,报警信息将通过邮件和手机短信的方式发送到用户的客户端。这种方式已经很齐全了,但是在当今手机各种短信非常多的情况下,用户可能会漏掉一些短信的查看。因此我的想法是能不能把这种报警单独发到某个企业微信群,这样的话在工作时查看企业微信的实时性比查看手机短信的要高,就可以及时进行资源包补充。
方案
由于阿里云的API接口中并没有直接查余额的接口,只有资源包用量查询,因此我的方法就是通过查询资源包前一天的使用情况来算出当前余量,再进行阈值判断来发报警。
此处用到的接口为:QueryDPUtilizationDetail,大家可以通过阿里云官方的调试接口进行调试。
此处以NLP调用为例,主要代码如下:
useAlibabaCloud\SDK\BssOpenApi\V20171214\BssOpenApi; use\Exception; useAlibabaCloud\Tea\Exception\TeaError; useAlibabaCloud\Tea\Utils\Utils; useDarabonba\OpenApi\Models\Config; useAlibabaCloud\SDK\BssOpenApi\V20171214\Models\QueryDPUtilizationDetailRequest; useAlibabaCloud\Tea\Utils\Utils\RuntimeOptions; classCheckResourceBag{ /*** 获取NLP调用的剩余数量*/privatefunctiongetNlpRestCount($warningNlpCount){ $accessKeyId="your key"; $accessKeySecret="your secret"; $client=$this->createClient($accessKeyId,$accessKeySecret); $startTime=date("Y-m-d 00:00:00",strtotime("-1 day")); $queryDPUtilizationDetailRequest=newQueryDPUtilizationDetailRequest([ "startTime"=>$startTime, "endTime"=>date('Y-m-d H:i:s'), "includeShare"=>"true", "prodCode"=>"nlp" ]); $runtime=newRuntimeOptions([]); try { // 复制代码运行请自行打印 API 的返回值$resultList=$client->queryDPUtilizationDetailWithOptions($queryDPUtilizationDetailRequest, $runtime); $maxCount=0;//原始数量$totalDeduct=0;//总扣除数量foreach ($resultList->body->data->detailList->detailListas$curItem) { if ($curItem->deductedCommodityCode!="nlp_automl_post") { continue; } if ($curItem->deductFactorTotal>$maxCount) { $maxCount=$curItem->deductFactorTotal; } $totalDeduct+=$curItem->deductQuantity; } $restCount=$maxCount-$totalDeduct; if ($restCount<$warningNlpCount) { $messageBody="NLP自学习平台模型调用资源包剩余 $restCount条, 数量已不足 $warningNlpCount条,请尽快购买资源包。"; #发送企业微信代码,此处省略,可参考企业微信的API#用户也可以发送其他类型的消息,比如:钉钉。sendQiyeWeixinMsg($messageBody); } } catch (\Exception$error) { echo$error->getMessage(); } } }
需要注意的是,上面的API获取资源包消费数据时,默认取20条,最大值为300,你可以根据自己的情况进行代码微调。
最后再为这段代码设置一个定时任务即可,可以每天一次,也可以每小时一次,可根据自身业务进行设置。