Localstack-使用Terraform启用二进制支持的AWS API网关

Localstack-使用Terraform启用二进制支持的AWS API网关,terraform,aws-api-gateway,localstack,Terraform,Aws Api Gateway,Localstack,我无法在Localstack上使用带有Terraform的API网关启用二进制支持 这个例子很简单:Lambda生成类似于Github的化身,并将图像返回为PNG Lambda(代理)与API网关集成(其思想是:GET/avatars/{username}->image/png) 当我调用发布的URL时(我在Localstack上这样做),API总是返回Base64编码的图像,而不应用CONVERT\u TO\u BINARY 以下是基本步骤 创建ReST API: 创建GET/avatars/

我无法在Localstack上使用带有Terraform的API网关启用二进制支持

这个例子很简单:Lambda生成类似于Github的化身,并将图像返回为PNG

Lambda(代理)与API网关集成(其思想是:
GET/avatars/{username}
->image/png)

当我调用发布的URL时(我在Localstack上这样做),API总是返回Base64编码的图像,而不应用
CONVERT\u TO\u BINARY

以下是基本步骤

  • 创建ReST API:
  • 创建
    GET/avatars/{username}
    端点:
  • GET/avatars/{username}
    端点集成到ReST API中:
  • 部署ReST API:
  • API网关假定文本数据是base64编码的字符串,并将二进制数据作为base64解码的blob输出

    这里是简单的Lambda处理程序(当然是非常棒的!)

    func处理程序(ctx context.context,evt events.APIGatewayProxyRequest)(events.APIGatewayProxyResponse,error){
    log.Printf(“正在处理请求%s的请求数据。\n”,evt.RequestContext.RequestID)
    用户名:=evt.PathParameters[“用户名”]
    如果len(用户名)==0{
    代码:=http.StatusBadRequest
    msg:=http.StatusText(代码)
    return events.APIGatewayProxyResponse{Body:msg,StatusCode:code},nil
    }
    键:=[]字节{0x00、0x11、0x22、0x33、0x44、0x55、0x66、0x77、0x88、0x99、0xAA、0xBB、0xCC、0xDD、0xEE、0xFF}
    图标:=identicon.New7x7(键)
    log.Printf(“正在为“%s”创建标识图标,\n”,用户名)
    pngdata:=icon.Render([]字节(用户名))
    body:=base64.StdEncoding.EncodeToString(pngdata)//我将“*/*”用作二进制媒体类型,而不是其他类型。我在某个地方读到,如果指定某个内容,客户端需要发送相同的接受内容头

    我也没有aws\u api\u网关\u集成\u响应资源

    最后,我以字节数组的形式返回原始图像字节。我使用Kotlin来实现我的lambda,但是下面应该给你一个方法

    @Get("/{id}/avatar")
    fun getImage(id: Long): HttpResponse<ByteArray> {
        logger.info { "AvatarController.getImage($id)" }
        val image = avatarService.getImage(id)
        val bytes: ByteArray = IOUtils.toByteArray(image)
        return HttpResponse.ok(bytes).contentType(MediaType.APPLICATION_OCTET_STREAM_TYPE)
    
    @Get(“/{id}/avatar”)
    fun getImage(id:Long):HttpResponse{
    logger.info{“AvatarController.getImage($id)”}
    val image=avatarService.getImage(id)
    val bytes:ByteArray=IOUtils.toByteArray(图像)
    返回HttpResponse.ok(bytes).contentType(MediaType.APPLICATION\u OCTET\u STREAM\u TYPE)
    

    不要使用Base64编码,也不要使用APIGatewayProxyResponse。

    我也遇到过同样的问题,到目前为止我所做的所有研究都表明,API网关实现不支持二进制媒体类型。
    # ReST API endpoint 'avatars'
    resource "aws_api_gateway_resource" "avatars" {
      rest_api_id = aws_api_gateway_rest_api.api.id
      parent_id   = aws_api_gateway_rest_api.api.root_resource_id
      path_part   = "avatars"
    }
    
    # 'avatars' endpoint resource path parameter.
    resource "aws_api_gateway_resource" "resource" {
      rest_api_id = aws_api_gateway_rest_api.api.id
      parent_id   = aws_api_gateway_resource.avatars.id
      path_part   = "{username}"
    }
    
    # Defines the resource HTTP method (verb or action).
    resource "aws_api_gateway_method" "get-avatar" {
      rest_api_id   = aws_api_gateway_rest_api.api.id
      resource_id   = aws_api_gateway_resource.resource.id
      http_method   = "GET"
      authorization = "NONE"
    
      request_parameters = {
        "method.request.path.username" = true
      }
    }
    
    resource "aws_api_gateway_integration" "resource_integration" {
      rest_api_id             = aws_api_gateway_rest_api.api.id
      resource_id             = aws_api_gateway_resource.resource.id
      http_method             = aws_api_gateway_method.get-avatar.http_method
      type                    = "AWS_PROXY"
      integration_http_method = "POST"
      uri                     = aws_lambda_function.lambda.invoke_arn
      passthrough_behavior    = "WHEN_NO_MATCH"
    
      request_parameters = {
        "integration.request.path.id" = "method.request.path.username"
      }
    }
    
    resource "aws_api_gateway_integration_response" "get-avatar-response" {
      rest_api_id      = aws_api_gateway_rest_api.api.id
      resource_id      = aws_api_gateway_resource.resource.id
      http_method      = aws_api_gateway_method.get-avatar.http_method
      status_code      = "200"
      content_handling = "CONVERT_TO_BINARY"
    }
    
    resource "aws_api_gateway_deployment" "deployment" {
      rest_api_id = aws_api_gateway_rest_api.api.id
      stage_name  = "stage"
      depends_on  = [aws_api_gateway_method.get-avatar, aws_api_gateway_integration.resource_integration]
    }
    
    @Get("/{id}/avatar")
    fun getImage(id: Long): HttpResponse<ByteArray> {
        logger.info { "AvatarController.getImage($id)" }
        val image = avatarService.getImage(id)
        val bytes: ByteArray = IOUtils.toByteArray(image)
        return HttpResponse.ok(bytes).contentType(MediaType.APPLICATION_OCTET_STREAM_TYPE)