Skip to content

BLOG

How IoT Works: Cloud-End (AWS for IoT)

October 20, 2020
6 min read

When we think about IoT development, our mind usually goes to the various ‘smart devices’ that populate our world; from fish tanks to Fitbits, these devices interact with the physical world and feature lightweight embedded technology. However, just like with the rest of the IT world, cloud computing plays a major role in supporting and connecting IoT technology.

That’s why Very partners with Amazon Web Services (AWS) for the IoT back-end. We leverage this service for rapid scaling, simplified management, and to pass on the cost savings to our customers.

In this article, we’re going to give you a tour of our cloud. We’ll lay out a map of the different AWS services we use every day and show you how we use them as a foundation for our back-end software stack.

Prepare for takeoff-we’re heading to the cloud.

Our AWS Cloud Atlas 

Somewhere inside an Amazon data center sits a machine-or more likely a dynamically provisioned server cluster-that hosts Very’s very own virtual private cloud, or VPC. This foundational service defines our boundaries, gives us our own configurable network, and essentially gives us a place to start working.  

AWS Computing Power

Once we’ve laid this groundwork, the first thing we need is computing power. Here we employ two AWS services: EC2 and Lambda

The former lets us provision persistent virtual machines (VMs), computers in the cloud that we use to host web servers and other long-term services. 

The latter, on the other hand, uses serverless computing for more ephemeral use cases, such as gluing AWS services together or applications with only intermittent use.

One great perk of the public cloud is that we don’t have to worry about the underlying technology stack. The AWS Nitro System handles the hardware and software so that we don’t have to. All we have to do is click a button to spin up a machine that’s ready to go. 

AWS Data Storage

Now that we’ve got our computing power, we’re going to need a place to put our data. We use a few different data storage services because each has its own strengths. 

First, we use S3 for object storage when we want to give our applications immediate access to files like rich media or machine-to-machine (M2M) data from our IoT devices. 

Second, we use two complementary database services: RDS for relational databases containing structured data and DynamoDB for non-relational databases containing unstructured data. Lastly, Redshift is our go-to for long-term data warehousing.

AWS Functional Services

On top of these pillars, we employ a host of functional services. The most important of the bunch is IoT Core, which facilitates managing IoT devices, securely communicating to and from them, and taking action based on their messages. This crucial service acts as a hub for interfacing with devices out in the field from within our cloud back-end.

Some of our other favorites include ECS, a managed service for orchestrating Docker containers, and SageMaker, an analogous service for building, training, and deploying machine learning (ML) models. These services, among others, give us the tools we need to build and maintain custom applications for both the thing-end and user-end of the equation.

IoT Programming Languages

Now that our platform’s set up, it’s time to start writing code for our infrastructure and applications. All languages have their own strengths and weaknesses, so we choose the right tool for the job depending on whether we’re building a mobile app, a web browser, or an edge device backend.

Elixir

One unique language that’s essential to our work is Elixir. Very uses this dynamic, functional language as the basis for much of our embedded software, but, as you’ll see, it’s also the foundation for key pieces in our backend stack. Elixir is fault-tolerant, concise, and practical, making it ideal for IoT.

Java

We also make frequent use of popular languages like Java. As one of the most popular backend languages, Java offers portability and simplicity in addition to functional advantages like multithreading for CPU maximization and automatic garbage collection for RAM optimization.

Python

Another common language that we use is Python. This high-level, interpreted language is ideal for data-intensive use cases like data science, so you’re likely to find it on top services like Redshift’s data archives or SageMaker’s ML engine.

Go

Our programmers also use Google’s open-source Go language for backend development. Designed for highly scalable, distributed systems, Go emphasizes expressiveness, cleanliness, and concurrency. Dubbed the C for the twenty-first century, Go is mostly used for system programming that requires robustness and safety. 

Rust

Lastly, we want to give a shoutout to Rust, which consistently ranks as one of the most beloved languages among programmers. This statically-typed code excels at speed, memory usage, and fine-tuned control. It’s commonly found in frameworks like Rocket, which we use for web app development.

Software

programming languages

We’ve got our cloud services, we’ve picked our languages, and now we’re ready for software development. The backend software stack starts with server infrastructure, systems that hold everything together by managing data, running analytics, facilitating communication between the cloud, devices, and user interfaces, and much more.

Again, depending on the use case, we’ll pick the right solution. For hosting mobile or web applications, we’ll use standard services like Apache or NGINX that are familiar to many IT professionals. We won’t dwell on these platforms for too long because we want to get right to the good stuff, the stuff that makes us unique: the IoT device backend!

The device backend starts with Phoenix, a real-time communication channel that’s built in Elixir. Phoenix harnesses Elixir’s advantages for fast, concurrent Pub/Sub messaging that sends data back and forth from our devices via the AWS IoT Core service. Another main benefit of Phoenix is its thoughtful logging capabilities.

Phoenix, in turn, forms the backbone for our next (and arguably most important) backend service: NervesHub. Co-authored by Very’s Justin Schneck, this server enables us to push out over-the-air firmware updates securely and efficiently.

Finally, we arrive at the top of the stack, the applications running on top of our servers. These span a wide gamut: data processing, predictive maintenance monitoring, user interfaces, internal storage protocols, and much, much more. 

Conclusion 

As we conclude our tour of Very’s AWS IoT cloud, there’s one takeaway that really stands out: our cloud-end stack is entirely software-defined. While there’s certainly hardware at the cloud’s foundation, and Amazon maintains the firmware for interfacing with that hardware, we don’t directly interact with it. Despite the fact that our cloud stack basically sits on top of another full tech stack, it’s still a towering creation with deep dependencies.

This demonstrates just how much weight software pulls, even in the IoT realm where we’re usually concerned with physical devices. By layering code in the cloud, we realize IoT’s greatest objectives: interconnectivity and bringing the digital world to bear on real life.

The cloud backend is just one small piece of the puzzle that our developers solve when bringing IoT connected devices to life.

Want to learn more about how we put it all together? Check out our Guide to IoT Development Frameworks and Best Practices.