我有一个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.post
的files
参数可以是包含文件名键和文件内容值的字典。(请求确实支持传递打开的文件,但这对您来说似乎没有价值)。
对于您,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'}