How to handle different application environments like Prod, Dev, Test, etc.?

Introduction

There are times when we are in a dilemma as to how to properly use application environments. It gets confusing really fast. I will try to explain the approach (that I see) makes sense.

I will be using Python in this blog, but t…


This content originally appeared on DEV Community and was authored by Syed Mohammad Ibrahim

Introduction

There are times when we are in a dilemma as to how to properly use application environments. It gets confusing really fast. I will try to explain the approach (that I see) makes sense.

I will be using Python in this blog, but this implementation is agnostic of the programming language.

Pre-requisites

  1. Python 3.8.x or higher
  2. PyYaml library - To read our YAML configuration files

Lets get started!

  • Create a yaml file just like below
# settings.yml
default: &default
  api_url: "https://example.com/dev"
  aws: &aws
    s3_bucket:
      - my-bucket

dev: &dev
  <<: *default

test: &test
  <<: *default
  api_url: "https://example.com/test"

prod: &prod
  <<: *default
  api_url: "https://prod.example.com/"
  aws:
    <<: *aws
    s3_bucket:
      - my-prod-bucket

In the above yaml, we are using the inheritance to override the configurations for individual environments.

  • To pass the correct configuration, we can leverage argparse which parses command-line arguments for us. The following python script does that.
# main.py
import argparse

def read_cli_arguments():
  arg_parser = argparse.ArgumentParser()
  arg_parser.add_argument(
        "--app-env",
        required=True,
        action="store",
        choices=("prod", "dev", "test"),
        help="Application environment to run in"
    )
  return arg_parser.parse_args()
  • Next, we read the configuration file based on the environment
# main.py
from typing import Dict
import yaml

def read_settings(app_env: str) -> Dict:
  try:
    with open("settings.yml", mode="r", encoding="utf-8") as config:
      configs: Dict = yaml.safe_load(config)
  except yaml.YAMLError as yaml_err:
    print(f"Error occurred while reading the file. Error: {yaml_err}")
    raise
  return configs[app_env]
  • Reading the configuration dictionary is now as easy as
# main.py

settings_prod: Dict = read_settings("prod")
print(f"Prod Configurations: {settings_prod}")

settings_test: Dict = read_settings("test")
print(f"Test Configurations: {settings_test}")
  • Finally, we use this as part of running our main.py file from the command-line like this
$ ls
main.py     settings.yml

$ python3 main.py --app-env prod

Complete Code

# main.py
from typing import Dict
import argparse
import yaml

def read_cli_arguments():
  arg_parser = argparse.ArgumentParser()
  arg_parser.add_argument(
        "--app-env",
        required=True,
        action="store",
        choices=("prod", "dev", "test"),
        help="Application environment to run in"
    )
  return arg_parser.parse_args()

def read_settings(app_env: str) -> Dict:
  try:
    with open("settings.yml", mode="r", encoding="utf-8") as config:
      configs: Dict = yaml.safe_load(config)
  except yaml.YAMLError as yaml_err:
    print(f"Error occurred while reading the file. Error: {yaml_err}")
    raise
  return configs[app_env]


# Program Execution Starts Here
if __name__ == "__main__":
  # Read CLI arguments
  args = read_cli_arguments()

  # Retrieve specific configurations
  settings: Dict = read_settings(app_env=args.app_env)

  print(f"Configs: {settings}")

Executing the above code on the terminal

$ python3 main.py --app-env prod
Configs: {"api_url": "https://prod.example.com/", "aws": {"s3_bucket": ["my-prod-bucket"]}}

Cheers!


This content originally appeared on DEV Community and was authored by Syed Mohammad Ibrahim


Print Share Comment Cite Upload Translate Updates
APA

Syed Mohammad Ibrahim | Sciencx (2023-04-01T17:34:12+00:00) How to handle different application environments like Prod, Dev, Test, etc.?. Retrieved from https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/

MLA
" » How to handle different application environments like Prod, Dev, Test, etc.?." Syed Mohammad Ibrahim | Sciencx - Saturday April 1, 2023, https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/
HARVARD
Syed Mohammad Ibrahim | Sciencx Saturday April 1, 2023 » How to handle different application environments like Prod, Dev, Test, etc.?., viewed ,<https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/>
VANCOUVER
Syed Mohammad Ibrahim | Sciencx - » How to handle different application environments like Prod, Dev, Test, etc.?. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/
CHICAGO
" » How to handle different application environments like Prod, Dev, Test, etc.?." Syed Mohammad Ibrahim | Sciencx - Accessed . https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/
IEEE
" » How to handle different application environments like Prod, Dev, Test, etc.?." Syed Mohammad Ibrahim | Sciencx [Online]. Available: https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/. [Accessed: ]
rf:citation
» How to handle different application environments like Prod, Dev, Test, etc.? | Syed Mohammad Ibrahim | Sciencx | https://www.scien.cx/2023/04/01/how-to-handle-different-application-environments-like-prod-dev-test-etc/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.