This is a very simple exploration of AWS Elastic Beanstalk from the EB CLI. To get started first install the [AWS CLI] (http://docs.aws.amazon.com/cli/latest/userguide/installing.html), then use aws configure to configure it for your account and region. Then install the EB CLI.

There are numerous commands with in the EB CLI, and this walkthrough isn’t going to cover all of them. Here are the commands, we won’t be covering:

  • eb abort - cancel env configuration changes

  • eb appversion - manage the application versions lifecycle

  • eb clone - clone the env

  • eb codesource - enable/disable integration with AWS CodeCommit

  • eb labs - support for future functionality testing from CLI

  • eb platform - manages platforms and environments

  • eb restore - fire up terminated environment

  • eb scale - adjust scaling for an environment

  • eb setenv & eb printenv - prints environment vars

  • eb swap - does a swap URL for a blue/green sort of dealie

  • eb upgrade - upgrade the environment

Now we have the less-than-super-smart options… seriously, who uses a CLI and needs these commands?

  • eb console - open browser to eb console..

  • eb ssh - ssh into a running instance…

Preconfigured Container

During this scenario we are going to create a Docker hosted application using a preconfigured container and deploy it in us-west-2. You will need to install Docker and have the daemon running.

Application Setup

Create a super simple app by creating a directory then an app file, a requirements file then a docker file

$ mkdir flask-app
$ cd flask-app
$ touch application.py
$ touch requirements.txt
$ touch Dockerfile

Add this text to the application.py file:

# application.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'yo, docker! yo, docker!'

if __name__ == '__main__':
    app.run()

then this single line to the requirements.txt file:

flask

then this line to the Dockerfile

FROM amazon/aws-eb-python:3.4.2-onbuild-3.5.1

then build the container and run it…

$ docker build -t my-app-image .
$ docker run -it --rm -p 3000:8080 my-app-image

In your favorite browser access the running application at http://localhost:3000/ and confirm it is running. Assuming it is let’s package the application for use with Elastic Beanstalk using the eb CLI tool.

$ mv Dockerfile Dockerfile.local
$ zip ../myapp.zip -r * .[^.]*

eb Command Line Tool

To setup an Elastic Bean Stalk environment from the command line, initialize the eb CLI tool, picking us-west2 as the region, create a new application, answer yes you are using python and select the “Python 3.4 (Preconfigured - Docker)”, no SSH.

$ cd flask-app
$ eb init

Annoyingly, there is no way to confirm application creation worked from the CLI… assume it did. Or look in the Console.

Now to create the environment. By default, the eb create <my-environment-name> command makes a load balanced with t2.micro instances. That is close to what we want… but let’s customize it with a single instance and confirm we are using a t2.micro to avoid charges as much as possible:

eb create flask-app-env -r us-west-2 --single --instance_type t2.micro

During the eb create process, press ctrl-c and then use the eb events command to tail the events stream then eb health to confirm the good health of the environment. I really like using eb status for a high level overview of an application so try that out as well. To complete the fun, do eb open to open the live application in browser window.

Now, let’s update the application by changing the application.py file text like:

# application.py
---snip---
def hello_world():
    return 'yo, baby, yo baby, yo. Docker, yeah!'
---snip---

then testing it by starting the application local:

eb run local

and accessing the locally running application by typing localhost:3000 into your browser…

Super chill, that works. Let’s deploy the application again by doing:

eb deploy 

Done with this part of the scenario, let’s terminate the environment.

eb terminate flask-app-env

then delete the application… wait, there is NO way to delete an app using the eb CLI. Instead use the AWS CLI:

aws elasticbeanstalk delete-application --application-name flask-app