Skip to content

INFRA (TERRAFORM) ​

DANGER

Creating/updating the infrastructure can be dangerous. Only a trained user should do those steps.

INFO

Infrastrucure is under infra/models/ into quetzal-network-editor-backend

Infrastructure ​

Model can be deployed on either Lambda or ECS see below for more information on both infrastructures

Lambda ​

  • Lambda uses aws step-functions as an orchestrator.
  • Steps are predefined in the step-function definition.
  • Each steps are run in a new lambda execution.
  • Progress in reported by the step-functions.

👍 advantages:

  • starts in seconds when used frequently
  • easy progress tracking

👎 disavantages:

  • memory (ram) 10Gib max
  • time limit: 15 minutes max (per step)
  • max 6vCPU
  • start in a minute if not frequently used in (+/- 1 week)
  • lambda specific Docker images

ECS ​

  • ECS run the docker in a fargate instance
  • Orchestration is done in the running model docker image.(quetzal-network-editor-backend/docker/mains_ecs.py)
  • Progress is reported by the docker orchestrator writing a status.json file on S3. ECS also return fargate status such as RUNNING,STARTING,etc
  • Steps are passed to the model alongside the parameters

👍 advantages:

  • no time limit
  • max memory (ram) 244Gib
  • up to 32vCPU
  • cheaper than lambda (after lambda free tier limit)

👎 disavantages:

  • always start in a minute (and ~30secs to stop)

info

ECS long start time can be offset with faster I/O. Files are only downloaded and uploaded to S3 once, while Lambda infra will do so at each step. Lambda is a better choice for small and fast microservices running a single step.

Configuration ​

  1. Create a new .tfvars file with the name of your model infra/models/environement/<model_name>.tfvars
  • replace <model_name> with the model name, ex: quetzal-paris

Important

The name should start by "quetzal-"

the name must be unique in the AWS region (ca-central-1) (s3 bucket limitation)

  • the .tfvars file contains the executor ressources.
    quetzal_model_name      = "<model_name>"
    lambda_memory_size      = 4016
    lambda_time_limit       = 300
    lambda_storage_size     = 4016
    quetzal_model_name      = "<model_name>"
    ecs_cpu_units    = 1024
    ecs_memory_size  = 4096
    ecs_time_limit   = 60
    ecs_storage_size = 21

Ressources configuration (Lambda).

  • Time (secs) max: 900 (15 minutes)
  • Memory (mb) max: 10240 (10 Gib)
  • Storage (mb) max: 10240 (10 Gib)
  • vCPUs automaticaly scale with memory

Ressources configuration (ECS).

  • Time (mins) max: None
  • Memory (mb) max: 249 856 (244 Gib)
  • Storage (gib) max: 200 (200 Gib)
  • vCPUs (cpu unit) max: 32768 (32 vcpu)
  • see available combinations

Workspace ​

  1. Go to the infra folder (infra/models)
bash
cd infra/models
  1. Create a new workspace. Each model share the same architecture and must be in separated workspace
bash
terraform init

check the list of existing workspace (optional)

bash
terraform workspace list

create a new workspace.

bash
terraform workspace new <model_name>
  1. Select your workspace and initialize it. this will sync your local copy with the deployed terraform state
bash
terraform workspace select <model_name>
bash
terraform init

Plan ​

  1. Plan your deployment. This will create a plan of deployment. if it is a new deployment, make sure everything is created and nothing is destroy

    The plan should read : Plan: 16 to add, 0 to change, 0 to destroy.

bash
terraform plan -var-file="environments/<model_name>.tfvars"
bat
terraform plan -var-file="environments/<model_name>.tfvars" -var os="windows"

Review the plan with an Administrator before the next step to make sure it's all right.

Apply ​

  1. Apply your deployment. Make sure the plan is the same as in the previous step and press yes

    Again, the plan should read : Plan: 18 to add, 0 to change, 0 to destroy.

Windows

make sure to open docker desktop first

bash
terraform apply -var-file="environments/<model_name>.tfvars"
bat
terraform apply -var-file="environments/<model_name>.tfvars" -var os="windows"

Finish! terraform created: ​

  • S3 bucket named <model_name> (empty).

  • ECR repo to store the model docker image (with dummy docker image).

  • IAM role and policy to add to the cognito user group (for user to acces the model when authenticated).

    • Lambda function (running dummy docker image) with access to the S3 bucket and cloudwatch (logs).
    • Step function to launch the lambda function from the Api.

    or

    • ECS task definition (running dummy docker image) with access to the S3 bucket and cloudwatch (logs).