ゴール:ユーザーがS3にアップロードすると、Lambdaがファイルを取得し、分析のためにGoogle Vision APIに送信し、結果を返します。Google Vision APIを投げているAWSラムダPEM_read_bio:開始行ないしErrno :: ENAMETOOLONG
thisによれば、google-cloud
にはネイティブライブラリが必要であり、ラムダが動作しているOSに対してコンパイルする必要があります。 lambda-packager
を使用するとエラーが発生しましたが、代わりにノードとNPMを含むEC2を使用してインターネット検索を開始しました。これをハックする精神の中で、それが私が主に働くようにしたのです。少なくともラムダは私にELFヘッダエラーを与えるのを止めました。
私の現在の問題は、Vision APIを呼び出す2つの方法があり、どちらも仕事とどちらも異なるエラー(ほとんど)を返さないことです。
共通コード:このコードは常に同じで、それは、関数の先頭にだ、と私は問題に焦点を当てた後のコードブロックを維持するために、それを分離しています。 detect()
使用
'use strict';
const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const Bucket = 'my-awesome-bucket';
const gCloudConfig = {
projectId: 'myCoolApp',
credentials: {
client_email: '[email protected]',
private_key: 'yourServiceApiPrivateKey'
}
}
const gCloud = require('google-cloud')(gCloudConfig);
const gVision = gCloud.vision();
:このコードは、常にエラーError: error:0906D06C:PEM routines:PEM_read_bio:no start line
を返します。理論的には、URLは公開されているため動作するはずです。エラーの検索から、私はHTTPSのものであると考えていたので、HTTPSをHTTPに置き換えたのと同じ変形を試しましたが、同じエラーがありました。 detectLabels()
を使用して
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));
});
}
:は、このコードは、常にError: ENAMETOOLONG: name too long, open ....[the image in base64]...
を返します。提案では、メソッドはbase64イメージを渡すべきではなく、パブリックパスを渡すべきだと考えられました。これは名前が長すぎると言う理由を説明します(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からの有効な回答を得るだけですばらしいことになります。皆さんが提供できる手がかりがあれば、大変感謝しています。
また、誰かがシバン全体にもっと多くのGoogle Cloudを使用することを提案する前に、それは現時点ではオプションではありません。 AWSに私が気づいていないVision APIに似たものがある場合は、教えてください。 – coblr