乐趣区

关于程序员:教你如何将华为云CDN日志转存到OBS

CDN 记录了所有域名(包含已删除域名,如果您开明了企业我的项目,则已删除域名不反对此性能)被网络用户拜访的具体日志,您能够通过 CDN 控制台查看和下载最近 30 天的日志,对您的业务资源被拜访状况进行详细分析。

日志转存储服务是华为云 CDN 配合函数工作流,将 CDN 日志存储到 OBS 桶,能够帮忙您将日志存储更长的工夫,便于您基于长时间的日志做出自定义的数据分析,有助于您更好地理解您 CDN 的服务质量,以及您的终端客户的拜访详情,进步您的业务决策能力。

本文以 Python3.6 为例,为您介绍通过 API 创立 FunctionGraph 函数和 Timer 触发器,实现定时将 CDN 日志转存到 OBS。

前提条件

临时仅反对日志转存到北京四的 OBS 桶,请您提前准备好位于北京四的 OBS 桶。

操作步骤

  1. 创立委托
    a. 登录华为云控制台,在左侧导航栏,抉择 治理与监管 > 对立身份认证服务
    b. 在左侧导航栏,抉择“委托”页签,单击右上方的“+ 创立委托”。
    c. 在创立委托页面,依照如下参数设置委托。

    *   委托名称:FG_TO_CDN。*   委托类型:云服务。*   云服务:函数工作流 FunctionGraph。*   持续时间:永恒。

d.  单击“下一步”,进入为“FG_TO_CDN”委托配置权限界面。*   权限抉择:OBS OperateAccess、CDN LogsReadOnlyAccess。

e. 单击“下一步”,配置作用范畴。

    *   作用范畴:全局服务。

f.  单击“确认”,实现委托配置。
  1. 筹备函数工作流环境
    a. 登录华为云控制台,在左侧导航栏,抉择 计算 > 函数工作流”,region 抉择“北京四”。
    b. 单击右上方“创立函数”,进入创立函数界面

    *   抉择模板:创立空白函数。*   输出函数名称:cdn_to_obs(可自定义)。*   所属利用:抉择默认的“default”。*   委托名称:抉择已创立好的委托“FG_TO_CDN”。*   企业我的项目:抉择“default”。*   运行时语言:抉择“Python 3.6”。*   代码上传形式:抉择“默认代码”。

c.  单击“创立函数”,进入代码编辑界面,将 [代码示例](https://support.huaweicloud.com/bestpractice-cdn/cdn_01_0138.html#cdn_01_0138__section18880191812527) 的代码内容贴入在线 IDE。

    阐明:如果有多个域名的日志须要转存,您须要别离为每个域名创立一个函数工作流。d.  单击“配置”,进入函数配置界面。*   执行超时工夫:函数运行的超时工夫,超时的函数将被强行进行,倡议设置为 900。阐明:如果您发现转存的日志数量不对,请向“函数工作流”服务提工单,增大执行超时工夫。*   url:https://cdn.myhuaweicloud.com/v1.0/cdn/logs(CDN 日志下载的 url)。*   domain_name:xxx.com(须要转存日志的 CDN 减速域名)。*   obsAddress:xxx.com(用于存日志的 OBS 桶域名)。*   destBucket:******(用于存日志的 OBS 桶名称)。

    1.  单击右上方“保留”,实现设置。

e. 创立“触发器 ”。 在函数配置界面抉择“触发器”,单击右侧“创立触发器”。

    *   触发器类型:定时触发器 (TIMER)。*   定时器名称:自定义的定时器名称,例如:Timer-0001。*   触发规定:Cron 表达式。*   Cron 表达式:0 0 8 * * ?(每天早上 8 点执行一次日志转存储)。*   是否开启:开启。

    1.  单击“确定”,实现定时触发器设置。

f. 创立测试事件。在函数配置界面,单击右上角“请抉择测试事件”下拉框,抉择“配置测试事件”。

    *   配置测试事件:创立新的测试事件。*   事件模板:空白模板。*   事件名称:test。*   测试事件:{"message":"CDNLog-OBS"}。

    1.  单击“保留”,实现测试事件创立。g.  测试函数。在函数详情页面,单击右上角“请抉择测试事件”下拉框,抉择“test”,单击“测试”。

  1. 查看配置是否胜利
    a. 登录华为云控制台,在左侧导航栏,抉择 存储 > 对象存储服务 OBS”。
    b. 单击您存储日志的桶,在左侧导航栏抉择“对象”。
    c. 拜访门路:文件夹(桶名称)> 文件夹(减速域名)> 文件夹(日志日期)> 日志内容。

阐明:*   以后 [代码示例](https://support.huaweicloud.com/bestpractice-cdn/cdn_01_0138.html#cdn_01_0138__section18880191812527) 仅反对转存以后工夫前一日的日志,如果您须要转存日志的减速域名前一日没有日志产生,则 OBS 桶侧不会产生相干文件。*   OBS 桶将对转存到桶里的日志免费,具体免费规定请参考[计费阐明](https://support.huaweicloud.com/price-obs/obs_42_0001.html)。
  1. 进行日志转存服务
    a. 登录华为云控制台,在左侧导航栏,抉择“计算 > 函数工作流”region 抉择“北京四”。
    b. 在左侧导航栏抉择“函数”>“函数列表”,选中 2 中创立的函数名。
    c. 在函数详情页抉择“触发器”。

    d. 单击“停用”,实现配置。

代码示例

代码如下所示:

<pre class=”codeblock ctnc” id=”cdn_01_0138__codeblock1053104811528″ style=”box-sizing: border-box; overflow: auto; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace; font-size: 1em; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(250, 250, 250) !important; position: relative; transition: background-color 1s ease 0s; color: rgb(29, 33, 41) !important; border: 1px solid rgb(231, 233, 250); padding: 30px 10px 10px !important;”># –– coding:utf-8 –
import requests
import datetime
import time
import os
import sys
import json

from com.obs.client.obs_client import ObsClient

from urllib.parse import urlparse

if sys.version_info.major == 2 or not sys.version > ‘3’:

import httplib

else:

import http.client as httplib

current_file_path = os.path.dirname(os.path.realpath(__file__))

Adds the current path to search paths to import third-party libraries.

sys.path.append(current_file_path)

TEMP_ROOT_PATH = “/tmp/” # Downloads a file from OBS to this directory.
region = ‘china’ # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.
secure = True # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.
signature = ‘v4’ # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.
port = 443 # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.
path_style = True # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.

def handler(event, context):

logger = context.getLogger()
queryDate = context.getUserData('queryDate')
if queryDate is None:
    yesterday = datetime.date.today() + datetime.timedelta(-1)
    queryDate = yesterday.strftime("%Y-%m-%d")
    timeStamp = int(time.mktime(yesterday.timetuple()) * 1000)
else:
    date = datetime.datetime.strptime(queryDate, "%Y-%m-%d")
    timeStamp = int(time.mktime(date.timetuple()) * 1000)

pageSize = 20
pageNumber = 1

requests.packages.urllib3.disable_warnings()
start(context, queryDate, timeStamp, pageSize, pageNumber)

def start(context, queryDate, timeStamp, pageSize, pageNumber):

logger = context.getLogger()
logUrl = context.getUserData('url')
domainName = context.getUserData('domain_name')

params = {'query_date': timeStamp, 'domain_name': domainName, 'page_size': pageSize, 'page_number': pageNumber, 'enterprise_project_id':'ALL'}
headers = {'Content-Type': 'application/json;charset=UTF-8', 'X-Auth-Token': context.getToken()}
res = requests.get(logUrl, params=params, headers=headers, verify=False)
if res.status_code != 200:
    logger.info("query log urls:" + res.url + ", error:" + res.text)
    return ("query log urls:" + res.url + ", error:" + res.text)

resJson = json.loads(res.text)
logger.info(res.text)
total = resJson['total']
i = 0
for val in resJson['logs']:
    i += 1
    logger.info(val["link"])

    url = urlparse(val["link"])
    netlocs = url.netloc.split(":")
    conn = httplib.HTTPConnection(netlocs[0], int(netlocs[1]))
    conn.request('GET', url.path + "?" + url.query)
    objName = os.path.join(val["domain_name"], queryDate, val["name"])
    put_content_to_obs(context, objName, conn.getresponse())

if pageSize * pageNumber < total:
    start(context, queryDate, timeStamp, pageSize, pageNumber + 1)

def put_content_to_obs(context, objName, content):

ak = context.getAccessKey()
sk = context.getSecretKey()
obsAddress = context.getUserData('obsAddress')
destBucket = context.getUserData('destBucket')
TestObs = ObsClient(access_key_id=ak, secret_access_key=sk,
                    is_secure=secure, server=obsAddress, signature=signature, path_style=path_style, region=region,
                    ssl_verify=False, port=port,
                    max_retry_count=5, timeout=20)
resp = TestObs.putContent(destBucket, objName, content=content)
if resp.status < 300:
    print('requestId:', resp.requestId)
else:
    print('errorCode:', resp.errorCode)
    print('errorMessage:', resp.errorMessage)</pre>

本文由华为云公布

退出移动版