6 Cloud Platforms You Should Be Using in 2020
Tags: devops, tutorial, webdev, twilio
Published: 2020-04-24 09:31:49

---
title: 6 Cloud Platforms You Should Be Using in 2020
published: true
description: Useful Cloud Platforms
tags: devops, tutorial, webdev, twilio
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/0znow24kgpu2dp3zg60n.png
---

### ###


A cloud platform is generally a turnkey solution that can make your life easier and take some of the complexity off your shoulders.

You probably can't build a complete and scalable application without using at least one cloud platform.

Here's the list:

##**1. [Amazon Web Services](https://https://aws.amazon.com/)**##

Even if you're not using it at your current job, you should at least get familiar with the [EC2](https://aws.amazon.com/ec2/) and [S3](https://aws.amazon.com/s3/) components.

You don't need to sign up for an expensive course to learn the essentials.

Basic flows for EC2:
1. [Launch an instance](https://docs.aws.amazon.com/quickstarts/latest/vmlaunch/step-1-launch-instance.html)
2. [Start/restart/stop an instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html)
3. [Create a backup](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html)
4. [Restore from a backup](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-restoring-volume.html)
5. [Configure Security Groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)

Basic flows for S3:
1. [Create a bucket](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-bucket.html)
2. [Create a folder](https://docs.aws.amazon.com/cli/latest/reference/workdocs/create-folder.html)
3. [Upload files](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)
4. [Set permissions](https://aws.amazon.com/premiumsupport/knowledge-center/read-access-objects-s3-bucket/)
5. [Download files](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/download-objects.html) 

While you may want to use the UI to handle non-repetitive tasks in EC2, you're most likely going to use the [AWS CLI](https://aws.amazon.com/cli/) to handle all the operations in S3.

Remember, AWS has a lot of components, almost anything you can think of in terms of cloud computing and APIs.

##**2. [Twilio](https://www.twilio.com)**##

Twilio is a cloud communication company that enables users to use standard web languages to build voice, VoIP, and SMS apps via a web API.

A functionality for sending text messages is not something you want to build from scratch.

Here is a Python example for sending an SMS with Twilio:

```python
from twilio.rest import Client

account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
client = Client(account_sid, auth_token)

message = client.messages.create(
                              body='Hi there!',
                              from_='+15017122661',
                              to='+15558675310'
                          )

print(message.sid)
```

You can read a short tutorial [here](https://www.twilio.com/docs/sms/tutorials/how-to-send-sms-messages).



##**3. [SendGrid](https://sendgrid.com)**##

SendGrid is a cloud-based email delivery platform, for both transactional and marketing emails.

Sure, you can send emails without SendGrid or any other external provider, all you need is a server.

It's as simple as:

```
<?php
$to = "somebody@example.com";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: somebodyelse@example.com";

mail($to,$subject,$txt,$headers);
?>
```
But it's a bad idea to use your own email server instead of SendGrid.

Here's why:
1. Your server might not be able to handle the volume of emails you're sending.
2. The emails sent from your server might land in the Spam folder due to your low [IP Reputation](https://sendgrid.com/blog/email-reputation-101-ip-reputation-vs-domain-reputation/).
3. You'll have to build your own tools to monitor the [email activity](https://sendgrid.com/docs/ui/analytics-and-reporting/email-activity-feed/). 

SendGrid is not just for marketeers, it also provides a powerful Web API.

Here's a basic Python example for sending an email:
```python
import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

message = Mail(
    from_email='from_email@example.com',
    to_emails='to@example.com',
    subject='Sending with SendGrid is Fun',
    html_content='<strong>and easy to do anywhere, even with Python</strong>')
try:
    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    response = sg.send(message)
    print(response.status_code)
    print(response.body)
    print(response.headers)
except Exception as e:
    print(e.message)
```

As you can see, we also check the status code in this previous example.


##**4. [Endtest](https://endtest.io)**##

Endtest is a cloud platform where you can create and execute automated tests for your web applications and mobile applications

Offering your users a flawless experience is of paramount importance.

A good way to achieve that is to rely on automated tests and be the first one to find out when something stops working.

Unit tests and API requests are simply not enough to verify if your product is working as expected for your users.

Endtest offers an easy way to create functional automated tests and execute them on their [cross-browser cloud](https://endtest.io/guides/docs/how-to-execute-web-tests/) and mobile device lab.

![Endtest Execute Test](https://dev-to-uploads.s3.amazonaws.com/i/sn1fk6jsd5kis5y40rpw.gif)

And you can do that without having to write a single line of code.

There is a [recorder for Web Tests](https://endtest.io/guides/docs/how-to-create-web-tests/) and a [recorder for Mobile Tests](https://endtest.io/guides/docs/how-to-create-mobile-tests/), both rely on element identification, not on image recognition or OCR.

![Endtest Mobile Recorder](https://dev-to-uploads.s3.amazonaws.com/i/6wt3v13sfs0iv4nbvaf6.gif)

It also offers an [API](https://endtest.io/guides/docs/how-to-use-the-endtest-api/) and integrations with solutions such as Jenkins, Jira, Slack and others.
![Endtest Results](https://dev-to-uploads.s3.amazonaws.com/i/p56rl7t8yjutjq5esqq2.gif)

Why should you use this cloud platform? 

[Here](https://endtest.io/why-endtest) is a good answer.

##**5. [Amplitude Analytics](https://amplitude.com)**##

This isn't your usual analytics solution where you import some JavaScript in your pages and it starts tracking the visitors.

Amplitude can help you track events from users and generate incredibly useful information.

For example, you can see how many of the users who signed up 6 weeks ago are still using your product, a metric which is known as [retention](https://help.amplitude.com/hc/en-us/articles/230543327-Retention-Analysis).

![Amplitude Retention](https://dev-to-uploads.s3.amazonaws.com/i/aaoffpkqi6anl9w32it5.png)

The catch is to use the [event tracking capabilities](https://help.amplitude.com/hc/en-us/articles/206404698-Step-3-Track-Events-and-Understand-the-Actions-Users-Take) and integrate them in your code.

For each action performed by a user, you can send a request to the [Amplitude API](https://help.amplitude.com/hc/en-us/articles/115000959052-For-Developers-Getting-Started) to store an identifier for the user, the type of event and whatever else you need.

Here's how to send an event to Amplitude from your Python code:

```python
import amplitude	

# initialize amplitude logger
amplitude_logger = amplitude.AmplitudeLogger(api_key = "SOME_API_KEY_STRING")

# example event
event_args = {"device_id":"somedeviceid", "event_type":"justtesting", 
              "event_properties":{"property1":"somevalue", "propertyN":"anothervalue"}
event = amplitude_logger.create_event(**event_args)

# send event to amplitude
amplitude_logger.log_event(event)
```

This allows you to generate event timelines for all your users and segments.


##**6. [Stripe](https://stripe.com)**##

Stripe is a suite of payment APIs that powers commerce for online businesses of all sizes.

Handling payments is another thing you don't want to build from scratch. 

Stripe is known for being developer-friendly and provides a detailed [documentation](https://stripe.com/docs/api) for their APIs.

And having a stunning Checkout page can really increase those conversions.
![Stripe Checkout](https://dev-to-uploads.s3.amazonaws.com/i/14b80ohq1p4h29lj2t1d.jpg)

Handling payments is not just about processing a credit card payment, there are other important aspects covered by Stripe, such as fraud and compliance.

Here's an example using JavaScript:

```javascript
var stripe = Stripe('_____YOUR_STRIPE_PUBLISHABLE_KEY___');
var elements = stripe.elements();

// Create an instance of the card Element
var card = elements.create('card', {style: style});
// Add an instance of the card Element into the `card-element` <div>
card.mount('#card-element');

// Handle real-time validation errors from the card Element.
card.addEventListener('change', function(event) {
    var displayError = document.getElementById('card-errors');
if (event.error) {
        displayError.textContent = event.error.message;
    } else {
        displayError.textContent = '';
    }
});

// Handle form submission
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
    event.preventDefault();
stripe.createToken(card).then(function(result) {
        if (result.error) {
            // Inform the user if there was an error
            var errorElement = document.getElementById('card-errors');
            errorElement.textContent = result.error.message;
        } else {
            stripeTokenHandler(result.token);
        }
    });
});

// Send Stripe Token to Server
function stripeTokenHandler(token) {
    // Insert the token ID into the form so it gets submitted to the server
    var form = document.getElementById('payment-form');
// Add Stripe Token to hidden input
    var hiddenInput = document.createElement('input');
    hiddenInput.setAttribute('type', 'hidden');
    hiddenInput.setAttribute('name', 'stripeToken');
    hiddenInput.setAttribute('value', token.id);
    form.appendChild(hiddenInput);
// Submit form
    form.submit();
}
```