AWS Lambda: errorMessage 进程在完成请求之前退出
AWS Lambda: errorMessage 进程在完成请求之前退出
大家好,我是Android的新手!
我想要从Android客户端向服务器上传图像文件(服务器会生成缩略图,并返回缩略图的URL)。
然而,我遇到了以下错误信息:
{"errorMessage":"RequestId: 8e2a21b8-e62e-11e8-8585-d9b6fdfec9b9 Process exited before completing request"}!
我尝试在stackoverflow上查找这个错误代码,但是没有找到Android的答案。
请帮助我,或者给我一个能解决这个问题的链接...
以下是服务器代码:
const AWS = require('aws-sdk'); const multipart = require("parse-multipart"); const s3 = new AWS.S3(); const bluebird = require('bluebird'); exports.handler = function(event, context) { let result = []; const bodyBuffer = new Buffer(event['body-json'].toString(), 'base64'); const boundary = multipart.getBoundary(event.params.header['Content-Type']); const parts = multipart.Parse(bodyBuffer, boundary); const files = getFiles(parts); return bluebird.map(files, file => { console.log('UploadCall'); return upload(file) .then( data => { result.push({ 'bucket': data.Bucket, 'key': data.key, 'fileUrl': file.uploadFile.fullPath }) console.log( `DATA => ${JSON.stringify(data, null, 2 )}`); }, err => { console.log(`S3 UPLOAD ERR => ${err}`); } ) }) .then(_=> { return context.succeed(result); }); } let upload = function(file) { console.log('PutObject Call') return s3.upload(file.params).promise(); }; let getFiles = function(parts) { let files = []; parts.forEach(part => { const buffer = part.data const fileName = part.filename; const fileFullName = fileName; const originBucket = 'dna-edge/images'; const filefullPath = `https://s3.ap-northeast-2.amazonaws.com/${originBucket}/${fileFullName}`; const params = { Bucket: originBucket, Key: fileFullName, Body: buffer }; const uploadFile = { size: buffer.toString('ascii').length, type: part.type, name: fileName, fullPath: filefullPath }; files.push({ params, uploadFile }) }); return files; };
这是客户端代码。(imgURL看起来像/storage/emulated/0/DCIM/img/1493742568136.jpg)
public static String requestHttpPostLambda(String url, String imgURL){ /* await axios.post(`${AWS_LAMBDA_API_URL}?type=${type}`, formData, { headers: { 'Content-Type': 'multipart/form-data' }}) .then((response) => {result = response}); */ String result=null; try { HttpClient client = new DefaultHttpClient(); String postURL = url; HttpPost post = new HttpPost(postURL); post.setHeader("Content-Type", "multipart/form-data"); File file = new File(imgURL); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("image", new FileBody(file)); post.setEntity(builder.build()); HttpResponse responsePOST = client.execute(post); Log.e("HttpResponse", responsePOST.getStatusLine()+""); HttpEntity resEntity = responsePOST.getEntity(); if (resEntity != null) { result = EntityUtils.toString(resEntity); } } catch (Exception e) { e.printStackTrace(); } return result; }
AWS Lambda是亚马逊提供的一种无服务器计算服务,可以在云上运行代码而无需预先部署或管理服务器。在使用AWS Lambda时,有时会遇到一个错误消息"Process exited before completing request",下面我们来分析这个问题的原因和解决方法。
首先,根据提供的代码示例,可以看出问题可能出现在使用了`context.succeed`的地方。实际上,AWS在更新文档方面不够及时,不推荐使用`context.succeed`,而是应该使用作为第三个参数传递的回调函数`callback`。
另外,建议使用Node 8.10版本的运行环境,这样就可以使用`async/await`语法,而不必再使用Promise/then模式。
以下是一个解决方案的示例代码:
export default(event, context, callback) => { try { // 执行一些操作 callback(null, SOME_VALID_HTTP_RESPONSE) } catch(e){ callback(e, null) } }
关于Lambda函数失败的原因有很多,如果进程在完成请求之前退出,可能是因为发生了崩溃,或者没有返回有效的HTTP响应(如果你的Lambda函数在API Gateway后面)。
解决这个问题有两个方法:
首先,可以在CloudWatch中查找Lambda函数名称,并检查最新日志以查找错误消息。
其次,可以参考这个答案,当函数执行成功时,需要返回一个有效的HTTP响应给API Gateway。可以使用那里提供的代码示例:
callback(null, responder.success({someJson: someValue}))
如果还有其他问题,请随时向我提问。