外观
腾讯云轻量应用服务器调用API监控流量阻断访问防止流量超标
背景说明
腾讯云轻量应用服务器大多有月流量的限制,虽然在购买时有多种规格进行选择,但如果对业务流量估计不足,则可能会产生流量超标导致额外费用等问题的出现,此时可以通过调用官方的 API 来对流量进行监控,并采取一些措施,从而避免流量超标等情况的发生。
本教程将介绍如何通过代码和计划任务的方式,定时调用官方 API 判断剩余流量,并更新防火墙以阻断对服务器的请求,从而避免流量超标的情况发生。
实现逻辑
- PHP 代码调用 API 获取轻量应用服务器实例的流量情况
- 计算相关流量的数值
- 如剩余流量低于流量阈值则调用 API 更新轻量应用服务器实例的防火墙
官方 API 文档
这里主要使用 2 个 API,分别是查看实例流量包详情、应用防火墙模板,以下分别为两个 API 接口的官方文档说明地址。
查看实例流量包详情 https://cloud.tencent.com/document/product/1207/48681
应用防火墙模板 https://cloud.tencent.com/document/product/1207/96883
官方推荐的请求方法是 POST,POST 请求支持的 Content-Type 类型为 application/json(推荐),必须使用签名方法 v3(TC3-HMAC-SHA256),并且官方提供多种语言的 SDK,便于开发及调试,但本文仅展示思路及最基础的可行性实现,故而使用 GET 方式进行代码演示且未使用 SDK 。
说明:本文代码未对异常情况进行判断,仅用于功能演示,请勿直接使用于生产环境。
代码说明
1、配置区
// 腾讯云调用 API 的 SECRET_ID 和 SECRET_KEY
// 可在控制台 API 密钥管理处申请 https://console.cloud.tencent.com/cam/capi
define('SECRET_ID', '你的SecretId');
define('SECRET_KEY', '你的SecretKey');
// 轻量应用服务器的实例 ID,控制台可复制
define('INSTANCE_ID', '你的实例ID');
// 服务器所在地域,查看文档填写正确的代码
// 地域列表文档 https://cloud.tencent.com/document/api/1207/47564#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8
define('REGION', '你的服务器所在地域');
// 自己设置的流量阈值 单位 GB,当剩余流量低于此值时触发相关代码
define('TRAFFIC_THRESHOLD', 10);
// 用于流量超标后阻断服务器访问的防火墙模板
// 可在控制台设置 https://console.cloud.tencent.com/lighthouse/firewalltemplate/index
define('FIREWALL_ID', '用来阻断访问的防火墙模版ID');
2、查看实例流量包详情函数
// 查看实例流量包详情
function getTraffic() {
$params = [
'Action' => 'DescribeInstancesTrafficPackages',
'Version' => '2020-03-24',
'Region' => REGION,
'Timestamp' => time(),
'Nonce' => rand(10000, 99999),
'SecretId' => SECRET_ID,
'InstanceIds.0' => INSTANCE_ID
];
ksort($params);
$signStr = "GETlighthouse.tencentcloudapi.com/?" . http_build_query($params);
$params['Signature'] = base64_encode(hash_hmac('sha1', $signStr, SECRET_KEY, true));
$url = "https://lighthouse.tencentcloudapi.com/?" . http_build_query($params);
$response = @file_get_contents($url);
$data = json_decode($response, true);
return $data['Response']['InstanceTrafficPackageSet'][0]['TrafficPackageSet'][0];
}
3、应用防火墙模板函数
// 更新应用防火墙模板
function updateFirewall() {
$params = [
'Action' => 'ApplyFirewallTemplate',
'Version' => '2020-03-24',
'Region' => REGION,
'Timestamp' => time(),
'Nonce' => rand(10000, 99999),
'SecretId' => SECRET_ID,
'TemplateId' => FIREWALL_ID,
'ApplyInstances.0.InstanceId' => INSTANCE_ID,
'ApplyInstances.0.Region' => REGION
];
ksort($params);
$signStr = "GETlighthouse.tencentcloudapi.com/?" . http_build_query($params);
$params['Signature'] = base64_encode(hash_hmac('sha1', $signStr, SECRET_KEY, true));
$url = "https://lighthouse.tencentcloudapi.com/?" . http_build_query($params);
$response = @file_get_contents($url);
$result = json_decode($response, true);
return !isset($result['Response']['Error']);
}
4、主逻辑
// 主逻辑
$traffic = getTraffic();
if (!$traffic) die("获取流量信息失败\n");
// 相关文档 https://cloud.tencent.com/document/api/1207/47576#TrafficPackage
// TrafficUsed Integer 流量包生效周期内已使用流量,单位字节。示例值:5905577
// TrafficPackageTotal Integer 流量包生效周期内的总流量,单位字节。示例值:536870912000
// TrafficPackageRemaining Integer 流量包生效周期内的剩余流量,单位字节。示例值:536865006423
// 数值 1073741824 表示 1 GB ,即 1024 * 1024 * 1024
$remaining = $traffic['TrafficPackageRemaining'] / 1073741824;
$total = $traffic['TrafficPackageTotal'] / 1073741824;
$used = $traffic['TrafficUsed'] / 1073741824;
echo sprintf('流量统计: 剩余%.2fGB/总共%.2fGB (已用%.2fGB)', $remaining, $total, $used) . "\n";
if ($remaining < TRAFFIC_THRESHOLD) {
echo "流量不足,正在更新防火墙...\n";
echo (updateFirewall() ? "防火墙更新成功\n" : "防火墙更新失败\n");
} else {
echo "流量充足,服务正常运行\n";
}
控制台相关操作
1、API 密钥管理
进入 API 密钥管理界面https://console.cloud.tencent.com/cam/capi,如图操作即可新建密钥,请特别注意官网的安全提示
2、服务器实例 ID 获取
进入轻量应用服务器管理界面https://console.cloud.tencent.com/lighthouse/instance/index,选中要设置的服务器,点击查看详情后,在概要页可查看并复制实例 ID
3、实例地域编码
进入地域列表文档https://cloud.tencent.com/document/api/1207/47564#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8,查看服务器所在地区,找到对应编码。
4、防火墙模板设置
进入防火墙模板管理界面https://console.cloud.tencent.com/lighthouse/firewalltemplate/index,可建立和管理多个模板,用于不同场景对轻量应用服务器实例的快速设置。
5、操作后配置代码
将上述控制台设置的 API 密钥、实例 ID、所在地域编码、防火墙模板 ID 等信息,复制至代码中的配置区即可。
运行效果演示
1、剩余流量充足
假设流量阈值为 10
,剩余流量大于 10GB,代码逻辑为剩余流量充足,运行结果为:
流量统计: 剩余 99.68GB/总共 300.00GB (已用 200.32GB) 流量充足,服务正常运行
2、剩余流量不充
假设流量阈值为 100
,剩余流量小于 100GB,代码逻辑为剩余流量不足,运行结果为:
流量统计: 剩余 99.68GB/总共 300.00GB (已用 200.32GB) 流量不足,正在更新防火墙... 防火墙更新成功
此时,预先设定的阻断访问防火墙生效,替换了轻量应用服务器实例对应的防火墙规则,服务器无法访问。
设置计划任务
该文件可通过设置计划任务的方式定时运行。
# PHP 解释器路径和 PHP 文件路径请根据实际情况进行修改
# 每 5 分钟运行 1 次
*/5 * * * * /usr/bin/php /root/lighthouse_check.php >> /root/lighthouse_check.log
总结
此种方式仅做为最基础的逻辑演示,结合 API 可以实现多种功能的自动化处理,如根据不同情况使用不同的防火墙规则、变更实例套餐等等操作。
具体操作调用的使用方法请以腾讯云官方文档为准。