Binary Support for API Integrations with Amazon API Gateway
Masuo Gates, Software Development Manager
A year ago, the Microservices without the Servers post showed how Lambda can be used for creating image thumbnails. This required the client to Base64 encode the binary image file before calling the image conversion API as well as Base64 decode the response before it could be rendered. With the recent Amazon API Gateway launch of Binary Support for API Integrations, you can now specify media types that you want API Gateway to treat as binary and send and receive binary data through API endpoints hosted on Amazon API Gateway.
After this feature is configured, you can specify if you would like API Gateway to either pass the Integration Request and Response bodies through, convert them to text (Base64 encoding), or convert them to binary (Base64 decoding). These options are available for HTTP, AWS Service, and HTTP Proxy integrations. In the case of Lambda Function and Lambda Function Proxy Integrations, which currently only support JSON, the request body is always converted to JSON.
In this post, I show how you can use the new binary support in API Gateway to turn this Lambda function into a public API, which you can use to include a binary image file in a POST request and get a thumbnail version of that same image. I also show how you can now use API Gateway and Lambda to create a thumbnail service, which you can use to include a binary image file in a POST request and get a thumbnail version of the same image.
To get started, log in to the AWS Management Console to set up a Lambda integration, using the image-processing-service blueprint.
Create the Lambda function
In the Lambda console, choose Create a Lambda Function.
In the blueprint filter step, for Select runtime , type in ‘image’ and then choose image-processing-service.
Do not set up a trigger. Choose Next.
In the Configure function step, specify the function name, such as ‘thumbnail’.
In the Lambda function handler and role step, for Role , choose Create new role from template(s), and specify the role name (e.g., ‘myMicroserviceRole’). Finally, choose Next. For more details, see AWS Lambda Permissions Model.
Review your Lambda function configuration and choose Create Function.
You have now successfully created the Lambda function that will create a thumbnail.
Create an API and POST method
In this section, you set up an API Gateway thumbnail API to expose a publically accessible RESTful endpoint.
In the API Gateway console, choose Create API.
For API name , enter ‘Thumbnail’, add a description, and choose Create API.
In the created API, choose Resources , Actions , and Create Method.
To create the method, choose POST and select the checkmark.
To set up the POST method, for Integration type , select Lambda Function , select the appropriate Lambda region, and enter ‘thumbnail’ for Lambda Function. Choose Save.
In the Add Permission to Lambda Function dialog box, choose OK to enable API Gateway to invoke the ‘thumbnail’ Lambda function.
Set up the integration
Now, you are ready to set up the integration. In the main page, open Integration Request.
On the Integration Request page, expand Body Mapping Templates.
For Request body passthrough , choose When there are no templates defined (recommended). For Content-Type , enter “image/png”.
Choose Add mapping template and add the following template. The thumbnail Lambda function requires that you pass an operation to execute, in this case “thumbnail”, and the image payload “base64Image” you are passing in, which is “$input.body”. Review the following JSON and choose Save.
Specify which media types need to be handled as binary. Choose [API name], Binary Support.
Choose Edit , specify the media type (such as “image/png”) to be handled as binary, and then choose Save.
Now that the API is configured, you need to deploy it. On the thumbnail Resources page, choose Action , Deploy API.
For Deployment stage , select [New Stage], specify a stage name, and then choose Deploy.
A stage has been created for you; you receive the Invoke URL value to be used for your thumbnail API.
Now, you are ready to test the newly created API. Download your favorite .png image (such as apigateway.png), and issue the following curl command. Update the .png image file name and the Invoke URL value accordingly.
$ curl --request POST -H "Accept: image/png" -H "Content-Type: image/png" --data-binary "@apigateway.png" https://XXXXX.execute-api.us-east-1.amazonaws.com/prod > apigateway-thumb.png
You should now be able to open the created images in your favorite image viewer to confirm that resizing has occurred.
This is just one example of how you can leverage the new binary capabilities of Binary Support in API Gateway. For more examples, see the API Gateway Payload Encodings topic in the Amazon API Gateway Developer Guide.
If you have questions or suggestions, please comment below.