This ready to use tutorial show you how to deploy an application from GitHub on AWS and make it accessible via HTTPS. All of that in just a few lines of Terraform file.
Behind the scene
Behind the scene, Qovery will:
- Create a full Kubernetes infrastructure on your AWS account (VPC, Security Groups, Subnet, EKS...)
- Create Qovery resources:
- Organization
Terraform Demo
- Project
URL Shortener
- Environment
production
- Application
web app
- Organization
- Build the
web app
application - Push the
web app
container image in your ECR registry - Deploy it on your EKS cluster (created by Qovery)
- Create an AWS Network Load Balancer
- Generate a TLS certificate for your app
- Expose publicly via HTTPS your application
It will take approximately 20 minutes to create your infrastructure and less than 5 minutes to deploy your application.
How to use
- Clone this repository
- Sign in to Qovery
- Install the Qovery CLI and generate an API Token with this guide.
- Generate your AWS credentials (
Access Key ID
andSecret Access Key
) with this guide - Open you terminal and run the following command by changing the values:
export TF_VAR_aws_access_key_id=YOUR_AWS_ACCESS_KEY_ID \
TF_VAR_aws_secret_access_key=YOUR_AWS_SECRET_ACCESS_KEY \
TF_VAR_qovery_access_token=YOUR_QOVERY_API_TOKEN \
TF_VAR_qovery_organization_id=YOUR_QOVERY_ORG_ID
- Clone my URL Shortener application
- Edit the
main.tf
file and changehttps://github.com/evoxmusic/ShortMe-URL-Shortener.git
with yours - You can now run the Terraform commands
terraform init
terraform plan
terraform apply
- Open your Qovery console to find out the HTTPS URL of your deployed app.
- To tear down your infrastructure and avoid unnecessary cloud costs you can run
terraform destroy
.
--
And here is what happened when running terraform apply
terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated
with the following symbols:
+ create
Terraform will perform the following actions:
# qovery_application.backend will be created
+ resource "qovery_application" "backend" {
+ auto_preview = false
+ build_mode = "BUILDPACKS"
+ buildpack_language = "PYTHON"
+ built_in_environment_variables = [
] -> (known after apply)
+ cpu = 500
+ environment_id = (known after apply)
+ environment_variables = [
+ {
+ id = (known after apply)
+ key = "DEBUG"
+ value = "false"
},
+ {
+ id = (known after apply)
+ key = "PORT"
+ value = "3333"
},
]
+ git_repository = {
+ branch = "main"
+ root_path = "/"
+ url = "https://github.com/evoxmusic/ShortMe-URL-Shortener.git"
}
+ id = (known after apply)
+ max_running_instances = 1
+ memory = 256
+ min_running_instances = 1
+ name = "backend"
+ ports = [
+ {
+ external_port = 443
+ id = (known after apply)
+ internal_port = 3333
+ protocol = "HTTP"
+ publicly_accessible = true
},
]
+ state = "RUNNING"
}
# qovery_aws_credentials.my_aws_creds will be created
+ resource "qovery_aws_credentials" "my_aws_creds" {
+ access_key_id = (sensitive value)
+ id = (known after apply)
+ name = "URL Shortener"
+ organization_id = "67df37d8-6139-42eb-8c60-452395d12222"
+ secret_access_key = (sensitive value)
}
# qovery_cluster.my_cluster will be created
+ resource "qovery_cluster" "my_cluster" {
+ cloud_provider = "AWS"
+ credentials_id = (known after apply)
+ description = "Terraform demo cluster"
+ features = {
+ vpc_subnet = (known after apply)
}
+ id = (known after apply)
+ instance_type = "T3A_MEDIUM"
+ max_running_nodes = 4
+ min_running_nodes = 3
+ name = "Demo cluster"
+ organization_id = "67df37d8-6139-42eb-8c60-452395d1c2ab"
+ region = "us-east-2"
+ state = "RUNNING"
}
# qovery_environment.production will be created
+ resource "qovery_environment" "production" {
+ built_in_environment_variables = [
] -> (known after apply)
+ cluster_id = (known after apply)
+ id = (known after apply)
+ mode = "DEVELOPMENT"
+ name = "dev"
+ project_id = (known after apply)
}
# qovery_project.my_project will be created
+ resource "qovery_project" "my_project" {
+ built_in_environment_variables = [
] -> (known after apply)
+ description = (known after apply)
+ id = (known after apply)
+ name = "URL Shortener"
+ organization_id = "67df37d8-6139-42eb-8c60-452395d1c2ab"
}
Plan: 5 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
qovery_aws_credentials.my_aws_creds: Creating...
qovery_aws_credentials.my_aws_creds: Creation complete after 0s [id=d2cfe19d-6381-4676-99e6-6721182f0c4c]
qovery_cluster.my_cluster: Creating...
qovery_cluster.my_cluster: Still creating... [10s elapsed]
qovery_cluster.my_cluster: Still creating... [20s elapsed]
qovery_cluster.my_cluster: Still creating... [30s elapsed]
qovery_cluster.my_cluster: Still creating... [40s elapsed]
qovery_cluster.my_cluster: Still creating... [50s elapsed]
qovery_cluster.my_cluster: Still creating... [1m0s elapsed]
qovery_cluster.my_cluster: Still creating... [1m10s elapsed]
qovery_cluster.my_cluster: Still creating... [1m20s elapsed]
qovery_cluster.my_cluster: Still creating... [1m30s elapsed]
qovery_cluster.my_cluster: Still creating... [1m40s elapsed]
qovery_cluster.my_cluster: Still creating... [1m50s elapsed]
qovery_cluster.my_cluster: Still creating... [2m0s elapsed]
qovery_cluster.my_cluster: Still creating... [2m10s elapsed]
qovery_cluster.my_cluster: Still creating... [2m20s elapsed]
qovery_cluster.my_cluster: Still creating... [2m30s elapsed]
qovery_cluster.my_cluster: Still creating... [2m40s elapsed]
qovery_cluster.my_cluster: Still creating... [2m50s elapsed]
qovery_cluster.my_cluster: Still creating... [3m0s elapsed]
qovery_cluster.my_cluster: Still creating... [3m10s elapsed]
qovery_cluster.my_cluster: Still creating... [3m20s elapsed]
qovery_cluster.my_cluster: Still creating... [3m30s elapsed]
qovery_cluster.my_cluster: Still creating... [3m40s elapsed]
qovery_cluster.my_cluster: Still creating... [3m50s elapsed]
qovery_cluster.my_cluster: Still creating... [4m0s elapsed]
qovery_cluster.my_cluster: Still creating... [4m10s elapsed]
qovery_cluster.my_cluster: Still creating... [4m20s elapsed]
qovery_cluster.my_cluster: Still creating... [4m30s elapsed]
qovery_cluster.my_cluster: Still creating... [4m40s elapsed]
qovery_cluster.my_cluster: Still creating... [4m50s elapsed]
qovery_cluster.my_cluster: Still creating... [5m0s elapsed]
qovery_cluster.my_cluster: Still creating... [5m10s elapsed]
qovery_cluster.my_cluster: Still creating... [5m20s elapsed]
qovery_cluster.my_cluster: Still creating... [5m30s elapsed]
qovery_cluster.my_cluster: Still creating... [5m40s elapsed]
qovery_cluster.my_cluster: Still creating... [5m50s elapsed]
qovery_cluster.my_cluster: Still creating... [6m0s elapsed]
qovery_cluster.my_cluster: Still creating... [6m10s elapsed]
qovery_cluster.my_cluster: Still creating... [6m20s elapsed]
qovery_cluster.my_cluster: Still creating... [6m30s elapsed]
qovery_cluster.my_cluster: Still creating... [6m40s elapsed]
qovery_cluster.my_cluster: Still creating... [6m50s elapsed]
qovery_cluster.my_cluster: Still creating... [7m0s elapsed]
qovery_cluster.my_cluster: Still creating... [7m10s elapsed]
qovery_cluster.my_cluster: Still creating... [7m20s elapsed]
qovery_cluster.my_cluster: Still creating... [7m30s elapsed]
qovery_cluster.my_cluster: Still creating... [7m40s elapsed]
qovery_cluster.my_cluster: Still creating... [7m50s elapsed]
qovery_cluster.my_cluster: Still creating... [8m0s elapsed]
qovery_cluster.my_cluster: Still creating... [8m10s elapsed]
qovery_cluster.my_cluster: Still creating... [8m20s elapsed]
qovery_cluster.my_cluster: Still creating... [8m30s elapsed]
qovery_cluster.my_cluster: Still creating... [8m40s elapsed]
qovery_cluster.my_cluster: Still creating... [8m50s elapsed]
qovery_cluster.my_cluster: Still creating... [9m0s elapsed]
qovery_cluster.my_cluster: Still creating... [9m10s elapsed]
qovery_cluster.my_cluster: Still creating... [9m20s elapsed]
qovery_cluster.my_cluster: Still creating... [9m30s elapsed]
qovery_cluster.my_cluster: Still creating... [9m40s elapsed]
qovery_cluster.my_cluster: Still creating... [9m50s elapsed]
qovery_cluster.my_cluster: Still creating... [10m0s elapsed]
qovery_cluster.my_cluster: Still creating... [10m10s elapsed]
qovery_cluster.my_cluster: Still creating... [10m20s elapsed]
qovery_cluster.my_cluster: Still creating... [10m30s elapsed]
qovery_cluster.my_cluster: Still creating... [10m40s elapsed]
qovery_cluster.my_cluster: Still creating... [10m50s elapsed]
qovery_cluster.my_cluster: Still creating... [11m0s elapsed]
qovery_cluster.my_cluster: Still creating... [11m10s elapsed]
qovery_cluster.my_cluster: Still creating... [11m20s elapsed]
qovery_cluster.my_cluster: Still creating... [11m30s elapsed]
qovery_cluster.my_cluster: Still creating... [11m40s elapsed]
qovery_cluster.my_cluster: Still creating... [11m50s elapsed]
qovery_cluster.my_cluster: Still creating... [12m0s elapsed]
qovery_cluster.my_cluster: Still creating... [12m10s elapsed]
qovery_cluster.my_cluster: Still creating... [12m20s elapsed]
qovery_cluster.my_cluster: Still creating... [12m30s elapsed]
qovery_cluster.my_cluster: Still creating... [12m40s elapsed]
qovery_cluster.my_cluster: Still creating... [12m50s elapsed]
qovery_cluster.my_cluster: Still creating... [13m0s elapsed]
qovery_cluster.my_cluster: Still creating... [13m10s elapsed]
qovery_cluster.my_cluster: Still creating... [13m20s elapsed]
qovery_cluster.my_cluster: Still creating... [13m30s elapsed]
qovery_cluster.my_cluster: Still creating... [13m40s elapsed]
qovery_cluster.my_cluster: Still creating... [13m50s elapsed]
qovery_cluster.my_cluster: Still creating... [14m0s elapsed]
qovery_cluster.my_cluster: Still creating... [14m10s elapsed]
qovery_cluster.my_cluster: Still creating... [14m20s elapsed]
qovery_cluster.my_cluster: Still creating... [14m30s elapsed]
qovery_cluster.my_cluster: Still creating... [14m40s elapsed]
qovery_cluster.my_cluster: Still creating... [14m50s elapsed]
qovery_cluster.my_cluster: Still creating... [15m0s elapsed]
qovery_cluster.my_cluster: Still creating... [15m10s elapsed]
qovery_cluster.my_cluster: Still creating... [15m20s elapsed]
qovery_cluster.my_cluster: Still creating... [15m30s elapsed]
qovery_cluster.my_cluster: Still creating... [15m40s elapsed]
qovery_cluster.my_cluster: Still creating... [15m50s elapsed]
qovery_cluster.my_cluster: Still creating... [16m0s elapsed]
qovery_cluster.my_cluster: Still creating... [16m10s elapsed]
qovery_cluster.my_cluster: Still creating... [16m20s elapsed]
qovery_cluster.my_cluster: Still creating... [16m30s elapsed]
qovery_cluster.my_cluster: Still creating... [16m40s elapsed]
qovery_cluster.my_cluster: Still creating... [16m50s elapsed]
qovery_cluster.my_cluster: Still creating... [17m0s elapsed]
qovery_cluster.my_cluster: Still creating... [17m10s elapsed]
qovery_cluster.my_cluster: Still creating... [17m20s elapsed]
qovery_cluster.my_cluster: Still creating... [17m30s elapsed]
qovery_cluster.my_cluster: Still creating... [17m40s elapsed]
qovery_cluster.my_cluster: Still creating... [17m50s elapsed]
qovery_cluster.my_cluster: Still creating... [18m0s elapsed]
qovery_cluster.my_cluster: Still creating... [18m10s elapsed]
qovery_cluster.my_cluster: Creation complete after 18m12s [id=782f5b71-5786-4ff6-895a-277cd432dc1e]
qovery_project.my_project: Creating...
qovery_project.my_project: Creation complete after 0s [id=2fa442d0-f798-46f8-9a1a-b33317c507ea]
qovery_environment.production: Creating...
qovery_environment.production: Creation complete after 0s [id=8418d920-c508-4ea2-b669-72b1fedc3a3e]
qovery_application.backend: Creating...
qovery_application.backend: Still creating... [10s elapsed]
qovery_application.backend: Still creating... [20s elapsed]
qovery_application.backend: Still creating... [30s elapsed]
qovery_application.backend: Still creating... [40s elapsed]
qovery_application.backend: Still creating... [50s elapsed]
qovery_application.backend: Still creating... [1m0s elapsed]
qovery_application.backend: Still creating... [1m10s elapsed]
qovery_application.backend: Still creating... [1m20s elapsed]
qovery_application.backend: Still creating... [1m30s elapsed]
qovery_application.backend: Still creating... [1m40s elapsed]
qovery_application.backend: Still creating... [1m50s elapsed]
qovery_application.backend: Still creating... [2m0s elapsed]
qovery_application.backend: Still creating... [2m10s elapsed]
qovery_application.backend: Still creating... [2m20s elapsed]
qovery_application.backend: Creation complete after 2m23s [id=8dd99960-939c-4328-9a38-fdea20d7db8a]
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
I hope you liked it!
Top comments (0)