Deploy FastAPI using AWS Elastic BeanStalk¶
i wont get into the development part of the application using FastAPI, this blog will be completely focused on the deployment and operations part of the application.
Install the dependencies¶
Tip
Be sure to register an IAM user for getting access to your AWS account.
To access the Elastic Beanstalk in your laptop, install the EB CLI or with pip
Tip
Do check the colorama and other dependencies if you are using the pip awsebcli. it can break your entire environment.
After installing, check if the EB CLI is installed perfectly by running:
Once everything mentioned above is setup:
Intialize the project¶
You'll be asked multiple questions:
- Default Region
 - Applicaiton Name
 - Platform
 - Asks for the Code Commit, be sure if you are using the git or code commit to push changes in your applicaiton
 
After answering all the questions, it adds a new directory in the project dir .elasticbeanstalk.
The file should be something more like this:
# config.yml
branch-defaults:
  branch-name:
    environment: Env-dev
    group_suffix: null
global:
  application_name: App Name
  branch: null
  default_ec2_keyname: key-pair
  default_platform: Python 3.11 running on 64bit Amazon Linux 2023
  default_region: ap-south-1
  include_git_submodules: true
  instance_profile: null
  platform_name: null
  platform_version: null
  profile: null
  repository: null
  sc: git
  workspace_type: Application
Create the Environment¶
Again, you'll be prompted with a few questions.
Once you are done with the questions, your environment will spin up and the Elastic BeanStalk will spin up EC2 instance with your FastAPI application.
you can view the status of the environment by:
Environment details for: Env-Name
  Application name: Application Name
  Region: ap-south-1
  Deployed Version: app-82fb-2203743843434324
  Environment ID: e-nsizyek74z
  Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Python 3.8 running on 64bit Amazon Linux 2/3.3.11
  Tier: WebServer-Standard-1.0
  CNAME: cname-env.us-west-2.elasticbeanstalk.com
  Updated: 2024-07-11 23:16:03.822000+00:00
  Status: Launching
  Health: Red
Configure an Environment¶
In the previous step, we tried accessing our application and it returned 502 Bad Gateway. There are three reasons behind it:
Python needs PYTHONPATH in order to find modules in our application. By default, Elastic Beanstalk attempts to launch the WSGI application from application.py, which doesn't exist. If not specified otherwise, Elastic Beanstalk tries to serve Python applications with Gunicorn. 
Gunicorn by itself is not compatible with FastAPI since FastAPI uses the newest ASGI standard.
Let's fix these errors.
Create a new folder in the project root called .ebextensions. Within the newly created folder create a file named 01_fastapi.config:
# .ebextensions/01_fastapi.config
option_settings:
  aws:elasticbeanstalk:application:environment:
    PYTHONPATH: "/var/app/current:$PYTHONPATH"
  aws:elasticbeanstalk:container:python:
    WSGIPath: "main:app"
container_commands:
    01_init:
        command: "source /var/app/venv/*/bin/activate && pip install -r requirements.txt"
The important part for running the application on the environment:
Create a Procfile¶
make a file with name Procfile in the project directory
At this stage after completing all the above steps, the project structure should look like this:
|-- .ebextensions
|   └-- 01_fastapi.config
|-- .elasticbeanstalk
|   └-- config.yml
|-- .gitignore
|-- Procfile
|-- README.md
|-- main.py
|-- models.py
`-- requirements.txt
You can add in the ENV variables in the Configuration tab of the environment.
Now commit the changes to your git repository and deploy:
After the deployment you can view the status of the application from the AWS portal or you can use:
For getting a more detailed logs:
Terminate¶
If you are done with testing and want to remove all the resources associated with this project:
My CheckList¶
I use AWS Amplify(service for deploying static sites) for my client and AWS EB for the server deployment.
Client¶
- Update the server uri in the build
 - Also remove all the console statements to not disclose any information
 - Add the SSL Certificate to the client
 
Server¶
- Update the Security Rules for the environment (Inbound and Outbound)
 - Update the client uri in the ENV Variables and other if required
 - If using any Auth providers, append your server uri
 -  If using HTTPS, add the 
Listenerfor port 443 and select the SSL certificate from ACM