云服务日志处理与无服务器数据湖构建
在云服务的使用过程中,日志处理和数据管理是至关重要的环节。下面将详细介绍云服务日志处理的相关问题及解决方法,以及无服务器数据湖的构建方案。
1. 云服务日志处理问题及解决
在向 S3 上传日志时,可能会遇到访问 S3 的功能无法运行的问题。例如,尝试列出存储桶、列出存储桶中的对象、将对象放入存储桶时,没有得到任何响应,甚至没有错误消息。经过排查,发现问题可能是只将存储桶添加到了资源中,而没有添加其中的对象。可以通过在 S3 存储桶 ARN 后面加上 “/*”(不包含引号)来添加对象。
2. 主动日志记录
许多云服务都可以方便地进行日志记录。例如,Lambda 的所有控制台输出都会写入 CloudWatch 日志,API Gateway 也可以将日志写入 CloudWatch,S3 可以将日志存储在另一个 S3 存储桶中。日志记录通常默认开启,或者可以通过简单的配置来启用。主动日志记录主要有两个目的:
-
错误监控
:当后端发生错误时,能够立即通知用户。
-
成本跟踪
:将每个操作的运营成本追溯到执行该操作的用户,以便根据实际使用情况向用户收费,或者跟踪用户或组织在解决方案中的成本。
2.1 Lambda 微服务的错误监控
对于 Lambda 微服务的错误监控,可以按照以下步骤进行:
1.
创建 Lambda 微服务
:在 CDK 中创建一个 Lambda 微服务,该微服务将由每次写入的日志触发。
const lambdaTrigger = new lambda.Function(this, "CloudWatchMonitor",{
description: "Microservice to monitor CloudWatch logs",
runtime: lambda.Runtime.NODEJS_12_X,
handler: "index.handler",
code: lambda.Code.fromAsset("./lambda_src_path/"),
role: lambdaRole, // at least SNS:Publish
memorySize: 128,
timeout: cdk.Duration.seconds(600),
logRetention: logs.RetentionDays.THREE_DAYS,
environment:{}
});
- 创建日志目标 :
const lambdaLogDestination = new logsdestinations.LambdaDestination(lambdafn);
- 创建日志组并添加订阅 :
// create the Lambda microservice first
const newLambda = .....
const newLambdaFN = newLambda.functionName;
// add the log group to CloudWatch logs
const newLGroup = new logs.LogGroup(this,"logsFor"+newLambdaFN, {
logGroupName: "/aws/lambda/"+newLambdaFN,
retention: logs.RetentionDays.THREE_DAYS
});
// set log monitor subscription
new logs.SubscriptionFilter(this, "logSubscription"+newLambdaFN,{
destination: lambdaLogDestination,
logGroup: newLGroup
// optional, use a filter to only get relevant logs
filterPattern: logs.FilterPattern.allTerms(""),
});
监控函数的代码需要完成以下几个任务:
1. 从 CloudWatch 接收到的消息是经过压缩的,需要使用 zlib 进行解码、解压缩,然后进行 JSON 解析,获取
.logEvents
键。
2. 遍历原始日志,根据日志消息的类型和内容确定是否需要采取行动。
3. 如果需要采取行动,可以通过 SES 或 SNS 发送通知。
4. 可选地,还可以将日志写入 S3 上的聚合 JSON 文件进行长期存储。
2.2 成本跟踪
为了进行成本跟踪,可以从 Cognito 授权头中获取用户子标识(sub)来识别用户:
let sections = authorization.split('.');
let buffc = Buffer.from(sections[1], 'base64');
claims = JSON.parse(buffc.toString('ascii'));
const userSub = claims.sub;
以下是一个 NodeJS Lambda 代码片段,用于从触发事件中解码 CloudWatch 日志,并检查是否为报告日志:
const zlib = require('zlib');
let payload = Buffer.from(event.awslogs.data, 'base64');
let unzipped = zlib.unzipSync(payload).toString();
logevents = JSON.parse(unzipped).logEvents;
let isreport = logevents[l].message.substr(0,6) === 'REPORT';
let parts = logevents[l].message.trim().split("\t");
const requestid = parts[0].substring(18);
let rlog = {"report":true,"requestid":requestid};
for(let p in parts){
if(!parts.hasOwnProperty(p)) continue;
if(p == 0) continue;
let q = parts[p].trim().split(':');
if(typeof q[1] == 'undefined') continue;
let k = q[0].replace(/\s/g,'_').toLowerCase();
rlog[k] = parseInt(q[1].substring(0,q[1].length-2).trim());
}
解码后的日志可以存储在 S3 上作为 JSON 文件,或者存储在 DynamoDB 中。
2.3 解析 S3 日志
解析 S3 日志有一些需要注意的地方。可以从日志中提取以下列:
| 列名 | 说明 |
| ---- | ---- |
| Bucket_Owner | 存储桶所有者 |
| Bucket | 存储桶名称 |
| Time | 时间 |
| Remote_IP | 远程 IP 地址 |
| Requester | 请求者 |
| Request_ID | 请求 ID |
| Operation | 操作 |
| Key | 键 |
| Request_URI | 请求 URI |
| HTTP_status | HTTP 状态码 |
| Error_Code | 错误代码 |
| Bytes_Sent | 发送的字节数 |
| Object_Size | 对象大小 |
| Total_Time | 总时间 |
| Turn_Around_Time | 周转时间 |
| Referrer | 引用者 |
| User_Agent | 用户代理 |
| Version_Id | 版本 ID |
解析 S3 日志的步骤如下:
1.
检索 S3 日志
:可以将日志全部读入内存、逐个读取或流式读取,具体取决于使用场景。
2.
解析日志
:
let rows = S3_log_data.split("\n");
for(let r in rows){
if(!rows.hasOwnProperty(r)) continue;
let cols = getDataFromCSVLine(rows[r]);
if(cols.length < 10) continue;
if(cols[7] !== 'REST.GET.OBJECT') continue;
cols[2] = cols[2].substring(1)+' '+cols[3].substring(0, cols[3].length-1);
cols.splice(3,1);
let dp = cols[2].split(' ')[0];
dp = dp.split(':');
let dd = dp[0].split('/');
cols[2] = new Date(
dd[2],
months.indexOf(dd[1]),
dd[0],
dp[1],
dp[2],
dp[3]).getTime();
let newLog = {};
for(let c in cols){
if(!cols.hasOwnProperty(c)) continue;
if(typeof columns[c] === 'undefined'){
columns[c] = 'column '+c;
}
newLog[columns[c]] = cols[c];
}
// add "newlog" to a collector object, db or json file
}
其中,
getDataFromCSVLine
函数用于解析 CSV 行:
function getDataFromCSVLine(line) {
let dataArray = [];
let tempString="";
let lineLength = line.length;
let index=0;
while(index < lineLength) {
if(line[index]=='"') {
let index2 = index+1;
while(line[index2]!='"') {
tempString+=line[index2];
index2++;
}
dataArray.push(tempString);
tempString = "";
index = index2+2;
continue;
}
if(line[index]!=" ") {
tempString += line[index];
index++; continue;
}
if(line[index]==" ") {
dataArray.push(tempString);
tempString = "";
index++;
continue;
}
}
dataArray.push(tempString);
return dataArray;
}
2.4 解析 API Gateway 日志
要对 API Gateway 进行日志记录,需要进行以下配置:
1.
创建角色
:创建一个 API Gateway 可以用来将日志写入 CloudWatch 的角色。
2.
启用 CloudWatch 日志
:在阶段配置中启用 CloudWatch 日志,日志级别设置为 “info”,并勾选 “记录完整请求/响应数据”。
解析 API Gateway 日志的步骤如下:
1.
获取所有流
:使用
describeLogStreams
获取 API Gateway 日志组的所有流,配置请求按
LastEventTime
降序排列。如果返回
nextToken
,可能需要循环请求。
2.
创建活动流数组
:检查每个返回的流,创建一个 “活动流” 数组。如果
data.logStreams[s].lastEventTimestamp
未定义,则该流没有日志。由于按时间降序排列,一旦遇到没有日志的流,后面的流也不会有日志,可以停止循环。
3.
检索日志
:使用
getLogEvents
循环遍历活动流,检索流中的所有日志。如果返回
nextToken
,可能需要循环请求。
4.
解析日志消息
:解析每个日志消息,提取有用信息。
5.
存储日志
:将日志按天分段存储,以便后续与日志聚合器一起使用。
解析日志消息时,需要根据消息类型进行不同的处理。例如,获取日志 ID、HTTP 方法和路径:
let logID = /\(([^)]+)\)/.exec(message)[1];
let search = 'HTTP Method: ';
let searchIndex = message.search(search);
let m = message.substring(searchIndex+search.length).trim();
let parts = m.split(',');
let method = parts[0];
let path = parts[1].substring(15);
对于 JSON 或类似 JSON 的数据,可能需要进行一些修复才能正确解析:
if(message.search('[TRUNCATED]') !== -1){
message = message.replace('[TRUNCATED]','"}}');
}
let result = {};
try{
result = JSON.parse(message.replace(/\\n/,''));
}catch(e){
message = message.substring(1,message.length-1);
message = '{"'+message.replace(/=/g,'":"').replace(/, /g,'", "')+'"}';
message = message.replace('"Date":"Mon", "','"Date":"Mon, ')
.replace('"Date":"Tue", "','"Date":"Tue, ')
.replace('"Date":"Wed", "','"Date":"Wed, ')
.replace('"Date":"Thu", "','"Date":"Thu, ')
.replace('"Date":"Fri", "','"Date":"Fri, ')
.replace('"Date":"Sat", "','"Date":"Sat, ')
.replace('"Date":"Sun", "','"Date":"Sun, ');
message = message.replace('root":"','root:')
.replace(';sampled":"',';sampled:');
try{
result = JSON.parse(message);
}catch(e){
console.log('COULD NOT PARSE: ',message);
return false;
}
}
3. 无服务器数据湖构建
组织在业务运营中会收集大量的数据,这些数据存储在不同的数据库和文件系统中,格式和架构各不相同,给数据分析带来了很大的困难。为了解决这个问题,组织可以构建数据仓库或数据湖。
3.1 数据仓库与数据湖的对比
- 数据仓库 :将多个数据源的数据组合在一起进行分析,优化了快速查询、批处理和高级分析。但需要对多样化的数据源进行大量的预处理,以整理和标准化数据,这使得实时分析困难且成本高昂,未来对数据结构的任何更改也需要大量的工作和成本。
- 数据湖 :是一个集中式存储库,组织可以按原样存储来自不同来源的数据,并使用常见的大数据分析、机器学习和可视化技术进行分析。数据湖可以自动对数据进行爬取、编目和索引,无需对数据进行整理和预处理,使数据科学家能够更轻松地访问更大的数据池,更快地处理新数据,有时甚至可以实时处理。
3.2 AWS 构建无服务器数据湖的服务
AWS 提供了一系列服务来构建无服务器数据湖:
-
数据摄取和存储服务
-
S3
:是数据湖的理想存储设施,无服务器、成本效益高、具有良好的访问控制,支持多种数据添加方式,如批量上传、通过 API 上传或流式上传。常见的工作流程是将原始数据摄取到一个存储桶进行评估,然后移动到另一个存储桶进行清理和验证,第二个存储桶作为数据湖存储设施注册到分析服务中。还可以利用版本控制、备份和生命周期等功能来管理数据。
-
Kinesis
:用于摄取实时数据流,如客户点击流、日志和物联网设备数据,也支持音视频流。该服务完全托管,与其他服务集成,避免了自定义开发。但根据创建的摄取流的可用性计费,如果流不活动,会产生空闲时间费用。
-
Kinesis Firehose
:如果近实时处理足够满足使用场景,Kinesis Firehose 是一个更好的选择。它是无服务器的,根据摄取的数据量计费,可与云服务集成,在将传入数据流存储到 S3 存储桶之前进行转换、清理或其他处理。
-
DynamoDB
:高性能的无服务器数据库,具有生命周期管理功能(时间到活),可自动删除陈旧数据,适用于文件元数据、报告的聚合分析和仪表板中使用的当前数据。
-
Timestream
:适用于大多数实时或近实时摄取的数据,如日志和物联网数据。
-
自定义数据处理
:可以使用 Lambda 进行自定义数据处理,常见用例包括压缩、加密、恶意软件和病毒扫描以及元数据提取。
-
分析和可视化服务
-
Athena
:使技术用户能够查询数据湖中所有 Glue 索引的数据,无缝集成,只需管理访问权限。使用标准 SQL 作为查询语言,易于与其他云服务和支持 SQL 的第三方分析工具集成,如 Microsoft BI。按查询扫描的数据量计费。
-
QuickSight
:是一个商业智能仪表板,面向非技术终端用户,是 SaaS 产品,按用户每月计费。与 Athena 集成,获取查询数据进行可视化,还可以与其他云 SQL 数据库或外部和第三方 SaaS 解决方案(如 Salesforce 和 Jira)集成,支持多种可视化组件,提供标准和企业版本,企业版本支持 Active Directory 集成和机器学习进行高级分析。
3.3 数据湖创建方式及优缺点
- 创建方式 :数据湖通常手动创建,以提供添加自定义处理或满足特定合规要求的灵活性。但 AWS Lake Formation 可以在几分钟内快速创建一个简单标准的数据湖部署,定义数据源后,它会自动收集、编目、清理和分类数据,并提供强大的安全功能,如列级和行级权限。
- 优点 :与自管理解决方案(如 Hadoop 集群)相比,无服务器数据湖无需管理和维护服务器、操作系统或软件,无需配置或管理冗余、扩展或备份,只需为使用的资源付费,无需支付空闲时间费用,无需管理或支付许可证费用,创建或删除数据湖轻松快捷,S3 提供几乎无限的存储,不受硬件采购或手动更换或添加新驱动器的限制。
- 缺点 :与自管理系统相比,控制较少,无法选择或配置底层操作系统,服务的软件配置有限。对于受监管的行业,在云中存储某些类型的数据可能存在政策或其他合规挑战,需要在采用无服务器解决方案之前制定和参考数据分类和政策。此外,云无服务器解决方案与本地解决方案相比,可能存在更高的延迟,在实时用例中需要考虑。
总之,云服务日志处理和无服务器数据湖构建在现代云计算环境中具有重要意义。通过合理处理日志,可以及时发现和解决问题,实现成本跟踪;而构建无服务器数据湖可以更高效地管理和分析组织的多样化数据,为业务决策提供有力支持。但在实施过程中,需要根据具体需求和场景,权衡各种服务和方案的优缺点,选择最适合的解决方案。
云服务日志处理与无服务器数据湖构建
4. 云服务日志处理与无服务器数据湖构建的关联
云服务日志处理和无服务器数据湖构建虽然是两个不同的领域,但它们之间存在着紧密的关联。日志数据是组织业务运营的重要记录,包含了各种有价值的信息,如用户行为、系统状态、错误信息等。将这些日志数据纳入无服务器数据湖进行存储和分析,可以为组织带来更多的洞察和价值。
- 数据来源 :云服务日志可以作为无服务器数据湖的重要数据来源之一。通过对日志数据的收集、存储和分析,可以了解系统的运行状况、用户的使用习惯,为业务决策提供支持。
- 数据分析 :无服务器数据湖提供了强大的数据分析能力,可以对云服务日志数据进行深入挖掘。例如,通过分析 API Gateway 日志,可以了解用户的请求模式、系统的响应时间,从而优化系统性能;通过分析 S3 日志,可以了解数据的访问情况,优化数据存储策略。
- 成本优化 :通过对云服务日志的分析,可以了解各个服务的使用情况,从而进行成本优化。例如,通过分析 Kinesis 日志,可以了解数据的流量情况,合理调整摄取流的配置,避免不必要的费用。
5. 最佳实践与建议
在进行云服务日志处理和无服务器数据湖构建时,以下是一些最佳实践和建议:
5.1 日志处理最佳实践
- 日志分类 :对不同类型的日志进行分类管理,例如将系统日志、应用日志、访问日志等分开存储,便于后续的分析和查询。
- 日志保留策略 :根据业务需求和合规要求,制定合理的日志保留策略。对于重要的日志数据,可以适当延长保留时间;对于一些临时的、不重要的日志数据,可以缩短保留时间,以节省存储成本。
- 日志监控与报警 :建立日志监控机制,实时监控日志数据的变化。当出现异常情况时,及时发出报警,以便及时处理问题。
5.2 无服务器数据湖构建最佳实践
- 数据建模 :在构建无服务器数据湖之前,进行合理的数据建模。根据业务需求和数据分析的目标,设计合适的数据结构和表结构,提高数据的查询效率和分析性能。
- 数据安全 :重视数据安全,采取必要的安全措施,如访问控制、数据加密、备份恢复等。确保数据在存储和传输过程中的安全性和完整性。
- 成本控制 :在使用 AWS 服务构建无服务器数据湖时,要注意成本控制。合理选择服务和配置,避免不必要的资源浪费。例如,根据数据的访问频率和重要性,选择合适的存储类型和保留策略。
6. 未来发展趋势
随着云计算技术的不断发展,云服务日志处理和无服务器数据湖构建也将呈现出以下一些发展趋势:
6.1 日志处理智能化
未来,日志处理将越来越智能化。通过引入机器学习和人工智能技术,可以实现对日志数据的自动分析和异常检测。例如,通过对大量日志数据的学习,建立异常行为模型,当出现异常情况时,自动发出报警并提供解决方案。
6.2 无服务器数据湖的普及
无服务器数据湖由于其无需管理服务器、成本低、灵活性高等优点,将越来越受到企业的青睐。未来,更多的企业将采用无服务器数据湖来存储和分析他们的业务数据。
6.3 多云数据湖的出现
随着企业对云计算的依赖程度越来越高,越来越多的企业开始采用多云战略。未来,可能会出现多云数据湖的概念,即企业可以将来自不同云服务提供商的数据整合到一个数据湖中进行统一管理和分析。
7. 总结
云服务日志处理和无服务器数据湖构建是现代云计算环境中的重要组成部分。通过合理处理日志,可以及时发现和解决问题,实现成本跟踪;而构建无服务器数据湖可以更高效地管理和分析组织的多样化数据,为业务决策提供有力支持。在实施过程中,需要根据具体需求和场景,权衡各种服务和方案的优缺点,选择最适合的解决方案。同时,要关注未来的发展趋势,不断学习和应用新的技术,以适应不断变化的市场需求。
以下是一个简单的 mermaid 流程图,展示了云服务日志处理和无服务器数据湖构建的整体流程:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(云服务日志产生):::process --> B(日志收集):::process
B --> C(日志处理):::process
C --> D{日志类型}:::process
D --> |系统日志| E(系统日志分析):::process
D --> |应用日志| F(应用日志分析):::process
D --> |访问日志| G(访问日志分析):::process
E --> H(无服务器数据湖存储):::process
F --> H
G --> H
I(其他数据源):::process --> H
H --> J(数据分析与挖掘):::process
J --> K(业务决策支持):::process
通过这个流程图,可以清晰地看到云服务日志从产生到最终为业务决策提供支持的整个过程,以及无服务器数据湖在其中的重要作用。
总之,无论是云服务日志处理还是无服务器数据湖构建,都需要我们不断地学习和实践,结合实际业务需求,灵活运用各种技术和工具,才能实现最佳的效果。
超级会员免费看

被折叠的 条评论
为什么被折叠?



