从AWS Lambda函数中的S3获取对象并发送到Api Gateway

cmk*_*cmk 5 amazon-s3 amazon-web-services node.js aws-lambda aws-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);
    }
    ]
);
Run Code Online (Sandbox Code Playgroud)

响应头的内容长度为:85948,这似乎不对,因为原始文件只有36kb.谁知道我做错了什么?

len*_*ten 5

您可以轻松实现 Get Image <-> API Gateway <-> Lambda <-> S3 集成。

在 lambda 中,而不是 json,返回图像 ( buffer.toString('base64')) 的 Base64 字符串表示形式,强制 API Gateway 将字符串转换为二进制并添加特定的Content-Type(因此您不需要使用其有限的二进制支持来强制您发送特定的 Accept 标头)。

在 AWS 控制台中,转到 API Gateway,然后转到相关方法并更新设置:

  • 整合请求

    • 取消选中:使用 Lambda 代理集成
  • 方法响应

    • 添加响应 -> 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
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法通过 Lambda 代理集成来做到这一点?当我取消选中“使用 Lambda 代理集成”时,我的查询字符串不再传递给 Lambda 函数。 (2认同)

kix*_*orz 2

当您API Gateway将其与Lambda. API GatewaywithLambda设置为以XML/JSON数据响应。请在此处阅读有关原因和方法的更多信息。

尝试更改您的回调链,以便将修改后的图像上传回S3. 上传成功后,发回URI目标对象并将您的客户端重定向到该目标对象。