使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中

news2024/10/6 12:23:38

作者:SRE运维博客

博客地址:https://www.cnsre.cn/

文章地址:https://www.cnsre.cn/posts/221205544069/

相关话题:https://www.cnsre.cn/tags/aws/


躺了好久,诈尸了。因为换了工作,所以比较忙一直没有时间去更新博客的内容(主要还是因为懒🤔)

话不多说 直接上干货。

需求背景

最近在看费用的时候发现有很大一部分费用都是 cloudwatch log中存储了大量的数据,是因为ec2 将日志传输到了存储到了cloudwatch中。这个存储的多的查询日志的时候收费特别的高。另外一个是因为数据分析用途,大数据分析的同事如果想那到数据的话,还是存储在 S3 中是比较划算和方便的,一个是拿取数据比较方便,另外一个是S3 可以最归档存储,后面的大量数据可以分层储存,以此来降低费用。

如果你也想将你的cloudwatch 中日志组中的日志存储到S3中的话可以参考下这篇文章。

前置条件

  • 创建 一个 S3 桶,并修改权限

  • 创建 lambda 函数

  • 有一个Cloudwatch 日志组并且有一天以上的日志

  • 给 lambda分配所需的权限

创建 S3 桶并修改权限

sre运维|Linux运维|关键词

{{< tabs 国内S3桶权限配置 国外S3桶权限配置 >}}

{{< tab >}}

国内S3桶权限配置


{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Principal": {

"Service": "logs.cn-north-1.amazonaws.com.cn"

},

"Action": "s3:GetBucketAcl",

"Resource": "arn:aws-cn:s3:::<bucket name>"

},

{

"Effect": "Allow",

"Principal": {

"Service": "logs.cn-north-1.amazonaws.com.cn"

},

"Action": "s3:PutObject",

"Resource": "arn:aws-cn:s3:::<bucket name>/*",

"Condition": {

"StringEquals": {

"s3:x-amz-acl": "bucket-owner-full-control"

}

}

}

]

}

{{< /tab >}}

{{< tab >}}

国外S3桶权限配置


{

"Version": "2012-10-17",

"Statement": [

{

"Action": "s3:GetBucketAcl",

"Effect": "Allow",

"Resource": "arn:aws:s3:::<bucket name>",

"Principal": { "Service": "logs.us-west-2.amazonaws.com" }

},

{

"Action": "s3:PutObject" ,

"Effect": "Allow",

"Resource": "arn:aws:s3:::<bucket name>*",

"Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } },

"Principal": { "Service": "logs.us-west-2.amazonaws.com" }

}

]

}

{{< /tab >}}

{{< /tabs >}}

S3 桶权限文档链接

<ins class=“adsbygoogle”

style=“display:block; text-align:center;”

data-ad-layout=“in-article”

data-ad-format=“fluid”

data-ad-client=“ca-pub-4855142804875926”

data-ad-slot=“5670838583”>

创建 lambda 函数

创建 lambda


import boto3

import logging

import time

import datetime

import json

  

logger = logging.getLogger()

logger.setLevel(logging.INFO)

  

def  export_s3_logs(bucket_name, log_group_name, log_stream_name, days_of_logs=1, timeout=1000):

'''

today = datetime.datetime.combine(datetime.datetime.utcnow(), datetime.datetime.min.time())

day_end = today

day_start = today - datetime.timedelta(days=days_of_logs)

'''

today = datetime.datetime.combine(datetime.datetime.utcnow() + datetime.timedelta(hours=8),

datetime.datetime.min.time()) # UTC+8

  

day_end = today - datetime.timedelta(hours=8) # UTC

day_start = today - datetime.timedelta(days=days_of_logs, hours=8) # UTC

#print(day_start)

ts_start = '{0:.0f}'.format(((day_start - datetime.datetime(1970, 1, 1)).total_seconds())*1000)

ts_end = '{0:.0f}'.format(((day_end - datetime.datetime(1970, 1, 1)).total_seconds())*1000)

the_date = '/'.join([str(today.year), '0'+str(today.month)[-2:], '0'+str(today.day)[-2:]])

#folder_name = '/'.join([log_group_name, log_stream_name, the_date])

folder_name = '/'.join([log_group_name,the_date])

client = boto3.client('logs')

#print (ts_start, ts_end)#, day_start, day_end,the_date

task_id = client.create_export_task(

logGroupName=log_group_name,

#logStreamNamePrefix=log_stream_name,

fromTime=int(ts_start),

to=int(ts_end),

destination=bucket_name,

destinationPrefix=folder_name

)['taskId']

  

i = 1

while i<timeout:

response = client.describe_export_tasks(

taskId=task_id

)

  

status = response['exportTasks'][0]['status']

if status == 'COMPLETED':

result = True

break

elif status != 'RUNNING':

result = False

break

i += 1

time.sleep(interval)

return result

  

def  lambda_handler(event, context):

region = 'cn-northwest-1'  # 日志组所在区域

bucket_name = '<bucket name>'  #同区域内的S3桶名称

log_group_name = '<log group name>'  #日志组名称

log_stream_name = '1'  #默认即可

log_export_days = 1  #默认即可

export_s3_logs(bucket_name, log_group_name, log_stream_name, log_export_days)

给 lambda 分配权限

  • AmazonS3的读写权限

  • CloudWatchLogsFullAccess

验证桶内的文件

最后会以日期的目录将日志归档起来,以方便日后对归档文件进行梳理。

sre运维|Linux运维|关键词


作者:SRE运维博客

博客地址:https://www.cnsre.cn/

文章地址:https://www.cnsre.cn/posts/221205544069/

相关话题:https://www.cnsre.cn/tags/aws/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决APP抓包问题「网络安全」

1.前言 在日常渗透过程中我们经常会遇到瓶颈无处下手&#xff0c;这个时候如果攻击者从APP进行突破&#xff0c;往往会有很多惊喜。但是目前市场上的APP都会为防止别人恶意盗取和恶意篡改进行一些保护措施&#xff0c;比如模拟器检测、root检测、APK加固、代码混淆、代码反调试…

挖出api接口的重要性

作为一名软件开发者&#xff0c;API是我们工作中不可或缺的一部分。无论是将不同系统连接起来&#xff0c;还是构建多组件应用程序&#xff0c;API都是我们的核心工具之一。在本文中&#xff0c;我们将深入讨论API的技术细节和实际应用。 一.首先&#xff0c;我们来看看什么是…

怎么把mkv格式改成mp4?不妨试试这几种方法吧!

怎么把mkv格式改成mp4&#xff1f;mp4是一种多媒体封装格式&#xff0c;不过我们通常会将它说成是视频格式&#xff0c;它可以在一个文件中容纳无限数量的视频、音频、图片或字幕轨道&#xff0c;mp4格式也是被我们每个人所熟知&#xff0c;因为我们每个人几乎每天都会接触或者…

Spring入门教程

目录 一、Spring最基本的使用 1.创建Maven项目(不需要模板) 2.添加Spring框架支持 3.添加启动类(没啥可说的符合规范即可) 4.创建bean对象 5.将bean对象注册到Spring中 (a)先在resources文件夹中创建一个xml文件(注意:是test文件用了.xml后缀 不是直接创建一个xml文件) (…

[ChatGPT] 从 GPT-3.5 到 GPT-5 的进化之路 | ChatGPT和程序员 : 协作 or 取代

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;…

FastDFS总结

目录 概述 什么是分布式文件系统 核心概念 目录结构 上传机制 下载机制 Linux中搭建FastDFS 常用指令 SpringBoot整合FastDFS FastDFS集成Nginx 概述 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件&#xff…

Android输入法不使用多客户端多屏适配-Android12

Android输入法不使用多客户端多屏适配-Android12 1、IME屏幕之间切换2、属性配置3、屏幕之间切换 IME 窗口 在非默认屏幕上运行的应用 1、IME屏幕之间切换 系统使用一个 IME&#xff0c;但可以在屏幕之间切换&#xff0c;以跟踪用户焦点。Android 10 默认所有第一方和第三方 IM…

【Android】试着写一个资讯界面(含不同板块)

跟着视频做的&#xff0c;并不能动脑子&#xff0c;于是自己顺一遍流程&#xff01;&#xff08;只阅读了部分教程&#xff0c;代码不完全相同&#xff09;&#xff08;仅为静态界面不含跳转&#xff09;&#xff08;在fragment上&#xff09;此为视频链接 成果图&#xff1a; …

07-HTML-链接标签

<a> 标签定义超链接&#xff0c;用于从一张页面链接到另一张页面。<a> 元素最重要的属性是 href 属性&#xff0c;它指示链接的目标。 属性值描述downloadfilename规定被下载的超链接目标。hrefURL规定链接指向的页面的 URL。pinglist_of_URLs规定以空格分隔的 UR…

YOLOv8 人体姿态估计(关键点检测) python推理 ONNX RUNTIME C++部署

目录 1、下载权重 ​2、python 推理 3、转ONNX格式 4、ONNX RUNTIME C 部署 1、下载权重 我这里之前在做实例分割的时候&#xff0c;项目已经下载到本地&#xff0c;环境也安装好了&#xff0c;只需要下载pose的权重就可以 2、python 推理 yolo taskpose modepredict model…

ESP32设备驱动-PCA9685 LED控制器驱动

PCA9685 LED控制器驱动 文章目录 PCA9685 LED控制器驱动1、PCA9685介绍2、硬件准备3、软件准备4、驱动实现1、PCA9685介绍 PCA9685 是一款 IC 总线控制的 16 通道 LED 控制器,针对红色/绿色/蓝色/琥珀色 (RGBA) 彩色背光应用进行了优化。 每个 LED 输出都有自己的 12 位分辨率…

scala中match使用报错Scala.matchError:(of class java.lang.String)

1.遇到错误 Scala.matchError:(of class java.lang.String) 2.发现问题出在match使用中,如下写法就会报错 val partitionIndex key.toString match {case "chinese" > 0case "math" > 1case "english" > 2} 3.后来修改了写法&#xf…

【大数据学习篇3】HDFS命令操作与MR单词统计

1. HDFS命令使用 [rootmaster bin]# su hd[hdmaster bin]$ #查看/目录[hdmaster bin]$ hdfs dfs -ls / 5 #在/目录创建一个为test名字的文件夹[hdmaster bin]$ hdfs dfs -mkdir /test#查看/目录[hdmaster bin]$ hdfs dfs -ls Found 1 itemsdrwxr-xr-x - hd supergroup …

【rust】| 04——语法基础 | 函数

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础_变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 函数1. 定义函数…

Lecture 15:元学习Meta Learning

目录 Review Machine Learning Introduction of Meta Learning What is Meta Learning? Meta Learning的三个步骤 Meta Learning的framework&#xff1a; ML v.s. Meta Meta Learning的training What is learnable in a learning algorithm? 初始化参数θ0 Optimiz…

用 Phthon 写抽奖程序

一共 10 人参与抽奖&#xff0c;四人中奖&#xff0c;其中一人固定不变。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a…

windows 打包 inno setup

1.下载并安装 inno setup 官网下载地址 点击下载并安装inno setup 软件,安装完成后点打开软件 在上图中点击 cancel 回到inno setup 的主界面 ①在主界面点击File -> New 然后在向导界面点击 next 填写安装信息点击next 如下图 点击next e 选择exe的位置, add folder …

实战打靶集锦-019-BTRSys2.1

提示&#xff1a;本文记录了博主的一次普通的打靶经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 FTP服务探查4.2 Apache服务探查4.2.1 wpscan扫描4.2.2 Metasploit神器4.2.3 手工探查页面4.2.3.1 Appearance Editor4.2.3.2 Plugins Editor 5. 提权5.1 系统信息枚…

KVM存储池管理与磁盘格式

KVM存储池管理与磁盘格式 KVM必须配置一个目录作为存储磁盘镜像&#xff08;存储卷&#xff09;的目录&#xff0c;我们称这个目录为存储池 存储池管理 默认存储池 /var/lib/libvirt/images/ 创建基于文件夹的存储池&#xff08;目录&#xff09; mkdir -p /data/vmfs定义…

详解MySQL覆盖索引、索引下推

目录 1.覆盖索引 1.1.概述 1.2.聚集索引、非聚集索引 1.3.回表查询 1.4.覆盖索引 2.索引下推 1.覆盖索引 1.1.概述 覆盖索引&#xff0c;是为了避免“回表查询”&#xff0c;从而降低查询耗时的一种使用索引的方法&#xff0c;所以要聊覆盖索引首先我们要知道什么是&qu…