Using Amazon SQS directly from Amazon API Gateway

big_queue_3

A project I’m working on right now uses Amazon’s SQS service to handle interprocess communication between elements of a large and complex back end architecture.  SQS is a fully managed message queuing service that enables you to decouple and scale microservices, distributed systems, and serverless applications. Using SQS, you can send, store, and receive messages between software components at any volume, without losing messages or requiring other services to be available.

One of our uses cases requires a SQS message to be triggered and created by an external call to our API. The most common way of handling this is to use a Lambda function to respond to an API request and then the Lambda function will create the appropriate SQS message and add it to the queue. What if we could skip Lambda all together? Amazon API Gateway can now be used to directly created SQS messages.

High level steps I followed

  1. Created an Amazon SQS queue.
  2. Created an Amazon IAM policy and role (to access the SQS queue).
  3. Published an API on API Gateway.
  4. Send and receive messages (single and batch) through the API Gateway.

<>

Details on #3 (Published an API on API Gateway)

  • created a new api at https://us-west-2.console.aws.amazon.com/apigateway/
  • created resources /v1/send/
  • created GET method /v1/send/GET
  • added URL query string ‘MessageBody’ to method execution for GET
  • added Integration request that points to appropriate SQS ARN
    • Integration type: AWS Service
      AWS Region: us-west-2
      AWS Service: Simple Queue Service (SQS)
      AWS Subdomain: NULL
      HTTP method: GET
      Path override: 453862545997/ninegeartest (SQS ARN)
      Execution role: arn:aws:iam::453862545997:role/apigateway-sqs-ninthgear-access-role
      Credentials cache: Do not add caller credentials to cache key
      Content Handling: Passthrough
      Use Default Timeout

      URL Query String Parameters:

      Action ‘SendMessage’
      MessageBody method.request.querystring.MessageBody

      MessageBody=TestMessageHello

  •  

    Used API Gateway Test function to call /v1/send/GET with MessageBody and then confirmed it appeared correctly in the previously created queue

    Response is

    {
    “SendMessageResponse”: {
    “ResponseMetadata”: {
    “RequestId”: “dfc617e1-b3c9-56a8-b9bf-426457676e2d”
    },
    “SendMessageResult”: {
    “MD5OfMessageAttributes”: null,
    “MD5OfMessageBody”: “0ef0d7773a388095bee26966144cc131”,
    “MessageId”: “3eb7ed29-c259-4b15-8bd3-bedeac865ee5”,
    “SequenceNumber”: null
    }
    }
    }

    Logs

    Execution log for request 01e665e2-9394-11e9-80e3-7b3c608a2b3c
    Thu Jun 20 19:45:50 UTC 2019 : Starting execution for request: 01e665e2-9394-11e9-80e3-7b3c608a2b3c
    Thu Jun 20 19:45:50 UTC 2019 : HTTP Method: GET, Resource Path: /v1/send
    Thu Jun 20 19:45:50 UTC 2019 : Method request path: {}
    Thu Jun 20 19:45:50 UTC 2019 : Method request query string: {MessageBody=TestMessageHello}
    Thu Jun 20 19:45:50 UTC 2019 : Method request headers: {}
    Thu Jun 20 19:45:50 UTC 2019 : Method request body before transformations:
    Thu Jun 20 19:45:50 UTC 2019 : Endpoint request URI: https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&MessageBody=TestMessageHello
    Thu Jun 20 19:45:50 UTC 2019 : Endpoint request headers: {Authorization=*************************************************************************************************************************************************************************************************************************************************01fa36, X-Amz-Date=20190620T194550Z, x-amzn-apigateway-api-id=mf9zjl6bxj, Accept=application/json, User-Agent=AmazonAPIGateway_mf9zjl6bxj, X-Amz-Security-Token=AgoGb3JpZ2luEK///////////wEaCXVzLXdlc3QtMiKAAkhESmjWUuH4MmwXcX3mJZu1ZFF29by1qO8Y/mUjx1llmQ6VlpkceQ2wnYfz8Gr4loy/CxqjjQeKa4Zpz83c1c5aEV7LrX4XlBIFxH5c+0O/BHA4Y6JbcSCSzc2z/Y6AUpvBnrfdE+S7TAqQw0aXzDTVfoFiysOFhatFmGfDa3TmXbNje6yqsj2QJKcTpI2D8KlN1IqUcuIMyYW06j8iZlcDcDuaB9BNtw3cNimdZpvUknaOr6HZ9kaSmhhIGnyRYxTN7bEnsqEGQY00p1Xsr8Q8JTrAaiHYSZA+964bBPWbladcrBPPvYGw111yV8teyabwJ6BczFmPHONyKNBSEbwqigMIlf//////////ARAAGgw0NTM4NjI1NDU5OTciDJAFb/8TLGKSTv3VkireAptIn3MrBh0o+01/ckMLSEM8kpHeFlnXhWeqfbQ11PIEH36/I7ahYyZE0Z7eS8fGbZ4DQmXDjB5D2Z6Y8Wo8b1gfnxZ7MwGdYhDlo/x4KeE7R92XbhPX+tAEsL61TMx6Pls7c9 [TRUNCATED]
    Thu Jun 20 19:45:50 UTC 2019 : Endpoint request body after transformations:
    Thu Jun 20 19:45:50 UTC 2019 : Sending request to https://sqs.us-west-2.amazonaws.com/453862545997/ninegeartest?Action=SendMessage&MessageBody=TestMessageHello
    Thu Jun 20 19:45:50 UTC 2019 : Received response. Status: 200, Integration latency: 18 ms
    Thu Jun 20 19:45:50 UTC 2019 : Endpoint response headers: {x-amzn-RequestId=dfc617e1-b3c9-56a8-b9bf-426457676e2d, Date=Thu, 20 Jun 2019 19:45:50 GMT, Content-Type=application/json, Content-Length=276}
    Thu Jun 20 19:45:50 UTC 2019 : Endpoint response body before transformations: {“SendMessageResponse”:{“ResponseMetadata”:{“RequestId”:”dfc617e1-b3c9-56a8-b9bf-426457676e2d”},”SendMessageResult”:{“MD5OfMessageAttributes”:null,”MD5OfMessageBody”:”0ef0d7773a388095bee26966144cc131″,”MessageId”:”3eb7ed29-c259-4b15-8bd3-bedeac865ee5″,”SequenceNumber”:null}}}
    Thu Jun 20 19:45:50 UTC 2019 : Method response body after transformations: {“SendMessageResponse”:{“ResponseMetadata”:{“RequestId”:”dfc617e1-b3c9-56a8-b9bf-426457676e2d”},”SendMessageResult”:{“MD5OfMessageAttributes”:null,”MD5OfMessageBody”:”0ef0d7773a388095bee26966144cc131″,”MessageId”:”3eb7ed29-c259-4b15-8bd3-bedeac865ee5″,”SequenceNumber”:null}}}
    Thu Jun 20 19:45:50 UTC 2019 : Method response headers: {X-Amzn-Trace-Id=Root=1-5d0be26e-b7b766dba15eb99009933350, Content-Type=application/json}
    Thu Jun 20 19:45:50 UTC 2019 : Successfully completed execution
    Thu Jun 20 19:45:50 UTC 2019 : Method completed with status: 200

    <>

    More details and an example I followed at https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs

     

 

Open source alternative to Unity and Unreal

unity-game-maker

There has been controversy around Unity’s changes to their eula and how it affects independent developers. Improbable – a vc backed developer of a massive online multiplayer game back end solution  – lost their Unity license for a short time, which in turn affected hundreds, maybe thousands, of independent game developers, or at least caused a lot of anguish and confusion.

With a closed source game engine you always face the chance of the rules being changed on you after you have invested years of development.

Is there a legitimate open source alternative to Unity or Unreal? Here are some candidates – I’ll be experimenting/evaluating several over the next month or so and will post feedback.

GodotEngine

Godot provides a huge set of common tools, so you can just focus on making your game without reinventing the wheel.

Godot is completely free and open-source under the very permissive MIT license. No strings attached, no royalties, nothing. Your game is yours, down to the last line of engine code.

Urho3D

A free lightweight, cross-platform 2D and 3D game engine implemented in C++ and released under the MIT license. Greatly inspired by OGRE and Horde3D.

Torque 3d

3D is a easy-to-use game creation platform. Architected from the ground up for maximum flexibility and performance across a wide range of hardware and built upon…

 

 

React Native for Mobile – Initial Impressions

nativesmall

I’ve always done mobile development in the device native language (Objective-C/Swift for iOS, and Java for Android)

Recently I worked on a project that needed to be deployed on Android, iOS and eventually the web, using the same code base if possible. After reviewing the options I decided to use React Native.

React Native lets you build mobile apps using only JavaScript. It uses the same design as React, letting you compose a rich mobile UI from declarative components. It is the library used to build Facebook, Instagram, and many other applications.

The project was originally a native Android app – used by TED for handling attendees checking in to individual sessions during a conference. It makes multiple API calls to the server back-end, does NFC scanning, needs local data storage, and must work offline as well as online.

I’ll post more further down the road about working in React Native so for now I’ll list some initial pros and cons…

Pros

Performance – better and faster json parsing, cleaner program flow, screen redraw update appears faster than native if state is used properly

Multi-platform – same code base for Android and iOS, can also develop for web using React Native for Web.

Open source – strongy supported by facebook, code available on github, 1,700 contributors, 68,000 stars

Cons

Javascript – the language still makes me nervous, I like a strongly typed language – recommend using typescript or flow to lower your risk.

Debugging – debugging tools aren’t as mature as I would like, using Chrome and a lot of console.log calls – which is definitely old school.

Tools – no integrated tools, I use a mixture of the command line, Chrome, and Sublime Text as my editor.

<>

Further reading

How to Get Started with React Native

The Basics of React Native

An iOS Developer’s Journey Into React Native

Building the F8 App

Learning to Program

I get asked quite often for good sites to learn programming or web site development, here are a few resources I recommend.

freeCodeCamp – the best place to learn html, javscript and the rest of technologies necessary for front end web development, they are also working on a full stack developer course as well – can’t recommend these guys enough – a great intro to web technologies

Google has a list of resources and a guide intended for Computer Science students seeking an internship or university grad role at Google but it is useful for anyone who is interested in a software development career.

CS for All is an open book by professors at Harvey Mudd College which teaches the fundamentals of computer science using Python. It’s an accessible read and perfect for programming beginners.

If you’ve never programmed before check out the Getting Started page on Learn To Code with Me by Laurence Bradford. She’s done an incredible job of breaking down the steps beginners should take when they’re uncertain about where to begin.

This short 5 minute video explains why it’s better to think of projects you’d like to build and problems you want to solve with programming. Start working on those projects and problems rather than jumping into a specific language that’s recommended to you by a friend.