gpt4 book ai didi

javascript - AWS Lambda w/Google Vision API 抛出 PEM_read_bio:no start line 或 Errno::ENAMETOOLONG

转载 作者:行者123 更新时间:2023-12-02 14:05:57 25 4
gpt4 key购买 nike

目标:用户上传到 S3,触发 Lambda 获取文件并发送给 Google Vision API 进行分析,返回结果。

根据this , google-cloud 需要 native 库,并且必须针对 lambda 运行的操作系统进行编译。使用 lambda-packager 会引发错误,但一些互联网搜索发现使用带有 Node 和 NPM 的 EC2 来运行安装。本着破解这个问题的精神,我就是这么做的,让它大部分正常工作*。至少 lambda 不再给我 ELF header 错误。

我当前的问题是,有两种方法可以调用 Vision API,两种方法都不起作用,而且都返回不同的错误(大多数情况下)。

<小时/>

通用代码:此代码始终相同,位于函数的顶部,我将其分开以使后面的代码块集中于该问题。

'use strict';

const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const Bucket = 'my-awesome-bucket';

const gCloudConfig = {
projectId: 'myCoolApp',
credentials: {
client_email: 'your.serviceapi@project.email.com',
private_key: 'yourServiceApiPrivateKey'
}
}
const gCloud = require('google-cloud')(gCloudConfig);
const gVision = gCloud.vision();
<小时/>

使用detect():此代码始终返回错误Error: error:0906D06C:PEMroutines:PEM_read_bio:no start line。理论上它应该有效,因为 URL 是公开的。通过搜索错误,我认为这可能是 HTTPS 问题,因此我什至尝试了一种变体,将 HTTPS 替换为 HTTP,但得到了相同的错误。

exports.handler = (event, context, callback) => {
const params = {
Bucket,
Key: event.Records[0].s3.object.key
}
const img = S3.getSignedUrl('getObject', params);
gVision.detect(img, ['labels','text'], function(err, image){
if(err){
console.log('vision error', err);
}
console.log('vision result:', JSON.stringify(image, true, 2));
});
}
<小时/>

使用detectLabels():此代码始终返回错误:ENAMETOOLONG:名称太长,打开..[base64中的图像].. .。根据建议,人们认为该方法不应该传递base64图像,而应该传递公共(public)路径;这可以解释为什么它说名称太长(base64 图像就是 URL)。不幸的是,这给出了上面的 PEM 错误。我还尝试过不进行 base64 编码并直接从 aws 传递对象缓冲区,但这也导致了 PEM 错误。

exports.handler = (event, context, callback) => {
const params = {
Bucket,
Key: event.Records[0].s3.object.key
}
S3.getObject(params, function(err, data){
const img = data.Body.toString('base64');
gVision.detectLabels(img, function(err, labels){
if(err){
console.log('vision error', err);
}
console.log('vision result:', labels);
});
});
}
<小时/>

根据Best Practices ,图像应该是base64编码的。

从 API 文档和示例以及其他内容来看,我似乎正确使用了这些。我感觉我已经将所有这些文档阅读了一百万遍。

如果 NAMETOOLONG 错误需要 base64 内容,我不确定如何处理。这些图像不超过 1MB。

*PEM 错误似乎与凭据有关,并且因为我了解所有这些凭据如何工作以及如何在 EC2(没有任何类型的 PEM 文件)上编译模块,这可能是我的问题问题。也许我需要在运行 npm install 之前设置一些凭据,类似于需要安装在 Linux 机器上?这开始超出了我的理解范围,所以我希望这里有人知道。

理想情况下,使用 Detect 会更好,因为我可以指定我想要检测的内容,但只要从 Google 获得任何有效响应就非常棒了。如果您能提供任何线索,我们将不胜感激。

最佳答案

因此,与另一位同事的对话让我考虑放弃整个 API 加载并使用 google-cloud 模块。相反,我应该考虑通过 curl 尝试 Cloud REST API,看看它是否可以这样工作。

长话短说,我解决这个问题的方法是发出 HTTP 请求并使用适用于 Google Cloud 的 REST API。

这是我现在可用的 lambda 函数。可能仍需要调整,但这正在起作用。

'use strict';

const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const Bucket = 'yourBucket';
const fs = require('fs');
const https = require('https');

const APIKey = 'AIza...your.api.key...kIVc';

const options = {
method: 'POST',
host: `vision.googleapis.com`,
path: `/v1/images:annotate?key=${APIKey}`,
headers: {
'Content-Type': 'application/json'
}
}

exports.handler = (event, context, callback) => {
const req = https.request(options, res => {
const body = [];
res.setEncoding('utf8');
res.on('data', chunk => {
body.push(chunk);
});
res.on('end', () => {
console.log('results', body.join(''));
callback(null, body.join(''));
});
});

req.on('error', err => {
console.log('problem with request:', err.message);
});

const params = {
Bucket,
Key: event.Records[0].s3.object.key
}
S3.getObject(params, function(err, data){
const payload = {
"requests": [{
"image": {
"content": data.Body.toString('base64')
},
"features": [{
"type": "LABEL_DETECTION",
"maxResults": 10
},{
"type": "TEXT_DETECTION",
"maxResults": 10
}]
}]
};

req.write(JSON.stringify(payload));
req.end();
});
}

关于javascript - AWS Lambda w/Google Vision API 抛出 PEM_read_bio:no start line 或 Errno::ENAMETOOLONG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40032758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com