Skip to content

腾讯云轻量应用服务器调用API监控流量阻断访问防止流量超标

约 1624 字大约 5 分钟

腾讯云轻量应用服务器lighthouse防火墙

2025-10-06

背景说明

腾讯云轻量应用服务器大多有月流量的限制,虽然在购买时有多种规格进行选择,但如果对业务流量估计不足,则可能会产生流量超标导致额外费用等问题的出现,此时可以通过调用官方的 API 来对流量进行监控,并采取一些措施,从而避免流量超标等情况的发生。

本教程将介绍如何通过代码和计划任务的方式,定时调用官方 API 判断剩余流量,并更新防火墙以阻断对服务器的请求,从而避免流量超标的情况发生。

实现逻辑

  1. PHP 代码调用 API 获取轻量应用服务器实例的流量情况
  2. 计算相关流量的数值
  3. 如剩余流量低于流量阈值则调用 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,如图操作即可新建密钥,请特别注意官网的安全提示

pic.jpg

2、服务器实例 ID 获取

进入轻量应用服务器管理界面https://console.cloud.tencent.com/lighthouse/instance/index,选中要设置的服务器,点击查看详情后,在概要页可查看并复制实例 ID

pic.jpg

pic.jpg

3、实例地域编码

进入地域列表文档https://cloud.tencent.com/document/api/1207/47564#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8,查看服务器所在地区,找到对应编码。

pic.jpg

4、防火墙模板设置

进入防火墙模板管理界面https://console.cloud.tencent.com/lighthouse/firewalltemplate/index,可建立和管理多个模板,用于不同场景对轻量应用服务器实例的快速设置。

pic.jpg

pic.jpg

pic.jpg

5、操作后配置代码

将上述控制台设置的 API 密钥、实例 ID、所在地域编码、防火墙模板 ID 等信息,复制至代码中的配置区即可。

pic.jpg

运行效果演示

1、剩余流量充足

假设流量阈值为 10,剩余流量大于 10GB,代码逻辑为剩余流量充足,运行结果为:

流量统计: 剩余 99.68GB/总共 300.00GB (已用 200.32GB) 流量充足,服务正常运行

2、剩余流量不充

假设流量阈值为 100,剩余流量小于 100GB,代码逻辑为剩余流量不足,运行结果为:

流量统计: 剩余 99.68GB/总共 300.00GB (已用 200.32GB) 流量不足,正在更新防火墙... 防火墙更新成功

此时,预先设定的阻断访问防火墙生效,替换了轻量应用服务器实例对应的防火墙规则,服务器无法访问。

pic.jpg

设置计划任务

该文件可通过设置计划任务的方式定时运行。

# PHP 解释器路径和 PHP 文件路径请根据实际情况进行修改
# 每 5 分钟运行 1 次
*/5 * * * * /usr/bin/php /root/lighthouse_check.php >> /root/lighthouse_check.log

总结

此种方式仅做为最基础的逻辑演示,结合 API 可以实现多种功能的自动化处理,如根据不同情况使用不同的防火墙规则、变更实例套餐等等操作。

具体操作调用的使用方法请以腾讯云官方文档为准。