簡體   English   中英

從AWS Lambda函數中的S3獲取對象並發送到Api Gateway

[英]Get object from S3 in AWS Lambda function and send to Api Gateway

我試圖從桶中獲取.jpg文件並將其發送回api網關。 我相信我的設置正確,因為我看到記錄的東西。 它從s3中獲取文件,gm是graphicsmagick庫。 不知道我是否正在使用它。

在lambda函數中我這樣做(很多代碼來自aws示例):

async.waterfall([
    function download(next) {
        console.log(srcKey);
        console.log(srcBucket);
        // Download the image from S3 into a buffer.
        s3.getObject({
                Bucket: srcBucket,
                Key: srcKey
            },
            next);
        },
    function transform(response, next) {
        console.log(response);
        next(null, 'image/jpeg', gm(response.Body).quality(85));

    },

    function sendData(contentType, data, next){
        console.log(contentType);
        console.log(data);
        imageBuffer = data.sourceBuffer;
        context.succeed(imageBuffer);
    }
    ]
);

響應頭的內容長度為:85948,這似乎不對,因為原始文件只有36kb。 誰知道我做錯了什么?

您可以輕松實現Get Image < - > API Gateway < - > Lambda < - > S3集成。

在lambda中,而不是json,返回image的base64字符串表示形式( buffer.toString('base64') ),強制API網關將字符串轉換為二進制並添加特定的Content-Type (因此您不需要使用他們有限的二進制支持,強制您發送特定的Accept標頭)。

在AWS控制台中,轉到API網關,然后轉到相關方法並更新設置:

  • 集成請求

    • 取消選中: 使用Lambda Proxy集成
  • 方法響應

    • 添加響應 - > HTTP狀態: 200
    • 添加標題: 內容類型
  • 集成響應 - >標題映射 - >響應標頭 - >內容類型

    • 映射值: 'image / jpeg' (單引號)

從命令行,運行以下命令強制將字符串轉換為二進制。 首先,從API網關檢索rest-api-idresource-id 然后,在CLI中運行(用您自己的替換rest-api-id和resource-id):

aws apigateway put-integration-response --rest-api-id <rest-api-id> --resource-id <resource-id> --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY

Lambda一起使用時,不應使用API Gateway傳回二進制內容。 使用Lambda API Gateway設置為使用XML/JSON數據進行響應。 詳細了解為何以及如何在這里

嘗試更改回調鏈,以便將修改后的圖像上傳回S3 成功上載后,發回目標對象的URI並將客戶端重定向到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM