<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Atolio Documentation – Cloud</title><link>https://docs.atolio.com/deployment/cloud/</link><description>Recent content in Cloud on Atolio Documentation</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://docs.atolio.com/deployment/cloud/index.xml" rel="self" type="application/rss+xml"/><item><title>Deployment: AWS Deployment</title><link>https://docs.atolio.com/deployment/cloud/create-infra-aws/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.atolio.com/deployment/cloud/create-infra-aws/</guid><description>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;p>&lt;img src="atolio-arch-aws.public.png" alt="arch-aws">&lt;/p>
&lt;h2 id="deployment-prerequisites">Deployment Prerequisites&lt;/h2>
&lt;p>In order to get started, your Atolio support team will do the following on your behalf:&lt;/p>
&lt;ol>
&lt;li>Grant your AWS account access to the Client ECR repos (for pulling Docker images).&lt;/li>
&lt;li>Add your Deployment Engineer as a collaborator to the Atolio GitHub repository (lumen-infra), which contains:
&lt;ul>
&lt;li>Deployment documentation&lt;/li>
&lt;li>Terraform for the Atolio stack infrastructure&lt;/li>
&lt;li>Configuration files for Atolio services&lt;/li>
&lt;li>Maintenance scripts&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>The following deployment prerequisites will help streamline your deployment process.&lt;/p>
&lt;h3 id="determine-aws-account">Determine AWS account&lt;/h3>
&lt;p>You can either choose to deploy Atolio into an existing AWS account or a new account. Atolio also supports deploying to your own AWS Virtual Private Cloud (VPC). When the account is available, share the AWS account number with your Atolio support team.&lt;/p>
&lt;p>We recommend:&lt;/p>
&lt;ul>
&lt;li>Ensuring that Service Quotas within your AWS account allow for a minimum of 64 vCPU for &lt;a href="https://console.aws.amazon.com/servicequotas/home/services/ec2/quotas/L-1216C47A">On-Demand Standard&lt;/a> instances. See &lt;a href="https://docs.atolio.com/deployment/hardware-requirements/">Hardware Requirements&lt;/a> for the full list of recommended quotas.&lt;/li>
&lt;li>Raising any other organizational AWS policies / restrictions (e.g. networking, containers) with your Atolio support team ahead of the deployment call.&lt;/li>
&lt;/ul>
&lt;h3 id="determine-deployment-model">Determine Deployment Model&lt;/h3>
&lt;p>We offer both Atolio managed and customer managed deployment models for you to choose from. Please review the comparison and requirements for each approach on our &lt;a href="https://docs.atolio.com/deployment/deployment-model-overview/">Deployment Model Overview&lt;/a> page and inform your Atolio support team which method you&amp;rsquo;d like to use for your deployment.&lt;/p>
&lt;h3 id="atolio-managed-deployment-prerequisites">Atolio Managed Deployment Prerequisites&lt;/h3>
&lt;p>The exact permissions being delegated will be presented to the engineer running the script prior to executing. The IAM policies included are:&lt;/p>
&lt;pre tabindex="0">&lt;code>arn:aws:iam::aws:policy/PowerUserAccess
arn:aws:iam::aws:policy/IAMFullAccess
&lt;/code>&lt;/pre>&lt;p>Access will be limited to a client support machine that is only accessible to Atolio support engineers and that has a static IP of &lt;code>52.43.209.253&lt;/code> assigned to aid in identifying activity from Atolio&amp;rsquo;s team.&lt;/p>
&lt;p>If you opt to allow Atolio&amp;rsquo;s deployment support team to manage the deployment on your behalf the steps to enable this for your AWS account are as follows:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Clone our lumen-infra GitHub repository&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git clone git@github.com:atolio/lumen-infra.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Run our AWS support role script against the AWS account you&amp;rsquo;d like us to deploy into&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>./lumen-infra/deploy/terraform/aws/scripts/atolio-support-role.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Review the output from the script and provide the Role ARN to your Atolio support team&lt;/p>
&lt;pre tabindex="0">&lt;code>Operation completed successfully.
Role ARN: arn:aws:iam::123456789012:role/AtolioDeploymentAccess
&lt;/code>&lt;/pre>&lt;/li>
&lt;/ol>
&lt;h3 id="determine-atolio-dns-name">Determine Atolio DNS name&lt;/h3>
&lt;p>Before the deployment call, you may want to decide on your desired Atolio web location. An AWS Route 53 hosted zone will be created in the AWS account used for hosting the Atolio stack (e.g. &lt;code>search.example.com.&lt;/code>): this will be the DNS name (without the trailing dot) for the Atolio web application (e.g. &lt;code>https://search.example.com&lt;/code>)&lt;/p>
&lt;p>This hosted zone allows the deployment (i.e. the &lt;a href="https://github.com/kubernetes-sigs/external-dns">External DNS controller&lt;/a>) to add records to link host names (e.g. &lt;code>search.example.com&lt;/code>, &lt;code>feed.search.example.com&lt;/code>and &lt;code>relay.search.example.com&lt;/code>) to the load balancer as created by the &lt;a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.8/">AWS ALB controller&lt;/a>.&lt;/p>
&lt;p>For the remainder of this document, we will use &lt;code>https://search.example.com&lt;/code> in the examples, but it is expected for you to replace with your own DNS name.&lt;/p>
&lt;h3 id="determine-cloud-networking-options">Determine Cloud Networking Options&lt;/h3>
&lt;p>By default, Atolio&amp;rsquo;s Terraform code will create a VPC. However, you may choose to use an existing VPC and subnets within your AWS account. In this case, set &lt;code>create_vpc&lt;/code> to &lt;code>false&lt;/code>.&lt;/p>
&lt;p>Then, configure all VPC related variables. See below sample:&lt;/p>
&lt;pre tabindex="0">&lt;code>// Uncomment these lines and update the values in case you want to deploy in a
// pre-existing VPC (by default a new VPC will be created).
//
// Note that automatic subnet discovery for the ALB controller will only work
// if the subnets are tagged correctly as documented here:
// https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.7/deploy/subnet_discovery/
// create_vpc = false
// vpc_id = &amp;#34;vpc-000&amp;#34;
// vpc_cidr_block = &amp;#34;10.42.0.0/20&amp;#34;
// vpc_private_subnet_ids = [&amp;#34;subnet-1111&amp;#34;, &amp;#34;subnet-2222&amp;#34;]
// vpc_public_subnet_ids = [&amp;#34;subnet-3333&amp;#34;, &amp;#34;subnet-4444&amp;#34;]
// vespa_az = &amp;#34;us-west-2a&amp;#34;
// vespa_private_subnet_id = &amp;#34;subnet-1111&amp;#34;
&lt;/code>&lt;/pre>&lt;p>Additional notes regarding existing VPC usage:&lt;/p>
&lt;ul>
&lt;li>As per above sample, subnets must be tagged corectly as documented in &lt;a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.7/deploy/subnet_discovery/">subnet discovery&lt;/a>.&lt;/li>
&lt;li>When specifying &lt;code>vespa_private_subnet_id&lt;/code>, the referenced subnet ID must also be in the &lt;code>vpc_private_subnet_ids&lt;/code> array.&lt;/li>
&lt;li>In terms of VPC sizing, the default of &lt;code>10.42.0.0/20&lt;/code> (4,096 addresses) is consistent across AWS, Azure, and GCP deployments and provides ample room for growth. VPC subnet IP addresses are primarily allocated to the EKS cluster and ALB, with AWS reserving several for internal services. We recommend a subnet of &lt;code>/22&lt;/code> (1,024 IPs) as the minimum to ensure enough available IP addresses for Kubernetes to assign to pods as your deployment scales — a &lt;code>/20&lt;/code> VPC fits four &lt;code>/22&lt;/code> subnets, which covers the standard public/private split across availability zones. Smaller subnet sizes may lead to IPv4 address exhaustion as pod counts increase.&lt;/li>
&lt;li>Ensure specified subnets have available IPv4 Addresses.&lt;/li>
&lt;/ul>
&lt;p>If custom networking configuration will be necessary be sure to provide these details to the engineer performing the deployment.&lt;/p>
&lt;h4 id="determine-eks-api-endpoint-access-cidrs">Determine EKS API endpoint access CIDRs&lt;/h4>
&lt;p>Set &lt;code>eks_cluster_endpoint_public_access_cidrs&lt;/code> in &lt;code>config.hcl&lt;/code> before running &lt;code>create-infra.sh&lt;/code>. See &lt;a href="#create-cloud-infrastructure">below&lt;/a> for more information on this file.&lt;/p>
&lt;p>This is a required configuration step for every AWS deployment. The deployment engineer must decide which public source IPs or CIDR ranges are allowed to reach the EKS cluster API.&lt;/p>
&lt;p>At a minimum, add an entry like this and replace the value with the public IP or CIDR block that should be allowed to administer the cluster:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># This example uses a non-functional CIDR from TEST-NET-3, you must change to a valid access CIDR for your organization&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">eks_cluster_endpoint_public_access_cidrs&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">[&amp;#34;203.0.113.10/32&amp;#34;] &lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If Atolio will perform the deployment on your behalf, include the Atolio deployment support IP:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">eks_cluster_endpoint_public_access_cidrs&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">[&amp;#34;52.43.209.253/32&amp;#34;]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If both Atolio and your team need access during deployment, include both entries in the list.&lt;/p>
&lt;h3 id="setup-authentication">Setup authentication&lt;/h3>
&lt;p>Atolio supports single sign-on (SSO) authentication through Okta, Microsoft Entra ID, and Google using the OpenID Connect (OIDC) protocol.&lt;/p>
&lt;p>Refer to &lt;a href="https://docs.atolio.com/configure-authentication/">Configuring Authentication&lt;/a> for more details on the steps to complete in your desired SSO provider in order to obtain the necessary OIDC configuration values.&lt;/p>
&lt;h3 id="setup-local-environment">Setup local environment&lt;/h3>
&lt;p>Finally, if an engineer from your team will be performing the deployment, ensure they have the following utilities installed:&lt;/p>
&lt;ul>
&lt;li>Setup &lt;a href="https://learn.hashicorp.com/tutorials/terraform/install-cli">Terraform on your local machine&lt;/a> as described on the HashiCorp docs site - we require v1.5.0 at a minimum.&lt;/li>
&lt;li>Install the &lt;a href="https://aws.amazon.com/cli/">AWS Command Line Interface&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://kubernetes.io/docs/tasks/tools/">kubectl&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://helm.sh/docs/intro/install/">Helm&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://docs.atolio.com/configure-sources/#installing-atolioctl">atolioctl&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="provide-deployment-engineer-with-configuration">Provide Deployment Engineer with Configuration&lt;/h2>
&lt;p>At this point if you&amp;rsquo;re proceeding with an Atolio managed deployment you&amp;rsquo;ll need to provide the information from these prerequisite steps to your Atolio deployment support team. Otherwise please ensure the information is provided to the engineer from your organization who will be performing the deployment with Atolio&amp;rsquo;s support.&lt;/p>
&lt;p>To recap, provide these details:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="#determine-atolio-dns-name">Atolio DNS name&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.atolio.com/configure-authentication/">OIDC Configuration&lt;/a>&lt;/li>
&lt;li>&lt;a href="#determine-eks-api-endpoint-access-cidrs">EKS API endpoint CIDRs&lt;/a>&lt;/li>
&lt;li>(Optional) &lt;a href="#determine-cloud-networking-options">Custom Cloud Networking Options&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you&amp;rsquo;re opting to have Atolio manage the deployment you can disregard the remainder of this documentation as these steps will be performed by your Atolio deployment engineer. Otherwise be sure to share this documentation with the engineer from your organization that will be performing the deployment so they can familarize theirself with the steps required.&lt;/p>
&lt;h2 id="create-cloud-infrastructure">Create Cloud Infrastructure&lt;/h2>
&lt;p>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 &lt;code>config.hcl&lt;/code> file based on the provided &lt;code>config.hcl.template&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">cd&lt;/span> deploy/terraform/aws
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp ./config.hcl.template config.hcl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="atolio-domain-name">Atolio Domain Name&lt;/h3>
&lt;p>Update the copied file with appropriate values. At a minimum, it should look something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Domain name for Atolio stack (same as hosted zone name without trailing &amp;#34;.&amp;#34;)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">lumen_domain_name&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;search.example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="application-helm-value-options">Application Helm Value Options&lt;/h3>
&lt;p>Next copy the Helm template and update the values as directed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cp ./templates/values-lumen-admin.yaml values-lumen.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp ./templates/values-vespa-admin.yaml values-vespa.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Default values for lumen.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># This is a YAML-formatted file.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Declare variables to be passed into your templates (provided by admin user).&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># JWT secret key for API call (signature) verification (at least 256 bits / 32 chars)&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Can be generated by running `openssl rand -base64 32` in your terminal&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">jwtSecretKey&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-jwt-secret-key-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Secret salts for generating Vespa document IDs&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Can be generated by running `openssl rand -base64 32` in your terminal&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">secretSalts&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-secret-salts-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># See also scripts/config-oidc.sh helper script to obtain some of the values below&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">oidc&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">provider&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-provider-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">endpoint&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-endpoint-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clientId&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-id-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clientSecret&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-secret-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># If running behind a reverse proxy, this should be set to the URL the end user will&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># use to access the product.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">reverseProxyUrl&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># The ACME Cluster Issuer for LetsEncrypt requires an email address to be provided&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># for certificate notifications. This is required for LetsEncrypt certificates to work properly.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Common examples would be an admin or technical support email address for your organization. ex: &amp;#34;admin@example.com&amp;#34; or &amp;#34;engineering@example.com&amp;#34;.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">letsencrypt&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">email&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;letsencrypt@example.com&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For the &lt;code>jwtSecretKey&lt;/code> and &lt;code>secretSalts&lt;/code> values any 256 bit (32 character) string can be used. These values are used to sign JWT tokens used by the web application and &lt;code>atolioctl&lt;/code> tool and salt document IDs in Atolio&amp;rsquo;s database. They should be well guarded secrets that are unique to the deployment.&lt;/p>
&lt;p>If your users will be accessing the web interface via a reverse proxy (e.g. such as StrongDM), then be sure to set the &lt;code>reverseProxyUrl&lt;/code> field to reflect the URL they will actually enter into their browser to access Atolio, which will be different to the hostname defined in &lt;code>lumen_domain_name&lt;/code>. Leave this field empty if not using a reverse proxy.&lt;/p>
&lt;h3 id="deployment-with-create-infrash-script">Deployment with create-infra.sh script&lt;/h3>
&lt;p>Once you have all variables configured, you can create the infrastructure and deploy the k8s cluster. From the &lt;code>deploy/terraform/aws&lt;/code> directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>./scripts/create-infra.sh --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>deployment-name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will create the infrastructure in the &lt;code>us-west-2&lt;/code> AWS region. If you want to deploy in another region parameter (e.g. us-east-1) an additional parameter can be provided:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>./scripts/create-infra.sh --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>deployment-name --region&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>us-east-1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>deployment-name&lt;/code> argument is used to generate a deployment name for e.g. tagging resources and naming e.g. the kubernetes cluster and S3 buckets. So make sure it is unique across all deployments. (i.e. using a globally unique deployment name). Typically this is set to your company name with an optional suffix if specifying environment (e.g. acmecorp or acmecorp-qa).&lt;/p>
&lt;p>The script automates the following steps (parameterized based on the provided deployment name):&lt;/p>
&lt;ol>
&lt;li>Create an S3 bucket to store Terraform state&lt;/li>
&lt;li>Create a terraform.tfvars file for Terraform&lt;/li>
&lt;li>Run &lt;code>terraform init&lt;/code>&lt;/li>
&lt;li>Run &lt;code>terraform apply&lt;/code> (using input variables in generated terraform.tfvars)&lt;/li>
&lt;/ol>
&lt;h2 id="post-deployment-steps">Post-deployment steps&lt;/h2>
&lt;p>With the infrastructure created, you&amp;rsquo;ll want to update your local kubeconfig with a context for the Atolio cluster (this is also output via Terraform as &lt;code>update_kubeconfig_command&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>aws --profile &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>atolio profile&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span> eks update-kubeconfig --region us-west-2 --name lumen-&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>deployment-name&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="delegate-responsibility-for-atolio-subdomain">Delegate responsibility for Atolio subdomain&lt;/h3>
&lt;p>The parent domain (e.g. &lt;code>example.com&lt;/code>) needs to delegate traffic to the new Atolio subdomain (&lt;code>search.example.com&lt;/code>). This is achieved by adding an NS record to the parent domain with the 4 name servers copied from the new subdomain (similar to what is described &lt;a href="https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingNewSubdomain.html#UpdateDNSParentDomain">here&lt;/a>).&lt;/p>
&lt;p>These nameservers can be retrieved post-creation with &lt;code>terraform output&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>terraform output --json name_servers &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r &lt;span style="color:#4e9a06">&amp;#39;.[]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point you should be able to interact with the kubernetes cluster, e.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl get po -n atolio-svc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note, Atolio specific services run on the following namespaces:&lt;/p>
&lt;ul>
&lt;li>atolio-svc (Services)&lt;/li>
&lt;li>atolio-db (Database)&lt;/li>
&lt;li>atolio-ctl (Control Plane)&lt;/li>
&lt;/ul>
&lt;p>When you have validated that the infrastructure is available, the next step is to &lt;a href="https://docs.atolio.com/configure-sources/">configure sources&lt;/a>.&lt;/p></description></item><item><title>Deployment: Azure Deployment</title><link>https://docs.atolio.com/deployment/cloud/create-infra-azure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.atolio.com/deployment/cloud/create-infra-azure/</guid><description>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;p>&lt;img src="atolio-arch-azure.public.png" alt="arch-azure">&lt;/p>
&lt;h2 id="deployment-prerequisites">Deployment Prerequisites&lt;/h2>
&lt;p>In order to get started, your Atolio support team will do the following on your behalf:&lt;/p>
&lt;ol>
&lt;li>Grant access to Client ACR repos (for pulling Docker images) to your Azure subscription and provide image pull secrets.&lt;/li>
&lt;li>Add your Deployment Engineer as a collaborator to the Atolio GitHub repository (lumen-infra), which contains:
&lt;ul>
&lt;li>Deployment documentation&lt;/li>
&lt;li>Terraform for the Atolio stack infrastructure&lt;/li>
&lt;li>Configuration files for Atolio services&lt;/li>
&lt;li>Maintenance scripts&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>The following deployment prerequisites will help streamline your deployment process.&lt;/p>
&lt;h3 id="determine-azure-subscription">Determine Azure subscription&lt;/h3>
&lt;p>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 &amp;amp; RG are available, share the details with your Atolio support team.&lt;/p>
&lt;p>We recommend:&lt;/p>
&lt;ul>
&lt;li>Ensuring that Service Quotas within your Azure subscription allow for a minimum of 64 vCPU under the &lt;a href="https://portal.azure.com/#view/Microsoft_Azure_Capacity/QuotaMenuBlade/~/myQuotas">Total Regional vCPUs&lt;/a> quota. See &lt;a href="https://docs.atolio.com/deployment/hardware-requirements/">Hardware Requirements&lt;/a> for the full list of recommended quotas.&lt;/li>
&lt;li>Raising any other organizational Azure policies / restrictions (e.g. networking, containers) with your Atolio support team ahead of the deployment call.&lt;/li>
&lt;/ul>
&lt;h3 id="determine-deployment-model">Determine Deployment Model&lt;/h3>
&lt;p>We offer both Atolio managed and customer managed deployment models for you to choose from. Please review the comparison and requirements for each approach on our &lt;a href="https://docs.atolio.com/deployment/deployment-model-overview/">Deployment Model Overview&lt;/a> page and inform your Atolio support team which method you&amp;rsquo;d like to use for your deployment.&lt;/p>
&lt;h3 id="atolio-managed-deployment-prerequisites">Atolio Managed Deployment Prerequisites&lt;/h3>
&lt;p>The Microsoft Role policy document we provision with our support role script is as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;Name&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Atolio Support Access&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;Description&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Custom role for Atolio support engineers with minimal required permissions including AKS credential access&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;AssignableScopes&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;/subscriptions/your-subscription-id&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;Actions&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/agentPools/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/agentPools/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/agentPools/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/listClusterAdminCredential/action&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/listClusterUserCredential/action&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ContainerService/managedClusters/accessProfiles/listCredential/action&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/subnets/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/subnets/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/subnets/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/virtualNetworks/subnets/join/action&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/publicIPAddresses/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/publicIPAddresses/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/publicIPAddresses/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/applicationGateways/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/applicationGateways/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/applicationGateways/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/dnsZones/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/dnsZones/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/dnsZones/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Network/dnsZones/SOA/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/listKeys/action&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/fileServices/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/fileServices/shares/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/blobServices/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/blobServices/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/blobServices/containers/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/blobServices/containers/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Storage/storageAccounts/blobServices/containers/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Compute/disks/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Compute/disks/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Compute/disks/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ManagedIdentity/userAssignedIdentities/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ManagedIdentity/userAssignedIdentities/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ManagedIdentity/userAssignedIdentities/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Authorization/roleAssignments/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Authorization/roleAssignments/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Authorization/roleAssignments/delete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Resources/subscriptions/resourceGroups/read&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Resources/subscriptions/resourcegroups/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Resources/subscriptions/resourcegroups/delete&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;NotActions&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Authorization/elevateAccess/Action&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Authorization/roleDefinitions/write&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;Microsoft.Authorization/roleDefinitions/delete&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;DataActions&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;NotDataActions&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;condition&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;@iPAddress() matches &amp;#39;^52.43.209.253$&amp;#39;&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;conditionVersion&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;2.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Access will be limited to a client support machine that is only accessible to Atolio support engineers and that has a static IP of &lt;code>52.43.209.253&lt;/code> assigned to aid in identifying activity from Atolio&amp;rsquo;s team.&lt;/p>
&lt;p>If you opt to allow Atolio&amp;rsquo;s deployment support team to manage the deployment on your behalf the steps to enable this for your Azure subscription are as follows:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Clone our lumen-infra GitHub repository&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git clone git@github.com:atolio/lumen-infra.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Run our Azure support role script against the Azure subscription you&amp;rsquo;d like us to deploy into&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>./lumen-infra/deploy/terraform/azure/scripts/atolio-support-role.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Review the output from the script and provide the details to your Atolio support team&lt;/p>
&lt;pre tabindex="0">&lt;code>Operation completed successfully.
Please securely share the following details with your Atolio support engineer:
Tenant ID: &amp;lt;tenant ID&amp;gt;
Subscription ID: &amp;lt;subsciption ID&amp;gt;
Application (Client) ID: &amp;lt;client app ID&amp;gt;
Client Secret: &amp;lt;client secret&amp;gt;
Secret Expiry Date: &amp;lt;expiry date&amp;gt;
These credentials grant access to the specified Azure subscription with the
custom role &amp;#39;Atolio Support Access&amp;#39;. The client secret will expire on &amp;lt;expiry date&amp;gt;.
&lt;/code>&lt;/pre>&lt;/li>
&lt;/ol>
&lt;h3 id="determine-atolio-dns-name">Determine Atolio DNS name&lt;/h3>
&lt;p>Before the deployment call, you may want to decide on your desired Atolio web location. An Azure DNS Zone will be created in the Azure subscription used for hosting the Atolio stack (e.g. &lt;code>search.example.com.&lt;/code>): this will be the DNS name (without the trailing dot) for the Atolio Web application (e.g. &lt;code>https://search.example.com&lt;/code>).&lt;/p>
&lt;p>For the remainder of this document, we will use &lt;code>https://search.example.com&lt;/code> in the examples, but it is expected for you to replace with your own DNS name.&lt;/p>
&lt;h3 id="determine-cloud-networking-options">Determine Cloud Networking Options&lt;/h3>
&lt;p>By default, Atolio&amp;rsquo;s Terraform code will create a VNet in your Azure subscription. However, you may choose to use an existing VNet and subnets within your Azure subscription. In this case, set &lt;code>create_vnet&lt;/code> to &lt;code>false&lt;/code> in the &lt;code>config.hcl&lt;/code> file during the deployment.&lt;/p>
&lt;p>Then, configure all VPC related variables. See this example from &lt;code>config.hcl&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-hcl" data-lang="hcl">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">Uncomment&lt;/span> &lt;span style="color:#204a87;font-weight:bold">these&lt;/span> &lt;span style="color:#204a87;font-weight:bold">lines&lt;/span> &lt;span style="color:#204a87;font-weight:bold">and&lt;/span> &lt;span style="color:#204a87;font-weight:bold">update&lt;/span> &lt;span style="color:#204a87;font-weight:bold">the&lt;/span> &lt;span style="color:#204a87;font-weight:bold">values&lt;/span> &lt;span style="color:#204a87;font-weight:bold">in&lt;/span> &lt;span style="color:#204a87;font-weight:bold">case&lt;/span> &lt;span style="color:#204a87;font-weight:bold">you&lt;/span> &lt;span style="color:#204a87;font-weight:bold">want&lt;/span> &lt;span style="color:#204a87;font-weight:bold">to&lt;/span> &lt;span style="color:#204a87;font-weight:bold">deploy&lt;/span> &lt;span style="color:#204a87;font-weight:bold">in&lt;/span> &lt;span style="color:#204a87;font-weight:bold">a&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">pre&lt;/span>&lt;span style="color:#a40000">-&lt;/span>&lt;span style="color:#204a87;font-weight:bold">existing&lt;/span> &lt;span style="color:#204a87;font-weight:bold">VNet&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#204a87;font-weight:bold">by&lt;/span> &lt;span style="color:#204a87;font-weight:bold">default&lt;/span> &lt;span style="color:#204a87;font-weight:bold">a&lt;/span> &lt;span style="color:#204a87;font-weight:bold">new&lt;/span> &lt;span style="color:#204a87;font-weight:bold">VNet&lt;/span> &lt;span style="color:#204a87;font-weight:bold">will&lt;/span> &lt;span style="color:#204a87;font-weight:bold">be&lt;/span> &lt;span style="color:#204a87;font-weight:bold">created&lt;/span>&lt;span style="color:#000;font-weight:bold">).&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// create_vnet&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// vnet_id&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;/subscriptions/{tenantID}/resourceGroups/{rgID}/providers/Microsoft.Network/virtualNetworks/{vnetName}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// vnet_private_subnet_id&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;/subscriptions/{tenantID}/resourceGroups/{rgID}/providers/Microsoft.Network/virtualNetworks/{vnetName}/subnets/{privateSubnetName}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// vnet_public_subnet_id&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;/subscriptions/{tenantID}/resourceGroups/{rgID}/providers/Microsoft.Network/virtualNetworks/{vnetName}/subnets/{publicSubnetName}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Optionally, when &lt;code>create_vnet&lt;/code> is not set to &lt;code>false&lt;/code> you can customize the default VNet and Subnet CIDR blocks if you have specific requirements. See this example from &lt;code>config.hcl&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-hcl" data-lang="hcl">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">Uncomment&lt;/span> &lt;span style="color:#204a87;font-weight:bold">these&lt;/span> &lt;span style="color:#204a87;font-weight:bold">lines&lt;/span> &lt;span style="color:#204a87;font-weight:bold">and&lt;/span> &lt;span style="color:#204a87;font-weight:bold">update&lt;/span> &lt;span style="color:#204a87;font-weight:bold">the&lt;/span> &lt;span style="color:#204a87;font-weight:bold">values&lt;/span> &lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#204a87;font-weight:bold">you&lt;/span> &lt;span style="color:#204a87;font-weight:bold">want&lt;/span> &lt;span style="color:#204a87;font-weight:bold">to&lt;/span> &lt;span style="color:#204a87;font-weight:bold">customize&lt;/span> &lt;span style="color:#204a87;font-weight:bold">the&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">default&lt;/span> &lt;span style="color:#204a87;font-weight:bold">CIDR&lt;/span> &lt;span style="color:#204a87;font-weight:bold">blocks&lt;/span> &lt;span style="color:#204a87;font-weight:bold">for&lt;/span> &lt;span style="color:#204a87;font-weight:bold">the&lt;/span> &lt;span style="color:#204a87;font-weight:bold">VNet&lt;/span> &lt;span style="color:#204a87;font-weight:bold">and&lt;/span> &lt;span style="color:#204a87;font-weight:bold">Subnets&lt;/span> &lt;span style="color:#204a87;font-weight:bold">created&lt;/span> &lt;span style="color:#204a87;font-weight:bold">automatically&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">Note&lt;/span>&lt;span style="color:#a40000">:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">this&lt;/span> &lt;span style="color:#204a87;font-weight:bold">only&lt;/span> &lt;span style="color:#204a87;font-weight:bold">applies&lt;/span> &lt;span style="color:#204a87;font-weight:bold">for&lt;/span> &lt;span style="color:#204a87;font-weight:bold">when&lt;/span> &lt;span style="color:#204a87;font-weight:bold">create_vnet&lt;/span> &lt;span style="color:#204a87;font-weight:bold">hasn&lt;/span>&lt;span style="color:#a40000">&amp;#39;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">t&lt;/span> &lt;span style="color:#204a87;font-weight:bold">been&lt;/span> &lt;span style="color:#204a87;font-weight:bold">set&lt;/span> &lt;span style="color:#204a87;font-weight:bold">to&lt;/span> &lt;span style="color:#204a87;font-weight:bold">false&lt;/span> &lt;span style="color:#204a87;font-weight:bold">and&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// any values modified here will be ignored when create_vnet&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">false&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// vnet_cidr&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;10.42.0.0/20&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// pod_subnet_block&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;10.42.0.0/22&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">// appgw_subnet_block&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;10.42.4.0/24&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If custom networking configuration will be necessary be sure to provide these details to the engineer performing the deployment.&lt;/p>
&lt;h3 id="setup-authentication">Setup Authentication&lt;/h3>
&lt;p>Atolio supports single sign-on (SSO) authentication through Okta, Microsoft Entra ID, and Google using the OpenID Connect (OIDC) protocol.&lt;/p>
&lt;p>Refer to &lt;a href="https://docs.atolio.com/configure-authentication/">Configuring Authentication&lt;/a> for more details on the steps to complete in your desired SSO provider in order to obtain the necessary OIDC configuration values.&lt;/p>
&lt;p>If using Microsoft Entra ID, the &lt;code>oidc_client_id&lt;/code> and &lt;code>oidc_client_secret&lt;/code> will be the respective values created and saved during &lt;a href="https://docs.atolio.com/configure-authentication/">Azure AD - Create New App Registration&lt;/a>.&lt;/p>
&lt;h3 id="setup-local-environment">Setup local environment&lt;/h3>
&lt;p>Finally, if an engineer from your team will be performing the deployment, ensure they have the following utilities installed:&lt;/p>
&lt;ul>
&lt;li>Setup &lt;a href="https://learn.hashicorp.com/tutorials/terraform/install-cli">Terraform on your local machine&lt;/a> as described on the HashiCorp docs site - we require v1.5.0 at a minimum.&lt;/li>
&lt;li>Install the &lt;a href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli">Azure Command Line Interface&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://kubernetes.io/docs/tasks/tools/">kubectl&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://helm.sh/docs/intro/install/">Helm&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://docs.atolio.com/configure-sources/#installing-atolioctl">atolioctl&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong>
If you are running on Windows, you may also need to install the &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/install">Windows Subsystem for Linux&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="provide-deployment-engineer-with-configuration">Provide Deployment Engineer with Configuration&lt;/h2>
&lt;p>At this point if you&amp;rsquo;re proceeding with an Atolio managed deployment you&amp;rsquo;ll need to provide the information from these prerequisite steps to your Atolio deployment support team. Otherwise please ensure the information is provided to the engineer from your organization who will be performing the deployment with Atolio&amp;rsquo;s support.&lt;/p>
&lt;p>To recap, provide these details:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="#determine-atolio-dns-name">Atolio DNS name&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.atolio.com/configure-authentication/">OIDC Configuration&lt;/a>&lt;/li>
&lt;li>(Optional) &lt;a href="#determine-cloud-networking-options">Custom Cloud Networking Options&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you&amp;rsquo;re opting to have Atolio manage the deployment you can disregard the remainder of this documentation as these steps will be performed by your Atolio deployment engineer. Otherwise be sure to share this documentation with the engineer from your organization that will be performing the deployment so they can familarize theirself with the steps required.&lt;/p>
&lt;h2 id="create-cloud-infrastructure">Create Cloud Infrastructure&lt;/h2>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong>
Atolio requires an Azure region with 3 availability zones. You can check which regions include support for multiple availability zones &lt;a href="https://learn.microsoft.com/en-us/azure/reliability/availability-zones-service-support">here&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>The Terraform configuration requires an Azure storage account to store state. A script is available to automate the whole process (including running Terraform). Before running the script, create a &lt;code>config.hcl&lt;/code> file based on the provided &lt;code>config.hcl.template&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">cd&lt;/span> deploy/terraform/azure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp ./config.hcl.template config.hcl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="atolio-domain-name-and-image-pull-secrets">Atolio Domain Name and Image Pull Secrets&lt;/h3>
&lt;p>Update the copied file with appropriate values. At a minimum, it should look something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-hcl" data-lang="hcl">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">Domain&lt;/span> &lt;span style="color:#204a87;font-weight:bold">name&lt;/span> &lt;span style="color:#204a87;font-weight:bold">for&lt;/span> &lt;span style="color:#204a87;font-weight:bold">Atolio&lt;/span> &lt;span style="color:#204a87;font-weight:bold">stack&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#204a87;font-weight:bold">same&lt;/span> &lt;span style="color:#204a87;font-weight:bold">as&lt;/span> &lt;span style="color:#204a87;font-weight:bold">hosted&lt;/span> &lt;span style="color:#204a87;font-weight:bold">zone&lt;/span> &lt;span style="color:#204a87;font-weight:bold">name&lt;/span> &lt;span style="color:#204a87;font-weight:bold">without&lt;/span> &lt;span style="color:#204a87;font-weight:bold">trailing&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;.&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">lumen_domain_name&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;search.example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">//&lt;/span> &lt;span style="color:#204a87;font-weight:bold">The&lt;/span> &lt;span style="color:#204a87;font-weight:bold">registry&lt;/span> &lt;span style="color:#204a87;font-weight:bold">in&lt;/span> &lt;span style="color:#204a87;font-weight:bold">which&lt;/span> &lt;span style="color:#204a87;font-weight:bold">to&lt;/span> &lt;span style="color:#204a87;font-weight:bold">obtain&lt;/span> &lt;span style="color:#204a87;font-weight:bold">containers&lt;/span> &lt;span style="color:#204a87;font-weight:bold">for&lt;/span> &lt;span style="color:#204a87;font-weight:bold">services&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">container_registry&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;atolioimages.azurecr.io&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">image_pull_username&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;provided-by-atolio&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">image_pull_password&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;provided-by-atolio&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Your Atolio support team will share the appropriate values for the &lt;code>image_pull_username&lt;/code> and &lt;code>image_pull_password&lt;/code> values.&lt;/p>
&lt;h3 id="application-helm-value-options">Application Helm Value Options&lt;/h3>
&lt;p>Next copy the Helm template and update the values as directed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cp ./templates/values-lumen-admin.yaml values-lumen.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp ./templates/values-vespa-admin.yaml values-vespa.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Default values for lumen.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># This is a YAML-formatted file.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Declare variables to be passed into your templates (provided by admin user).&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># JWT secret key for API call (signature) verification (at least 256 bits / 32 chars)&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Can be generated by running `openssl rand -base64 32` in your terminal&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">jwtSecretKey&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-jwt-secret-key-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Secret salts for generating Vespa document IDs&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Can be generated by running `openssl rand -base64 32` in your terminal&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">secretSalts&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-secret-salts-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># See also scripts/config-oidc.sh helper script to obtain some of the values below&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">oidc&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">provider&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-provider-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">endpoint&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-endpoint-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clientId&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-id-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clientSecret&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-secret-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Use the Atolio provided image pull secrets for accessing Atolio container images&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">imagePullSecret&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">create&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># If running behind a reverse proxy, this should be set to the URL the end user will&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># use to access the product.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">reverseProxyUrl&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># The ACME Cluster Issuer for LetsEncrypt requires an email address to be provided&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># for certificate notifications. This is required for LetsEncrypt certificates to work properly.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Common examples would be an admin or technical support email address for your organization. ex: &amp;#34;admin@example.com&amp;#34; or &amp;#34;engineering@example.com&amp;#34;.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">letsencrypt&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">email&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;letsencrypt@example.com&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">dns01&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">azureDNS&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">environment&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">AzurePublicCloud&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For the &lt;code>jwtSecretKey&lt;/code> and &lt;code>secretSalts&lt;/code> values any 256 bit (32 character) string can be used. These values are used to sign JWT tokens used by the web application and &lt;code>atolioctl&lt;/code> tool and salt document IDs in Atolio&amp;rsquo;s database. They should be well guarded secrets that are unique to the deployment.&lt;/p>
&lt;p>If your users will be accessing the web interface via a reverse proxy (e.g. such as StrongDM), then be sure to set the &lt;code>reverseProxyUrl&lt;/code> field to reflect the URL they will actually enter into their browser to access Atolio, which will be different to the hostname defined in &lt;code>lumen_domain_name&lt;/code>. Leave this field empty if not using a reverse proxy.&lt;/p>
&lt;h3 id="deployment-with-create-infrash-script">Deployment with create-infra.sh script&lt;/h3>
&lt;p>Once you have all variables configured to your environment&amp;rsquo;s requirements you can create the infrastructure and deploy the k8s cluster. From the &lt;code>deploy/terraform/azure&lt;/code> directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>./scripts/create-infra.sh --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>deployment-name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will create the infrastructure in the &lt;code>westus3&lt;/code> Azure region. If you want to deploy in another region parameter (e.g. eastus) an additional parameter can be provided:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>./scripts/create-infra.sh --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>deployment-name --region&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>eastus
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>deployment-name&lt;/code> 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 set to your company name with an optional suffix if specifying environment (e.g. acmecorp or acmecorp-qa).&lt;/p>
&lt;p>The script automates the following steps (parameterized based on the provided deployment name):&lt;/p>
&lt;ol>
&lt;li>Create an Azure Blob Storage to store Terraform state&lt;/li>
&lt;li>Create a terraform.tfvars file for Terraform&lt;/li>
&lt;li>Run &lt;code>terraform init&lt;/code>&lt;/li>
&lt;li>Run &lt;code>terraform apply&lt;/code> (using input variables in generated terraform.tfvars)&lt;/li>
&lt;/ol>
&lt;h2 id="post-deployment-steps">Post-deployment steps&lt;/h2>
&lt;p>With the infrastructure created, you&amp;rsquo;ll want to update your local kubeconfig with a context for the Atolio cluster (this is also output via Terraform as &lt;code>update_kubeconfig_command&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>az aks get-credentials --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>lumen-&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>deployment-name&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span> --resource-group lumen-&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>deployment-name&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="delegate-responsibility-for-atolio-subdomain">Delegate responsibility for Atolio subdomain&lt;/h3>
&lt;p>The parent domain (e.g. &lt;code>example.com&lt;/code>) needs to delegate traffic to the new Atolio subdomain (&lt;code>search.example.com&lt;/code>). This is achieved by adding an NS record to the parent domain with the 4 name servers copied from the new subdomain.&lt;/p>
&lt;p>These nameservers can be retrieved post-creation with &lt;code>terraform output&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>terraform output --json name_servers &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r &lt;span style="color:#4e9a06">&amp;#39;.[]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point you should be able to interact with the kubernetes cluster, e.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl get po -n atolio-svc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note, Atolio specific services run on the following namespaces:&lt;/p>
&lt;ul>
&lt;li>atolio-svc (Services)&lt;/li>
&lt;li>atolio-db (Database)&lt;/li>
&lt;li>atolio-ctl (Control Plane)&lt;/li>
&lt;/ul>
&lt;p>When you have validated that the infrastructure is available, the next step is to &lt;a href="https://docs.atolio.com/configure-sources/">configure sources&lt;/a>.&lt;/p></description></item><item><title>Deployment: GCP Deployment</title><link>https://docs.atolio.com/deployment/cloud/create-infra-gcp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.atolio.com/deployment/cloud/create-infra-gcp/</guid><description>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;p>&lt;img src="atolio-arch-gcp.png" alt="arch-gcp">&lt;/p>
&lt;h2 id="deployment-prerequisites">Deployment Prerequisites&lt;/h2>
&lt;p>Before getting started, Atolio needs to have done the following on your behalf:&lt;/p>
&lt;ol>
&lt;li>Granted your GCP project access to the Client Container Registry repos (for pulling Atolio container images)&lt;/li>
&lt;li>Add your Deployment Engineer as a collaborator to the Atolio GitHub repository (lumen-infra), which contains:
&lt;ul>
&lt;li>Deployment documentation&lt;/li>
&lt;li>Terraform for the Atolio stack infrastructure&lt;/li>
&lt;li>Configuration files for Atolio services&lt;/li>
&lt;li>Maintenance scripts&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ensure your GCP project has sufficient quota for the required resources, particularly Compute Engine API and Google Kubernetes Engine API. See &lt;a href="https://docs.atolio.com/deployment/hardware-requirements/">Hardware Requirements&lt;/a> for the full list of recommended quotas.&lt;/li>
&lt;/ol>
&lt;p>The following deployment prerequisites will help streamline your deployment process.&lt;/p>
&lt;h3 id="determine-gcp-project">Determine GCP project&lt;/h3>
&lt;p>We recommend you create a new GCP project to host Atolio, as this will help keep your Atolio deployment and other resources separate from your production environment. When the project is available, share the GCP project ID and number with your Atolio support team.&lt;/p>
&lt;h3 id="determine-deployment-model">Determine Deployment Model&lt;/h3>
&lt;p>We offer both Atolio managed and customer managed deployment models for you to choose from. Please review the comparison and requirements for each approach on our &lt;a href="https://docs.atolio.com/deployment/deployment-model-overview/">Deployment Model Overview&lt;/a> page and inform your Atolio support team which method you&amp;rsquo;d like to use for your deployment.&lt;/p>
&lt;h3 id="determine-atolio-dns-name">Determine Atolio DNS name&lt;/h3>
&lt;p>Before the deployment call, you may want to decide on your desired Atolio web address. A GCP Cloud DNS zone will be created in the GCP project used for hosting the Atolio stack (e.g. &lt;code>search.example.com.&lt;/code>): this will be the DNS name (without the trailing dot) for the Atolio web application (e.g. &lt;code>https://search.example.com&lt;/code>).&lt;/p>
&lt;p>This Cloud DNS zone allows the deployment control plane (i.e. the &lt;a href="https://github.com/kubernetes-sigs/external-dns">External DNS controller&lt;/a>) to add records to link host names (e.g. &lt;code>search.example.com&lt;/code>, &lt;code>feed.search.example.com&lt;/code>and &lt;code>relay.search.example.com&lt;/code>) to the Ingress controller used for the deployment.&lt;/p>
&lt;p>For the remainder of this document, we will use &lt;code>https://search.example.com&lt;/code> in the examples, but it is expected for you to replace with your own DNS name.&lt;/p>
&lt;h3 id="setup-authentication">Setup authentication&lt;/h3>
&lt;p>Atolio supports single sign-on (SSO) authentication through Okta, Microsoft Entra ID, and Google using the OpenID Connect (OIDC) protocol.&lt;/p>
&lt;p>Refer to &lt;a href="https://docs.atolio.com/configure-authentication/">Configuring Authentication&lt;/a> for more details on the steps to complete in your desired SSO provider in order to obtain the necessary OIDC configuration values.&lt;/p>
&lt;h3 id="setup-local-environment">Setup local environment&lt;/h3>
&lt;p>Finally, if an engineer from your team will be performing the deployment, ensure they have the following utilities installed:&lt;/p>
&lt;ul>
&lt;li>Setup &lt;a href="https://learn.hashicorp.com/tutorials/terraform/install-cli">Terraform on your local machine&lt;/a> as described on the HashiCorp docs site - we require v1.6.0 at a minimum.&lt;/li>
&lt;li>Install the &lt;a href="https://cloud.google.com/sdk/docs/install">Google Cloud SDK&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://kubernetes.io/docs/tasks/tools/">kubectl&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://helm.sh/docs/intro/install/">Helm&lt;/a>&lt;/li>
&lt;li>Install &lt;a href="https://docs.atolio.com/configure-sources/#installing-atolioctl">atolioctl&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="provide-deployment-engineer-with-configuration">Provide Deployment Engineer with Configuration&lt;/h2>
&lt;p>At this point if you&amp;rsquo;re proceeding with an Atolio managed deployment you&amp;rsquo;ll need to provide the information from these prerequisite steps to your Atolio deployment support team. Otherwise please ensure the information is provided to the engineer from your organization who will be performing the deployment with Atolio&amp;rsquo;s support.&lt;/p>
&lt;p>To recap, provide these details:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="#determine-atolio-dns-name">Atolio DNS name&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.atolio.com/configure-authentication/">OIDC Configuration&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you&amp;rsquo;re opting to have Atolio manage the deployment you can disregard the remainder of this documentation as these steps will be performed by your Atolio deployment engineer. Otherwise be sure to share this documentation with the engineer from your organization that will be performing the deployment so they can familarize theirself with the steps required.&lt;/p>
&lt;h2 id="create-cloud-infrastructure">Create Cloud Infrastructure&lt;/h2>
&lt;p>The Terraform configuration requires an external (Google Cloud Storage) bucket to store state. A script is available to automate the whole process (including running Terraform). Before running the script, create a &lt;code>config.hcl&lt;/code> file based on the provided &lt;code>config.hcl.template&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">cd&lt;/span> deploy/terraform/gcp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp ./config.hcl.template config.hcl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update the copied file with appropriate values. At a minimum, it should specify the zone you&amp;rsquo;re deploying to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">// Core Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">zone&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;us-central1-f&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="atolio-domain-name">Atolio Domain Name&lt;/h3>
&lt;p>Update the copied file with subdomain you will use for your Atolio deployment values:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Domain name for Atolio stack (same as hosted zone name without trailing &amp;#34;.&amp;#34;)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">lumen_domain_name&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;search.example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="application-helm-value-options">Application Helm Value Options&lt;/h3>
&lt;p>Next copy the Helm template and update the values as directed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cp ./templates/values-lumen-admin.yaml values-lumen.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp ./templates/values-vespa-admin.yaml values-vespa.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Default values for lumen.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># This is a YAML-formatted file.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Declare variables to be passed into your templates (provided by admin user).&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># JWT secret key for API call (signature) verification (at least 256 bits / 32 chars)&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Can be generated by running `openssl rand -base64 32` in your terminal&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">jwtSecretKey&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-jwt-secret-key-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Secret salts for generating Vespa document IDs&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Can be generated by running `openssl rand -base64 32` in your terminal&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">secretSalts&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-secret-salts-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># See also scripts/config-oidc.sh helper script to obtain some of the values below&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">oidc&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">provider&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-provider-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">endpoint&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-endpoint-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clientId&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-id-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clientSecret&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;add-your-secret-here&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># If running behind a reverse proxy, this should be set to the URL the end user will&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># use to access the product.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">reverseProxyUrl&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># The ACME Cluster Issuer for LetsEncrypt requires an email address to be provided&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># for certificate notifications. This is required for LetsEncrypt certificates to work properly.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Common examples would be an admin or technical support email address for your organization. ex: &amp;#34;admin@example.com&amp;#34; or &amp;#34;engineering@example.com&amp;#34;.&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">letsencrypt&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">email&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;letsencrypt@example.com&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For the &lt;code>jwtSecretKey&lt;/code> and &lt;code>secretSalts&lt;/code> values any 256 bit (32 character) string can be used. These values are used to sign JWT tokens used by the web application and &lt;code>atolioctl&lt;/code> tool and salt document IDs in Atolio&amp;rsquo;s database. They should be well guarded secrets that are unique to the deployment.&lt;/p>
&lt;p>If your users will be accessing the web interface via a reverse proxy (e.g. such as StrongDM), then be sure to set the &lt;code>reverseProxyUrl&lt;/code> field to reflect the URL they will actually enter into their browser to access Atolio, which will be different to the hostname defined in &lt;code>lumen_domain_name&lt;/code>. Leave this field empty if not using a reverse proxy.&lt;/p>
&lt;p>The ACME Cluster Issuer for LetsEncrypt requires an email address to be provided for certificate notifications. If the default &lt;code>@example.com&lt;/code> email address is used, then the Cluster Issuer will fail to register for certificate management so be sure to provide a valid email address.&lt;/p>
&lt;h3 id="deployment-with-create-infrash-script">Deployment with create-infra.sh script&lt;/h3>
&lt;p>Once you have all variables configured, you can create the infrastructure and deploy the GKE cluster. From the &lt;code>deploy/terraform/gcp&lt;/code> directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>./scripts/create-infra.sh --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>acmecorp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will create the infrastructure in the &lt;code>us-central1&lt;/code> GCP region. If you want to deploy in another region parameter (e.g. us-west2) an additional parameter can be provided:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>./scripts/create-infra.sh --name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>acmecorp --region&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>us-west2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>--name&lt;/code> argument is used to generate a deployment name for tagging resources and naming the GCP resources. So make sure it is unique across all deployments. (i.e. using a globally unique deployment name). Typically this is set to your company name with an optional suffix if specifying environment (e.g. acmecorp or acmecorp-qa).&lt;/p>
&lt;p>The script automates the following steps (parameterized based on the provided deployment name):&lt;/p>
&lt;ol>
&lt;li>Create a Google Cloud Storage bucket to store Terraform state&lt;/li>
&lt;li>Create a &lt;code>terraform.tfvars&lt;/code> file for Terraform based on the &lt;code>config.hcl&lt;/code> file&lt;/li>
&lt;li>Run &lt;code>terraform init&lt;/code>&lt;/li>
&lt;li>Run &lt;code>terraform apply&lt;/code> (using input variables in generated terraform.tfvars)&lt;/li>
&lt;/ol>
&lt;h2 id="post-deployment-steps">Post-deployment steps&lt;/h2>
&lt;p>With the infrastructure created, you&amp;rsquo;ll want to update your local kubeconfig with a context for the Atolio cluster (this is also output via Terraform as &lt;code>update_kubeconfig_command&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>gcloud container clusters get-credentials lumen-&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>deployment-name&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span> --region us-central1 --project &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>your-gcp-project-id&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="delegate-responsibility-for-atolio-subdomain">Delegate responsibility for Atolio subdomain&lt;/h3>
&lt;p>The parent domain (e.g. &lt;code>example.com&lt;/code>) needs to delegate traffic to the new Atolio subdomain (&lt;code>search.example.com&lt;/code>). This is achieved by adding an NS record to the parent domain with the 4 name servers copied from the new subdomain.&lt;/p>
&lt;p>These nameservers can be retrieved post-creation with &lt;code>terraform output&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>terraform output --json name_servers &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r &lt;span style="color:#4e9a06">&amp;#39;.[]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="deployment-verification">Deployment Verification&lt;/h3>
&lt;p>At this point you should be able to interact with the Kubernetes cluster and see Atolio pods deployed, e.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl get po -n atolio-svc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note, Atolio specific services run on the following namespaces:&lt;/p>
&lt;ul>
&lt;li>atolio-svc (Application Services)&lt;/li>
&lt;li>atolio-db (Database)&lt;/li>
&lt;li>atolio-ctl (Control Plane)&lt;/li>
&lt;/ul>
&lt;p>When you have validated that the infrastructure is available, the next step is to &lt;a href="https://docs.atolio.com/configure-sources/">configure sources&lt;/a>.&lt;/p></description></item></channel></rss>