-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Description
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
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:
- Indicate that the
BinaryMediaTypesoption 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.
- Indicate that the
-
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