2017-07-01 12 views
3

バイナリデータを返すためにpython lambdaを取得できません。サムネイル画像用のノードテンプレートは正常に動作しますが、動作するにはPythonラムダを取得できません。以下は私のラムダの関連する線です。 print("image_data " + image_64_encode)行は、base64でエンコードされたイメージをログに出力します。AWSのPythonでラムダ関数からバイナリデータを返す方法は?

def lambda_handler(event, context): 
    img_base64 = event.get('base64Image') 
    if img_base64 is None: 
     return respond(True, "No base64Image key") 

    img = base64.decodestring(img_base64) 
    name = uuid.uuid4() 
    path = '/tmp/{}.png'.format(name) 

    print("path " + path) 

    image_result = open(path, 'wb') 
    image_result.write(img) 
    image_result.close() 

    process_image(path) 

    image_processed_path = '/tmp/{}-processed.png'.format(name) 
    print("image_processed_path " + image_processed_path) 
    image_processed = open(image_processed_path, 'rb') 
    image_processed_data = image_processed.read() 
    image_processed.close() 
    image_64_encode = base64.encodestring(image_processed_data) 

    print("image_data " + image_64_encode) 


    return respond(False, image_64_encode) 


def respond(err, res): 
    return { 
     'statusCode': '400' if err else '200', 
     'body': res, 
     'headers': { 
      'Content-Type': 'image/png', 
     }, 
     'isBase64Encoded': 'true' 
    } 

私が間違っていることを指摘してください。

+0

ラムダはありますか? – Rahul

+0

解決策はありますか?私は同じ問題を抱えています。 – onurdegerli

答えて

0

私は約6ヶ月前に同じ問題に直面しました。 API Gateway、Python 2.7にバイナリサポート(そしてJSの例)があるようですが、Lambdaはまだ有効なバイナリレスポンスをサポートしておらず、Python 3.6についてはわかりません。

Base64でエンコードされたレスポンスには、JSONのラッピングが原因で問題が発生しています。私はカスタムJSをクライアントサイドに書いて、このJSONからベース64のイメージを手作業で取り出しましたが、これはまた貧弱な解決策でした。

結果をS3(CloudFrontの背後にある)にアップロードし、301をCloudFrontに返すとよい回避策のようです。私にとって最高の作品です。

0

私が知る限り、これはPython 3の場合もあります。バイナリデータ(バイト)を返そうとしています。それはまったく機能しません。

また、ベース64エンコーディングを使用しようとしましたが、私は成功しませんでした。

これは、APIゲートウェイとプロキシ統合を使用しています。

0

私はついにこれを理解しました。 Pythonのラムダからバイナリデータを返すことは可能です。

はこちらの指示に従ってください: https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/

チェック 'を使用ラムダプロキシ統合の新しいメソッドを作成してください。 THEN

return {'isBase64Encoded' : True, 
     'statusCode'  : 200, 
     'headers'   : { 'Content-Type': content_type }, 
     'body'    : base64_encoded_binary_data} 

はまた、あなたのPythonのラムダ反応がどのように見えることを確認し、あなたのルート/メソッドの問題のそれぞれについて

:AWSコンソールで

apigateway update-integration-response --rest-api-id <api-id> --resource-id <res-id> --http-method POST --status-code 200 --patch-operations "[{\"op\" : \"replace\", \"path\" : \"/contentHandling\", \"value\" : \"CONVERT_TO_BINARY\"}]" 

。 とAPI Gatewayの 'パン粉' EXで見ることができます。THEN

<api-id> = zdb7jsoey8 
<res-id> = zy2b5g 

: あなたは '配備API' にする必要があります。私が見つけたところからは、APIのデプロイ後にのみ機能しました。

展開する前に、必ず「バイナリメディアタイプ」を設定してください。

ヒント:ここ ニースAWSシェル端末:https://github.com/awslabs/aws-shell

pip install aws-shell 
関連する問題