作者:SRE運維博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/221205544069/文章來源:http://www.zghlxwxcb.cn/news/detail-438702.html
相關(guān)話題:https://www.cnsre.cn/tags/aws/文章來源地址http://www.zghlxwxcb.cn/news/detail-438702.html
躺了好久,詐尸了。因為換了工作,所以比較忙一直沒有時間去更新博客的內(nèi)容(主要還是因為懶??)
話不多說 直接上干貨。
需求背景
最近在看費用的時候發(fā)現(xiàn)有很大一部分費用都是 cloudwatch log中存儲了大量的數(shù)據(jù),是因為ec2 將日志傳輸?shù)搅舜鎯Φ搅薱loudwatch中。這個存儲的多的查詢?nèi)罩镜臅r候收費特別的高。另外一個是因為數(shù)據(jù)分析用途,大數(shù)據(jù)分析的同事如果想那到數(shù)據(jù)的話,還是存儲在 S3 中是比較劃算和方便的,一個是拿取數(shù)據(jù)比較方便,另外一個是S3 可以最歸檔存儲,后面的大量數(shù)據(jù)可以分層儲存,以此來降低費用。
如果你也想將你的cloudwatch 中日志組中的日志存儲到S3中的話可以參考下這篇文章。
前置條件
-
創(chuàng)建 一個 S3 桶,并修改權(quán)限
-
創(chuàng)建 lambda 函數(shù)
-
有一個Cloudwatch 日志組并且有一天以上的日志
-
給 lambda分配所需的權(quán)限
創(chuàng)建 S3 桶并修改權(quán)限
{{< tabs 國內(nèi)S3桶權(quán)限配置 國外S3桶權(quán)限配置 >}}
{{< tab >}}
國內(nèi)S3桶權(quán)限配置
{
"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桶權(quán)限配置
{
"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 桶權(quán)限文檔鏈接
<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">
創(chuàng)建 lambda 函數(shù)
創(chuàng)建 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' # 日志組所在區(qū)域
bucket_name = '<bucket name>' #同區(qū)域內(nèi)的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 分配權(quán)限
-
AmazonS3的讀寫權(quán)限
-
CloudWatchLogsFullAccess
驗證桶內(nèi)的文件
最后會以日期的目錄將日志歸檔起來,以方便日后對歸檔文件進行梳理。
作者:SRE運維博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/221205544069/
相關(guān)話題:https://www.cnsre.cn/tags/aws/
到了這里,關(guān)于使用 Lambda 函數(shù)將 CloudWatch Log 中的日志歸檔到 S3 桶中的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!