Azure Deployment
Architecture
Deployment Prerequisites
In order to get started, your Atolio support team will do the following on your behalf:
- Grant access to Client ECR repos (for pulling Docker images) to your Azure subscription (and Azure Container Registry).
- Add your Deployment Engineer as a collaborator to the Atolio GitHub repository (lumen-infra), which contains:
- Deployment documentation
- Terraform for the Atolio stack infrastructure
- Configuration files for Atolio services
- Maintenance scripts
The following deployment prerequisites will help streamline your deployment process.
Determine Azure subscription
You can either choose to deploy Atolio into an existing Azure subscription or an existing one. Atolio will deploy into a new Azure Resource Group (RG), with another RG created automatically by Azure Kubernetes Service (AKS) for the cluster. When the subscription & RG are available, share the details with your Atolio support team.
We recommend:
- Ensuring that Service Quotas within your Azure subscription allow for a minimum of 64 vCPU under the Total Regional vCPUs quota.
- Raising any other organizational Azure policies / restrictions (e.g. networking, containers) with your Atolio support team ahead of the deployment call.
Determine Atolio DNS name
Before the deployment call, you may want to decide on your desired Atolio web location. Create an Azure DNS Zone in the Azure subscription for hosting the Atolio stack (e.g. search.yourdomain.com.
): this will be the DNS name (without the trailing dot) for the Atolio Web application (e.g. https://search.yourdomain.com
).
For the remainder of this document, we will use https://search.yourdomain.com
in the examples, but it is expected for you to replace with your own DNS name.
Obtain a certificate for SSL
For the previously defined DNS name, you will need to obtain a certificate that can be used for SSL. This certificate will need to be installed in the application gateway in a later step.
Setup Authentication
Atolio supports single sign-on (SSO) authentication through Okta, Microsoft Entra ID, and Google using the OpenID Connect (OIDC) protocol.
Refer to Configuring Authentication for more details on the steps to complete in your desired SSO provider in order to obtain the necessary OIDC configuration values.
The oidc_client_id
and oidc_client_secret
will be the respective values created and saved during Azure AD - Create New App Registration.
Setup local environment
Finally, ensure you have the following utilities installed:
- Setup Terraform on your local machine as described on the HashiCorp docs site - we require v1.5.0 at a minimum.
- Install the Azure Command Line Interface
- Install kubectl
- Install Helm
- Download the
atolioctl
executable from the release page. You will use this to configure sources.
Note: If you are running on Windows, you may also need to install the Windows Subsystem for Linux.
Create Cloud Infrastructure
Note: Atolio requires an Azure region with 3 availability zones. You can check which regions include support for multiple availability zones here.*
The Terraform configuration requires an external (S3) bucket to store state. A script is available to automate the whole process (including running Terraform). Before running the script, create a config.hcl
file based on the provided config.hcl.template
:
cd deploy/terraform/azure
cp ./config.hcl.template config.hcl
Update the copied file with appropriate values. At a minimum, it should look something like this:
# Domain name for Atolio stack (same as hosted zone name without trailing ".")
lumen_domain_name = "search.yourdomain.com"
Then copy the Helm template and update the values with the appropriate OIDC settings and repository values. You will also likely modify lumenImageTag
to specify the version of Atolio you’d like to deploy. Note: the OIDC settings are necessary for the Helm release to succeed (the Marvin
service is dependent on these settings for validating authentication).
cp ./templates/values-admin.yaml values-lumen.yaml
lumenImageTag: "4.9.0"
# Path to your company logo to be shown in the Atolio UI
searchUi:
publicLogoPath: "https://search.yourdomain.com/yourLogo.svg"
jwtSecretKey: "256-bit-secret-key-for-sign-jwts"
# See also scripts/config-oidc.sh helper script to obtain some of the values below
oidc:
provider: "add-your-provider-here"
endpoint: "add-your-endpoint-here"
clientId: "add-your-id-here"
clientSecret: "add-your-secret-here"
# If running behind a reverse proxy, this should be set to the URL the end user will
# use to access the product.
reverseProxyUrl: ""
For the jwt_secret_key
any 256 bit (32 character) string can be used. It is used to sign JWT tokens used by the web application and atolioctl
tool. It should be a well guarded secret that is unique to the deployment.
If your users will be accessing the web interface via a reverse proxy (e.g. such as StrongDM), then be sure to set the reverseProxyUrl
field to reflect the URL they will actually enter into their browser to access Atolio, which will be different to the hostname defined in lumen_domain_name
. Leave this field empty if not using a reverse proxy.
You should have all variables within the OIDC block configured. Now you can create the infrastructure and deploy the k8s cluster. From the ’terraform.azure’ directory:
./scripts/create-infra.sh --name=deployment-name
This will create the infrastructure in your default Azure region. If you want to deploy in another region parameter (e.g. eastus) an additional parameter can be provided:
./scripts/create-infra.sh --name=deployment-name --region=eastus
The deployment-name
argument is used to define a deployment name for collecting resources into an Azure Resource Group containing the kubernetes cluster, networking, storage, etc. We recommend making it unique across all deployments, i.e. using a globally unique deployment name. Typically this is named after the customer for which the Atolio app is deployed or a particular deployment flavour (e.g. acmecorp or engtest).
The script automates the following steps (parameterized based on the provided deployment name):
- Create an Azure Blob Storage to store Terraform state
- Create a terraform.tfvars file for Terraform
- Run
terraform init
- Run
terraform apply
(using input variables in generated terraform.tfvars)
With the infrastructure created, you’ll want to retrieve an updated context using (this is also output via Terraform as update_kubeconfig_command
):
az aks get-credentials --name=lumen-{deployment-name} --resource-group lumen-{deployment-name}
At this point you should be able to interact with the kubernetes cluster, e.g.
kubectl get po -n atolio-svc
Note, Atolio specific services run on the following namespaces:
- atolio-svc (Services)
- atolio-db (Database)
When you have validated that the infrastructure is available, the next step is to configure sources.