将所有日志附加到文本文件中,并通过AWS lambda python脚本发送到slack



我有一个python脚本,从aws cloudwatch收集数据并将其发送到slack。它工作得很好。它在slack通道中以文本形式向slack发送日志。

我想要相同的日志数据存储在一个文本文件,并将其发送到slack。我不喜欢python,所以请原谅我的代码。

在下面的代码中,我试图创建一个文件,并使用消息变量写入txt文件以存储文本。

同时用files=file_dict去除json=message

#  json=message
response = requests.post(slack_webhook_url,files=file_dict)

Python

import boto3
import requests
import json
def lambda_handler(event, context):
print(event)
build_id = event['detail']['build-id'].split(':')[-1]
logs_client = boto3.client('logs')
log_group_name = "/aws/codebuild/" + event['detail']['project-name']
log_stream_name = build_id
response = logs_client.get_log_events(
logGroupName=log_group_name,
logStreamName=log_stream_name,
startFromHead=True
)

message = {
'text': 'Logs for build {0}:n'.format(build_id)
}
for event in response['events']:
message['text'] += event['message'] + 'n'
slack_webhook_url = 'https://hooks.slack.com/services/123123123/123123123/123123123';


with open("/tmp/codebuild-logs.txt", "w") as a_file:
a_file.write(message)
file_dict = {"/tmp/codebuild-logs.txt": a_file}
#  json=message
response = requests.post(slack_webhook_url,files=file_dict)
if response.status_code == 200:
return {
'statusCode': 200,
'body': 'Message is sent to Slack successfully.'
}
else:
return {
'statusCode': response.status_code,
'body': 'Failed to send message to Slack.'
}

运行此脚本后,我得到lambda错误。

Response
{
"errorMessage": "write() argument must be str, not dict",
"errorType": "TypeError",
"stackTrace": [
"  File "/var/task/lambda_function.py", line 36, in lambda_handlern    a_file.write(message)n"
]
}

任何帮助都将非常感激。提前谢谢。

这是一个如何用requests发布文件内容的例子:

import requests
resp = requests.post(
"https://httpbin.org/post",
files={"codebuild-logs.txt": "thisnisnfilencontent" },
)
print(resp.json())

注意这里我没有打开任何文件。reqest.postfiles参数可以是包含文件名键和文件内容值的字典。(请求确实支持传递打开的文件,但这对您来说似乎没有价值)。

对于您,message是您想要发送的内容。您需要将其转换为字符串—为此,json非常好。

下面是一些示例数据在一个帖子作为一个文件的内容:

import requests, json
message = [ "example", { "structured": True } ]
resp = requests.post(
"https://httpbin.org/post",
files={"codebuild-logs.txt": json.dumps(message) }
)
print(resp.json())

如果你运行它,你会得到这样的东西:

{'args': {}, 'data': '', 'files': {'codebuild-logs.txt': '["example", {"structured": true}]'}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '201', 'Content-Type': 'multipart/form-data; boundary=547bda61944fabd988686b4642024c26', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.26.0', 'X-Amzn-Trace-Id': 'Root=1-642db855-153edb2f6bd09c9d1b5bd604'}, 'json': None, 'origin': 'xxx.xxx.xxx.xxx', 'url': 'https://httpbin.org/post'}

最新更新