【发布时间】:2019-10-24 07:52:46
【问题描述】:
我正在尝试使用 aws 中的 lambda 将数据从 s3 移动到 es。我想测试我的功能,但我认为我的文件格式不正确,因此会导致错误。
我的 lambda 函数如下所示:
region = 'ap-northeast-2' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'my-es-domain' # the Amazon ES domain,
index = 'lambda-s3-index'
type = 'lambda-type'
url = host + '/' + index + '/' + type
headers = { "Content-Type": "application/json" }
s3 = boto3.client('s3')
# Regular expressions used to parse some simple log lines
ip_pattern = re.compile('(\d+\.\d+\.\d+\.\d+)')
time_pattern = re.compile('\[(\d+\/\w\w\w\/\d\d\d\d:\d\d:\d\d:\d\d\s-\d\d\d\d)\]')
message_pattern = re.compile('\"(.+)\"')
# Lambda execution starts here
def handler(event, context):
for record in event['Records']:
# Get the bucket name and key for the new file
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
# Get, read, and split the file into lines
obj = s3.get_object(Bucket=bucket, Key=key)
body = obj['Body'].read()
lines = body.splitlines()
# Match the regular expressions to each line and index the JSON
for line in lines:
ip = ip_pattern.search(line).group(1)
timestamp = time_pattern.search(line).group(1)
message = message_pattern.search(line).group(1)
document = { "ip": ip, "timestamp": timestamp, "message": message }
r = requests.post(url, auth=awsauth, json=document, headers=headers)
我已将测试事件正确配置到存储桶中的文件。当我测试它时输出:
Response:
{
"errorMessage": "cannot use a string pattern on a bytes-like object",
"errorType": "TypeError",
"stackTrace": [
" File \"/var/task/lambdaPackage.py\", line 40, in handler\n ip = ip_pattern.search(line).group(1)\n"
]
}
我认为这是我的文件的问题。 我的文件在 sample.log 文件中,如下所示:
12.345.678.90 - [10/Oct/2000:13:55:36 -0700] "PUT /some-file.jpg"
12.345.678.91 - [10/Oct/2000:14:56:14 -0700] "GET /some-file.jpg"
如何格式化它例如:使用 .py、.json 等...这是我第一次使用 aws 和 log Infos。提前致谢!
我已经尝试以这种格式创建另一个文件:
12.345.678.90 - [10/Oct/2000:13:55:36 -0700] "PUT /some-file.jpg"\n
12.345.678.91 - [10/Oct/2000:14:56:14 -0700] "GET /some-file.jpg"
输出相同的错误。
【问题讨论】:
-
Elasticsearch 输入数据必须是有效的 JSON,你应该格式化你想要转发的文件为 JSON。elastic.co/guide/en/elasticsearch/reference/current/…
-
顺便说一句,弹性使用的每一行都可以使用批量操作,而不是插入,在一次调用中插入多个对象。
-
所以在s3日志中必须是json格式?如果不是我需要转换它吗?
-
没错,我会尽快检查您的 lambda,如果有任何问题会通知您
-
您可以打印文档变量并与我们分享吗?
标签: amazon-web-services amazon-s3 aws-lambda