Description
When enabling AWS::ApiGateway::RestApi's BinaryMediaTypes for a particular type (such as application/json), this causes the request's body to have been Base64-encoded when received, as well as the expected behaviour of allowing the API to return binary data as a Base64-encoded body within the response payload.
This is unexpected behaviour given the documentation (see below for why), or it could be a bug. Getting clarification on which it is is critical to the use of these resources in AWS; if a documentation issue, the published info should be clearly explained.
The docs on AWS::ApiGateway::RestApi's BinaryMediaTypes suggests this only affects the response (emphasis mine):
List of MIME types that your API could return. Use this to enable binary support for APIs. Use ~1 instead of / in the mime types.
AWS CloudFormation compatibility: This property is similar to the BinaryMediaTypes property of an AWS::ApiGateway::RestApi resource. The list of BinaryMediaTypes is added to both the AWS CloudFormation resource and the OpenAPI document.
The docs above appear outdated as the Use ~1 instead of / in the mime types. reference no long applies - using application/json works fine via SAM locally and when deployed to production AWS. Online resources such as this StackOverflow answer suggest confusion and suggest the AWS docs were wrong and that the AWS::ApiGateway::RestApi has since been fixed up.
On the linked AWS::ApiGateway::RestApi, the docs are unclear:
BinaryMediaTypes: The list of binary media types supported by the RestApi. By default, the RestApi supports only UTF-8-encoded text payloads.
Steps to reproduce
Resources:
MyAPI:
Type: AWS::Serverless::Api
Properties:
StageName: prod
BinaryMediaTypes: ["application/json"]
Observed result
- Deploy a SAM template such as that above, with a corresponding Lambda function
- Observe that in an AWS Lambda function, the
isBase64Encoded property on the request is true and the body is encoded with Base64.
Expected result
-
Establish if the behaviour of Base64-encoding the request payload body when BinaryMediaTypes is enabled is expected.
-
Update the documentation for https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-binarymediatypes accordingly:
- Indicate that the
BinaryMediaTypes option will Base64-encode the request body and require that the response body be Base64-encoded.
- Remove or correct the
Use ~1 instead of / in the mime types. reference.
-
Update the document for https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-binarymediatypes accordingly to indicate the same impact above.
If the behaviour is not correct, then the resolution would be to fix how SAM and AWS operate.
Additional environment details
- OS: Ubuntu 24.04
- If using the SAM CLI,
sam --version: SAM CLI, version 1.142.1
- AWS region:
us-east-1
Description
When enabling
AWS::ApiGateway::RestApi'sBinaryMediaTypesfor a particular type (such asapplication/json), this causes the request's body to have been Base64-encoded when received, as well as the expected behaviour of allowing the API to return binary data as a Base64-encoded body within the response payload.This is unexpected behaviour given the documentation (see below for why), or it could be a bug. Getting clarification on which it is is critical to the use of these resources in AWS; if a documentation issue, the published info should be clearly explained.
The docs on
AWS::ApiGateway::RestApi'sBinaryMediaTypessuggests this only affects the response (emphasis mine):The docs above appear outdated as the
Use ~1 instead of / in the mime types.reference no long applies - usingapplication/jsonworks fine via SAM locally and when deployed to production AWS. Online resources such as this StackOverflow answer suggest confusion and suggest the AWS docs were wrong and that theAWS::ApiGateway::RestApihas since been fixed up.On the linked
AWS::ApiGateway::RestApi, the docs are unclear:Steps to reproduce
Observed result
isBase64Encodedproperty on the request istrueand thebodyis encoded with Base64.Expected result
Establish if the behaviour of Base64-encoding the request payload body when
BinaryMediaTypesis enabled is expected.Update the documentation for https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-binarymediatypes accordingly:
BinaryMediaTypesoption will Base64-encode the request body and require that the response body be Base64-encoded.Use ~1 instead of / in the mime types.reference.Update the document for https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-binarymediatypes accordingly to indicate the same impact above.
If the behaviour is not correct, then the resolution would be to fix how SAM and AWS operate.
Additional environment details
sam --version:SAM CLI, version 1.142.1us-east-1