Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Magic Beans - Deploying Django on Elastic Beans...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Seb
September 11, 2014
Technology
90
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Magic Beans - Deploying Django on Elastic Beanstalk
Seb
September 11, 2014
More Decks by Seb
See All by Seb
Double Click - Continue Building Better CLIs
elbaschid
0
490
I Can Be A Speaker, So Can You
elbaschid
0
330
Click - PyCaribbean 2017 - Puerto Rico
elbaschid
0
470
Conferencing - Engineering Meeting
elbaschid
1
51
Show & Tell - PyCon US 2016 Summary
elbaschid
1
110
Click: A Pleasure To Write, A Pleasure To Use
elbaschid
0
690
Hunting for Treasure in Django
elbaschid
1
730
Moby & The Beanstalk
elbaschid
1
540
Docker In Production - A War Story
elbaschid
1
320
Other Decks in Technology
See All in Technology
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
230
第67回コンピュータビジョン勉強会CVPR2026読会前編
tsukamotokenji
0
130
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
640
実装だけじゃない! CCA-F取得エンジニアが教えるClaude Code開発プロセス活用術
diggymo
2
740
SREとQA 二人三脚で進めるSLO運用/sre-qa-slo
sugitak
0
620
CDKで書くECSのベストプラクティス、 改めて考え直す2026 #cdkconf2026
makies
1
480
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
2
430
Claude Code公式skillで 自分の仕事を少しずつ手放そう!(Claude Code開発ノウハウ大公開スペシャル by クラスメソッド)
kaym
1
360
Terraform共通モジュールをチーム横断で“変えられる”運用へ ― リリースと適用の分離
kekke_n
1
3k
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
220
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
430
関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pure at the Core, Effects at the Edge: Bringing Functional Thinking into TypeScript
kaminashi
1
120
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Accessibility Awareness
sabderemane
1
150
How to Ace a Technical Interview
jacobian
281
24k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
450
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
30 Presentation Tips
portentint
PRO
1
350
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Visualization
eitanlees
152
17k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
870
Building Applications with DynamoDB
mza
96
7.1k
Six Lessons from altMBA
skipperchong
29
4.3k
Transcript
Magic Beans Deploying Django on Elastic Beanstalk with Docker Sebastian
Vetter @elbaschid github.com/elbaschid
For those who don't know me • Sebastian Vetter •
Backend Developer @ Snowball One • You can find me on: • twitter: @elbaschid • github: github.com/elbaschid
Deploying Websites Can Be Ugly
Deploying Websites Can Be Ugly 1. Set up server infrastructure.
2. Develop a magical application. 3. Use continuous integration, e.g. Travis 4. On success, manually deploy via scripts
Let's try and make it more beautiful
And we'll use beans for that
Not This One!
That's better!
AWS Elastic Beanstalk (EB) • Amazon's PaaS solution • Heroku-style
deployments • Combines various parts of AWS And now with Docker support
EB Architecture (I)
EB Architecture (II)
Elastic Beanstalk Console (I)
Elastic Beanstalk Console (II)
What is Docker?
What is Docker? • Isolated processes in userspace • Immutable
containers • Lightweight images • Git-style container distribution • More on https://www.docker.com/ whatisdocker/
Let's look at the magic
The ideal solution ...
... was a failure!
The new approach
The main steps 1. Push to github 2. Triggers a
test build on Travis 3. On success: 1. Create deployment artefact 2. Store in S3 3. Beanstalk creates Docker container 4. Deploy to EC2
How it works
Options to run/deploy a docker container on EB. • Using
Dockerrun.aws.json to pull from docker registry • Using Dockerfile to build on the EC2 instance • Using zip archive including both files + more
The build artefact my-magic-app.zip + Dockerfile + Dockerrun.aws.json + scripts/
+ .ebextensions/ ....
Dockerfile FROM stackbrew/ubuntu:14.04 RUN apt-get -qq update && \ apt-get
install -y -q all-the-things && \ curl https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py && \ python /tmp/get-pip.py ADD www /app/ WORKDIR /app RUN pip install -r deploy/requirements/test.txt EXPOSE 8000 VOLUME ['/var/log'] ADD scripts/start.sh /app/start.sh CMD /app/start.sh
Dockerrun.aws.json { "AWSEBDockerrunVersion": "1", "Volumes": [ { "HostDirectory": "/var/log/my-app", "ContainerDirectory":
"/var/log" } ], "Ports": [ { "ContainerPort": "8000" } ], "Logging": "/var/log" }
Setting up Travis to release docker image on success. •
Run the full test suite • After success, build the Docker container • Deploy the new container incl. static files
After successful tests after_success: - cd .. - ./scripts/deploy_to_beanstalk.sh
Putting the magic into beans • No easy to use
deployment scripts from Amazon • eb: useless and broken • awscli: easy to setup but lots of cli flags
It's Roll-Your-Own Time • Small script beanstalk • Uses beans.yml
for configuration • Inspired by tools like fig
Settings in beans.yml app_name: my-eb-app bucket_name: my-s3-bucket my-app-env: environment: AWS_ACCESS_KEY_ID:
AWS_SECRET_KEY: DJANGO_SECRET_KEY: DJANGO_DATABASE_HOST: <RDS host> DJANGO_DATABASE_PORT: <RDS port> DJANGO_DATABASE_NAME: <RDS DB name DJANGO_CONFIGURATION: Test settings: 'command': Timeout: 1000
Using Beansstalk $ python beanstalk.py create_archive <version> $ python beanstalk.py
release <version> $ python beanstalk.py deploy <env> <version> As an example: export RELEASE_VERSION=$TRAVIS_JOB_ID-$GIT_COMMIT $ python beanstalk.py create_archive ${RELEASE_VERSION} $ python beanstalk.py release ${RELEASE_VERSION} $ python beanstalk.py deploy my-app-env ${RELEASE_VERSION}
Versioning and deployment to EB environment. • Semantic versioning doesn't
work in CD (<major>.<minor>.<patch>) • How to generate meaningful versions?
What we do: • Use the Travis Job ID •
And the git commit GIT_COMMIT=$(git rev-parse --short HEAD) RELEASE_VERSION=$TRAVIS_JOB_$GIT_COMMIT
Running the Docker container #!/bin/bash set -e python manage.py migrate
/usr/local/bin/uwsgi --http :8000 \ --wsgi-file deploy/wsgi/test.py \ --logto /var/log/uwsgi.log
Ideas and improvements • Building docker images on Travis CI
and alternatives (Circle CI, Wercker). • Running browser tests against the production container instead of live server testcase. • Handling migrations in continiuous deployment. • Deploying with zero downtime.
Looks great from up here
But still not Paradise