<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Terraform on Business Information Technology Services</title>
        <link>https://www.bitservices.io/categories/terraform/</link>
        <description>Recent content in Terraform on Business Information Technology Services</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <copyright>BITServices Ltd</copyright>
        <lastBuildDate>Sat, 01 Jan 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://www.bitservices.io/categories/terraform/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Arden University</title>
        <link>https://www.bitservices.io/projects/arden/</link>
        <pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/arden/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://arden.ac.uk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://www.bitservices.io/img/arden-university/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Arden University&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For Arden, there were two projects to deliver: an Amazon Elastic Kubernetes
Service (&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/eks/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EKS&lt;/a&gt;) based platform and development of their serverless integrations.&lt;/p&gt;
&lt;p&gt;In order to help with the delivery of these projects, some open source
contributions were made.&lt;/p&gt;
&lt;h1 id=&#34;elastic-kubernetes-service-eks-platform&#34;&gt;Elastic Kubernetes Service (&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/eks/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EKS&lt;/a&gt;) Platform
&lt;/h1&gt;&lt;p&gt;A new platform was required to migrate existing on-premises and Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/ec2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EC2&lt;/a&gt;
workloads to. The new platform had to allow developers to easily manage their
own deployments, allow for centralised logging and monitoring, had to be secure
and allow for management of things such as DNS records and TLS certificates to
be fully automated.&lt;/p&gt;
&lt;p&gt;The platform had to be delivered &amp;lsquo;as code&amp;rsquo; so it could be easily managed,
upgraded and replicated. This was done using mainly &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; with some base
&lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; services being deployed using the &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://helm.sh/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Helm&lt;/a&gt; provider.&lt;/p&gt;
&lt;p&gt;Any base &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; services that &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; did not depend on explicitly were
managed and deployed by &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; along with the business applications hosted on
the platform.&lt;/p&gt;
&lt;h2 id=&#34;managing-deployments-with-argocd&#34;&gt;Managing Deployments with ArgoCD
&lt;/h2&gt;&lt;p&gt;The main interface into the platform for developers was through &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt;. This
allowed developers to deploy applications, see the status of their workloads and
get immediate logs and events to diagnose failures. Being able to deploy and
diagnose simple issues themselves allowed developers to spend less time being
blocked waiting for infrastructure engineers to help out.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; was integrated with Microsoft &lt;a class=&#34;link&#34; href=&#34;https://www.microsoft.com/security/business/microsoft-entra&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Entra&lt;/a&gt; to allow single-sign on which
improves security and convenience. Developers could be assigned to individual
projects meaning they only have access to the applications that they are working
with.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://argocd-image-updater.readthedocs.io/en/stable/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD Image Updater&lt;/a&gt; was also used in development environments so that
successful builds of an application could be deployed automatically.&lt;/p&gt;
&lt;h2 id=&#34;monitoring--logging&#34;&gt;Monitoring &amp;amp; Logging
&lt;/h2&gt;&lt;p&gt;For the monitoring and logging, open source tools were used as they provide
excellent flexibility and of course value.&lt;/p&gt;
&lt;p&gt;For monitoring, &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was used with &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt;. &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was also
configured to make a future expansion to &lt;a class=&#34;link&#34; href=&#34;https://thanos.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thanos&lt;/a&gt; as easy as possible, should
the need ever arise.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/oss/loki/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Loki&lt;/a&gt; was used for logging, it integrated perfectly with the monitoring metrics
since it also uses &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt; as the main user interface.&lt;/p&gt;
&lt;p&gt;Alerts were configured with &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt; unified alerts, allowing alerts to be
raised from either metric or logging data.&lt;/p&gt;
&lt;h2 id=&#34;automated-management&#34;&gt;Automated Management
&lt;/h2&gt;&lt;p&gt;Tools such as &lt;a class=&#34;link&#34; href=&#34;https://cert-manager.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Certificate Manager&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS&lt;/a&gt; were used to allow
automation of day to day administrative tasks.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://cert-manager.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Certificate Manager&lt;/a&gt; automatically provisions and renews TLS certificates for
applications hosted within the platform whilst &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS&lt;/a&gt; creates and cleans
up DNS records.&lt;/p&gt;
&lt;h2 id=&#34;future-ready&#34;&gt;Future Ready
&lt;/h2&gt;&lt;p&gt;Whilst not immediately implemented due to possible conflicts with the business
the platform was developed and tested with IPv6 support and support for &lt;a class=&#34;link&#34; href=&#34;https://www.arm.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ARM&lt;/a&gt;
based compute allowing for easy adoption later on.&lt;/p&gt;
&lt;h1 id=&#34;serverless-integrations-development&#34;&gt;Serverless Integrations Development
&lt;/h1&gt;&lt;p&gt;Arden was implementing a new student record system called &lt;a class=&#34;link&#34; href=&#34;https://www.tribalgroup.com/solutions/student-information-systems/sits-vision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SITS&lt;/a&gt;. This was a
huge project that affected all areas of the business. A significant problem was
integrating existing systems that do not understand &lt;a class=&#34;link&#34; href=&#34;https://www.tribalgroup.com/solutions/student-information-systems/sits-vision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SITS&lt;/a&gt;, such as: the virtual
learning environment, Active Directory, time tabling products and many more.&lt;/p&gt;
&lt;p&gt;To enable this communication between systems, a group of serverless
&amp;lsquo;middlewares&amp;rsquo; were used to keep things scalable and event driven.&lt;/p&gt;
&lt;p&gt;Since the integrated systems spanned across &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Azure&lt;/a&gt; as well as
including software as a service (SaaS) solutions, many technologies were used to
integrate them. These technologies included: &lt;a class=&#34;link&#34; href=&#34;https://www.typescriptlang.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Typescript&lt;/a&gt; based &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/lambda/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Lambda&lt;/a&gt;
functions deployed with the Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/cdk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CDK&lt;/a&gt;, Azure &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/products/logic-apps&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Logic Apps&lt;/a&gt;, Azure &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/products/functions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Functions&lt;/a&gt;,
Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/sns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SNS&lt;/a&gt;, Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/sqs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQS&lt;/a&gt; and Azure &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/products/service-bus/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Service Bus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These integrations handled large amounts of traffic especially as &lt;a class=&#34;link&#34; href=&#34;https://www.tribalgroup.com/solutions/student-information-systems/sits-vision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SITS&lt;/a&gt; went
live at Arden. They also helped the business implement complex processes with
systems that cannot be directly integrated.&lt;/p&gt;
&lt;h1 id=&#34;open-source-contributions&#34;&gt;Open Source Contributions
&lt;/h1&gt;&lt;p&gt;The following open source contributions were made whilst delivering these
projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/prometheus/prometheus/pull/16088&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus: discovery: Allow EC2 Service Discovery to work with IPv6-only instances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/pull/5111&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS: feat(aws): always create AAAA alias records in route53&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/zorn96/ms_active_directory/pulls?q=is%3Apr&amp;#43;author%3Arlees85&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ms_active_directory: Multiple contributions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/navarasu/onedark.nvim/pull/234&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;onedark.nvim: Fix NvimTree Floating Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kdheepak/lazygit.nvim/pull/148&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;lazygit.nvim: feat: Allow current buffer commits to show on the already worked out Git root&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>Scalable Ways to Manage Terraform Remote State</title>
        <link>https://www.bitservices.io/blog/terraform-remote-state/</link>
        <pubDate>Sat, 31 Jul 2021 13:40:22 +0100</pubDate>
        
        <guid>https://www.bitservices.io/blog/terraform-remote-state/</guid>
        <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;There are many guides on the Internet for getting started with &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; and
even setting up remote state. There seems however to be very few (if any) that
suggest ways of setting it up in a scalable way. Normally, in such guides the
remote state is statically declared in the &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; code. This forbids the
code to be easily re-used for different environments without duplicating it all.&lt;/p&gt;
&lt;p&gt;The purpose of this post is to put forward some ways that I have used myself or
seen used over the past few years.&lt;/p&gt;
&lt;p&gt;This post will focus on the &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/s3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;S3&lt;/a&gt; remote backend, but the concepts will
apply to others as well, such as the &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Azure&lt;/a&gt; storage account (azurerm) backend.&lt;/p&gt;
&lt;h1 id=&#34;starting-point&#34;&gt;Starting Point
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Both &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; and the &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS&lt;/a&gt; CLI tool are installed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/s3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;S3&lt;/a&gt; bucket exists that can be used for &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; remote state.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The current &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS&lt;/a&gt; CLI tool profile has read and write access to the
&lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; remote state bucket.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is some &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; code that needs to be deployed to multiple
environments. In this example the following code is used as a starting point.
Everything is in a single file to make the example more simple and the remote
backend is statically defined, as per most examples on the Internet:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;s3.tf&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-terraform&#34; data-lang=&#34;terraform&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;required_version&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;gt;= 1.0.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s3&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;     = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object-store/terraform.state&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;bucket&lt;/span&gt;  = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;example-terraform-state-bitservices&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;region&lt;/span&gt;  = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eu-west-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;encrypt&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;aws&lt;/span&gt; = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;source&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hashicorp/aws&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;provider&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;region&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eu-west-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;     { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bitservices&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;environment&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;     }&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;encryption_key&amp;#34;&lt;/span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;null&lt;/span&gt;     }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;encryption_type&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AES256&amp;#34;&lt;/span&gt; }&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;acl&amp;#34;&lt;/span&gt;           { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;private&amp;#34;&lt;/span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;       { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object-store&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;force_destroy&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;          }&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;           = format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s-%s-%s&amp;#34;&lt;/span&gt;, var.&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;, var.&lt;span style=&#34;color:#a6e22e&#34;&gt;environment&lt;/span&gt;, var.&lt;span style=&#34;color:#a6e22e&#34;&gt;account&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_key&lt;/span&gt; = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt; =&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws:kms&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;resource&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws_s3_bucket&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;scope&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;acl&lt;/span&gt;           = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;acl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;bucket&lt;/span&gt;        = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;force_destroy&lt;/span&gt; = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;force_destroy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;tags&lt;/span&gt; = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;        = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Account&lt;/span&gt;     = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;account&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Service&lt;/span&gt;     = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Environment&lt;/span&gt; = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;dynamic&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;server_side_encryption_configuration&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;for_each&lt;/span&gt; = lower(var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; [] &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; tolist([var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;rule&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;apply_server_side_encryption_by_default&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;sse_algorithm&lt;/span&gt;     = &lt;span style=&#34;color:#a6e22e&#34;&gt;server_side_encryption_configuration&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;kms_master_key_id&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###############################################################################&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please note&lt;/strong&gt;: This example does not include state locking or the use of
&lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; modules to try and keep the post as on-topic and as short as
possible.&lt;/p&gt;
&lt;h1 id=&#34;option-1-workspaces&#34;&gt;Option 1: Workspaces
&lt;/h1&gt;&lt;p&gt;One of the simplest ways to make some &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; code re-usable across
different environments is to use &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/docs/language/state/workspaces.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform Workspaces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The easiest way to use workspaces in this way is to ensure each resource
identifier includes the workspace name. Settings, for example instance sizes or
if encryption is to be enabled or not can be defined in maps with the workspace
names as keys. This allows settings to be looked up based on the currently
enabled workspace.&lt;/p&gt;
&lt;p&gt;The example &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; code above modified to work with multiple workspaces
could look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-terraform&#34; data-lang=&#34;terraform&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;required_version&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;gt;= 1.0.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s3&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;                  = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object-store/terraform.state&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;bucket&lt;/span&gt;               = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;example-terraform-state-bitservices&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;region&lt;/span&gt;               = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eu-west-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;encrypt&lt;/span&gt;              = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;workspace_key_prefix&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object-store-env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;aws&lt;/span&gt; = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;source&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hashicorp/aws&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;provider&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;region&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eu-west-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bitservices&amp;#34;&lt;/span&gt; }&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;encryption_key&amp;#34;&lt;/span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;null&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;encryption_type&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;prod&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AES256&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;acl&amp;#34;&lt;/span&gt;           { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;private&amp;#34;&lt;/span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;       { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object-store&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;variable&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;force_destroy&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;          }&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;            = format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s-%s-%s&amp;#34;&lt;/span&gt;, var.&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;environment&lt;/span&gt;, var.&lt;span style=&#34;color:#a6e22e&#34;&gt;account&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;environment&lt;/span&gt;     = &lt;span style=&#34;color:#a6e22e&#34;&gt;terraform&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;workspace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_key&lt;/span&gt;  = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt; =&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws:kms&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt; = lookup(var.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;environment&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;resource&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aws_s3_bucket&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;scope&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;acl&lt;/span&gt;           = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;acl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;bucket&lt;/span&gt;        = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;force_destroy&lt;/span&gt; = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;force_destroy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;tags&lt;/span&gt; = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;        = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Account&lt;/span&gt;     = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;account&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Service&lt;/span&gt;     = var.&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Environment&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;dynamic&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;server_side_encryption_configuration&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;for_each&lt;/span&gt; = lower(&lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; [] &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; tolist([&lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_type&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;rule&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;apply_server_side_encryption_by_default&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;sse_algorithm&lt;/span&gt;     = &lt;span style=&#34;color:#a6e22e&#34;&gt;server_side_encryption_configuration&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;kms_master_key_id&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;encryption_key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###############################################################################&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Please note&lt;/strong&gt;: normally it is best to use encryption for all environments.
This was just changed for the purpose of being an example.&lt;/p&gt;
&lt;p&gt;Make sure &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; has been initialised:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ terraform init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;Initializing the backend...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;Successfully configured the backend &amp;#34;s3&amp;#34;! Terraform will automatically
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;use this backend unless the backend configuration changes.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;Initializing provider plugins...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Then, to create a new workspace for production, run:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ terraform workspace new prod
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Created and switched to workspace &amp;#34;prod&amp;#34;!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;You&amp;#39;re now on a new, empty workspace. Workspaces isolate their state,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;so if you run &amp;#34;terraform plan&amp;#34; Terraform will not see any existing state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;for this configuration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now when running a plan or apply, a new, unique &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/s3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;S3&lt;/a&gt; bucket will be managed.&lt;/p&gt;
&lt;p&gt;Using workspaces still uses a statically defined remote backend key. Each
non-default workspace state file will have an automatically appended prefix.&lt;/p&gt;
&lt;h1 id=&#34;option-2-simple-wrapper-script&#34;&gt;Option 2: Simple Wrapper Script
&lt;/h1&gt;&lt;p&gt;Another way of splitting out remote state can be to mirror the remote storage
backend with the local file system. This is more useful if there are lots of
different pieces of &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; within one repository but there are not multiple
environments for each individual piece.&lt;/p&gt;
&lt;p&gt;For this to work with our example we would have to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Turn our workspace into a Git repository, if it is not already one:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Move our &lt;code&gt;s3.tf&lt;/code&gt; file into its own folder. This is based on the original
&lt;code&gt;s3.tf&lt;/code&gt; file and NOT the one modified to work with workspaces:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mkdir s3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mv ./s3.tf ./s3/s3.tf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Remove the following line from the backend configuration in our &lt;code&gt;s3.tf&lt;/code&gt; file,
since we will be generating it with scripts:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-terraform&#34; data-lang=&#34;terraform&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;     = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object-store/terraform.state&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;common.sh&lt;/code&gt; file with the content below. This file should NOT be
executable as it will only ever be sourced:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;common.sh&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;BASH_SOURCE[0]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;0&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Please do not run this file directly!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TF_BASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;git rev-parse --show-toplevel&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -n &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_PREFIX&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_PREFIX&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_PREFIX&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    TF_PATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;pwd -P&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error: No Terraform folder specified or folder does not exist!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_PATH&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; !&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_BASE&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;* &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error: The folder given does not exist within the Git repository.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;S3_STATE_FILENAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;terraform.tfstate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;S3_STATE_KEY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;git rev-parse --show-prefix&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;S3_STATE_FILENAME&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TF_VAR_base&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_BASE&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TF_VAR_path&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_PATH&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terraform --version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:: Base  : &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_BASE&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:: Path  : &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TF_PATH&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:: S3 Key: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;S3_STATE_KEY&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;################################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terraform init --input&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;false --backend&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --backend-config&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;S3_STATE_KEY&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;################################################################################&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;plan.sh&lt;/code&gt; file with the below content. This file SHOULD be executable
as it will be directly called to do a &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; plan:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;plan.sh&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash -e
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -o pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TF_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;1&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;source &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./common.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terraform plan
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###############################################################################&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on &lt;code&gt;plan.sh&lt;/code&gt;, create &lt;code&gt;apply.sh&lt;/code&gt;, &lt;code&gt;destroy.sh&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From here the shell scripts are used to call &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; and set the remote
state key based on what local folder we are running &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; against.&lt;/p&gt;
&lt;p&gt;For example:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./apply.sh s3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Will create our S3 bucket and put the remote state in the following S3 key: &lt;code&gt;s3/terraform.tfstate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If we created another folder called &lt;code&gt;ec2&lt;/code&gt; that had code to create an EC2
instance and called it with the same scripts:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./apply.sh ec2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Will create the EC2 instance and put the remote state in the following S3 key: &lt;code&gt;ec2/terraform.tfstate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Whilst fairly simple this approach does have some drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Management of a small shell script for each &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; sub-command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Difficult to manage environments for the same pieces of &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; code
without complex use of symlinks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;option-3-full-wrapper-library&#34;&gt;Option 3: Full Wrapper Library
&lt;/h1&gt;&lt;p&gt;Ultimately this is where I have ended up and many organisations that use
&lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; extensively are also likely to end up. A &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; wrapper can be
created to not only organise the remote state storage, it could manage
&lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; binary versions, manage authentication with the cloud provider, do a
degree of configuration management, make calling from CI or locally the same and
any other organisation specific things.&lt;/p&gt;
&lt;p&gt;A wrapper can be created in any language, though it can be nice to have it
integrate with a build system like GNU Make or &lt;a class=&#34;link&#34; href=&#34;https://ruby.github.io/rake/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rake&lt;/a&gt; so calling &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; and
non-Terraform tasks feel the same.&lt;/p&gt;
&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; wrapper I use and maintain is located: &lt;a class=&#34;link&#34; href=&#34;https://rubygems.org/gems/terraform-wrapper&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://rubygems.org/gems/terraform-wrapper&lt;/a&gt;.
Sadly it is not yet documented at this stage.&lt;/p&gt;
&lt;p&gt;This wrapper integrates with the &lt;a class=&#34;link&#34; href=&#34;https://ruby.github.io/rake/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rake&lt;/a&gt; build system and provides &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt;
related tasks to multiple folders containing &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; infrastructure.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rake -T
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[I] [TerraformWrapper] Terraform Wrapper for Ruby - version: 1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[I] [TerraformWrapper] Building tasks for service: account, component: bootstrap...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[I] [TerraformWrapper] Building tasks for service: account, component: account...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:apply[config,plan]           # Applies infrastructure with Ter...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:binary                       # Downloads and extracts the expe...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:clean                        # Cleans a Terraform infrastructu...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:destroy[config]              # Destroys infrastructure with Te...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:import[config,address,id]    # Import a piece of existing infr...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:init[config]                 # Initialises the Terraform infra...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:plan[config,out]             # Creates a Terraform plan for a ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:plan-destroy[config,out]     # Creates a Terraform destroy pla...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:upgrade                      # Upgrades the Terraform infrastr...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake account:validate                     # Validates the Terraform code fo...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:apply[config,plan]         # Applies infrastructure with Ter...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:binary                     # Downloads and extracts the expe...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:clean                      # Cleans a Terraform infrastructu...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:destroy[config]            # Destroys infrastructure with Te...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:import[config,address,id]  # Import a piece of existing infr...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:init[config]               # Initialises the Terraform infra...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:plan[config,out]           # Creates a Terraform plan for a ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:plan-destroy[config,out]   # Creates a Terraform destroy pla...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:upgrade                    # Upgrades the Terraform infrastr...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake bootstrap:validate                   # Validates the Terraform code fo...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Another example of a &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; wrapper I have seen used and works well is
located: &lt;a class=&#34;link&#34; href=&#34;https://rubygems.org/gems/rake_terraform&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://rubygems.org/gems/rake_terraform&lt;/a&gt;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>Drivvn</title>
        <link>https://www.bitservices.io/projects/drivvn/</link>
        <pubDate>Thu, 02 Jul 2020 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/drivvn/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drivvn.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://www.bitservices.io/img/drivvn/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Drivvn&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A project to pick up support for and improve an existing &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; based
infrastructure platform hosted on &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Microsoft Azure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;#result&#34; &gt;Skip to Result&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;stabilising-platform&#34;&gt;Stabilising Platform
&lt;/h1&gt;&lt;p&gt;Initially, the primary focus had been to automate continual time consuming
tasks and to reduce the number of support tickets. This has been achieved by
implementing technologies such as &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://cert-manager.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Certificate Manager&lt;/a&gt;.
Reliability has been improved by consolidating and improving complex build
pipelines by utilising YAML libraries for &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/services/devops/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Azure DevOps&lt;/a&gt; and introducing
infrastructure as code with &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;evolving-platform&#34;&gt;Evolving Platform
&lt;/h1&gt;&lt;p&gt;After stabilising the platform focus shifted to evolving the platform to be
more performant, scalable and developer friendly. In addition to everything
outlined below, lots of work went into upgrades of &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; clusters and
services, improvements as and when they were identified and migrations to new
Azure subscriptions/tenants.&lt;/p&gt;
&lt;h2 id=&#34;developer-friendly&#34;&gt;Developer Friendly
&lt;/h2&gt;&lt;p&gt;To help improve continuous delivery, &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; was implemented. This allowed
developers to publish &lt;a class=&#34;link&#34; href=&#34;https://www.docker.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; images in their build pipelines which would then
automatically be picked up and deployed into a &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; environment.
&lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; also allowed the configuration for the application to be completely
separated from other infrastructure as code meaning developers could have full
control over the configuration of their deployed applications without
requiring permissions to alter other parts of infrastructure.&lt;/p&gt;
&lt;h2 id=&#34;infrastructure-as-code&#34;&gt;Infrastructure as Code
&lt;/h2&gt;&lt;p&gt;There was a large focus on infrastructure as code. &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; was used to
automate the creation of all base infrastructure: such as resource groups,
virtual networks, security groups and &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; clusters - including all
supporting infrastructure and Active Directory objects. This allowed much
quicker and reliable provision of core infrastructure.&lt;/p&gt;
&lt;p&gt;Any new services deployed were also fully automated so that required
databases, &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; permissions and the application themselves could also
be deployed in a reliable and repeatable way.&lt;/p&gt;
&lt;h2 id=&#34;monitoring--logging&#34;&gt;Monitoring &amp;amp; Logging
&lt;/h2&gt;&lt;p&gt;As the platform grew it became important to be able to monitor workloads.
Initially &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was used with &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt; as well as some other custom
exporters to get certain metrics that were otherwise unavailable.&lt;/p&gt;
&lt;p&gt;However as things grew &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was not scaling so eventually the
monitoring stack was upgraded with &lt;a class=&#34;link&#34; href=&#34;https://thanos.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thanos&lt;/a&gt;. This allowed gathering of huge
amounts of metrics from multiple &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; instances and storing the data
in cost efficient blob storage. &lt;a class=&#34;link&#34; href=&#34;https://thanos.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thanos&lt;/a&gt; also allowed a &amp;lsquo;single pane of glass&amp;rsquo;
view of the entire estate of multiple clusters through &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Centralised logging was also set up utilising &lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ElasticSearch&lt;/a&gt; at first and
later &lt;a class=&#34;link&#34; href=&#34;https://newrelic.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;New Relic&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;ingress&#34;&gt;Ingress
&lt;/h2&gt;&lt;p&gt;A lot of work was carried out around ingress to the platform. Initially
cluster ingresses were standardised with &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes/ingress-nginx/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ingress Nginx&lt;/a&gt;. Security and CDN
capability was then added using &lt;a class=&#34;link&#34; href=&#34;https://www.cloudflare.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cloudflare&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.cloudflare.com/en-gb/products/zero-trust/access/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cloudflare Access&lt;/a&gt;. This
allowed many apps to use single sign-on that originally did not support it.
It also enabled zero trust access to internal services without having to set
up and maintain a VPN.&lt;/p&gt;
&lt;h1 id=&#34;result&#34;&gt;Result
&lt;/h1&gt;&lt;p&gt;Due to multiple reasons - the good work that Drivvn do, the pandemic and just
the way things are going - significantly more people are now buying cars
online. Making the infrastructure more scalable and resilient has helped make
it possible to meet these suddenly increasing demands.&lt;/p&gt;
&lt;p&gt;Having the infrastructure as code ready allowed us to work with one of the
Drivvn development teams to deliver a new product from inception to launch
within a few weeks. The initial infrastructure was provisioned and available
within hours. We then worked with the team to refine the build pipelines and
infrastructure as they developed the product. Since launch, the infrastructure
supporting this product has been extremely reliable. Having &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; set up
allowed developers to manage their own configuration and &amp;lsquo;self-serve&amp;rsquo;
deployments all the way to production - with easy roll backs if required.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>Eclipse Group Solutions</title>
        <link>https://www.bitservices.io/projects/eclipse-group-solutions/</link>
        <pubDate>Mon, 06 Nov 2017 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/eclipse-group-solutions/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/eclipse-group-solutions-ltd./&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://www.bitservices.io/img/eclipse-group-solutions/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Eclipse Group Solutions&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A very exciting &amp;lsquo;greenfield&amp;rsquo; project creating a new infrastructure platform
using &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; for &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; based
e-commerce websites.&lt;/p&gt;
&lt;p&gt;It had been a great pleasure working with the team at &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/eclipse-group-solutions-ltd./&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Eclipse&lt;/a&gt; whilst
delivering this project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;#result&#34; &gt;Skip to Result&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;project-breifing&#34;&gt;Project Breifing
&lt;/h1&gt;&lt;p&gt;The project aim was to create an &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; based, fully automated
infrastructure platform to host &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; e-commerce websites. The
platform must be constructed in a way that it can be used on other cloud
service providers with little effort later on.&lt;/p&gt;
&lt;p&gt;Developers and testers needed the ability to get code and features through
testing pipelines much quicker. In addition, production websites need to handle
peak demand seamlessly.&lt;/p&gt;
&lt;p&gt;As well as delivering a platform, existing teams were to be assisted with
picking up new tools, technologies and concepts to enable on-going support
of the platform.&lt;/p&gt;
&lt;h1 id=&#34;solution&#34;&gt;Solution
&lt;/h1&gt;&lt;p&gt;The final solution comprised of many components. These components are outlined
below.&lt;/p&gt;
&lt;h2 id=&#34;infrastructure-as-code&#34;&gt;Infrastructure as Code
&lt;/h2&gt;&lt;p&gt;Writing infrastructure as code was key to this solution. This is what enabled
infrastructure to be provisioned in a reliable and repeatable way at the click
of a button. By taking advantage of &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; module sources it was possible
to define a collection of infrastructure objects (such as subnets, route
tables, gateways) in a single place but allow variables (such as name, CIDR
ranges) to be passed in depending on the environment being built. As a result
all infrastructure met defined standards, human error is vastly reduced and
development/production parity was achieved.&lt;/p&gt;
&lt;p&gt;By taking advantage of &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; availability zones and
infrastructure as code, all production environments were highly available and
could withstand the loss of an Amazon data centre without any downtime.&lt;/p&gt;
&lt;h2 id=&#34;immutable-software&#34;&gt;Immutable Software
&lt;/h2&gt;&lt;p&gt;To allow software (&lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; in particular) to run in a dynamically scaled
environment there were a few challenges to overcome. There needed to be a way
to start &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; very quickly in &amp;lsquo;scale-up&amp;rsquo; situations additionally the
state of any running &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; instances had to be externalised in case of
scale-down.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; was chosen to containerise software. Containerisation enabled the
application and all dependencies, configurations, etc to be packed into an
image that can be started very quickly. By using &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; &amp;lsquo;aspects&amp;rsquo; a
single &lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; image can be capable of running in multiple environments in
multiple modes. A single image can be promoted all the way through the testing
pipeline just by using tags.&lt;/p&gt;
&lt;p&gt;To make running containers stateless, services such as Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/s3/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;S3&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/efs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EFS&lt;/a&gt;
were used.&lt;/p&gt;
&lt;h2 id=&#34;service-orchestration&#34;&gt;Service Orchestration
&lt;/h2&gt;&lt;p&gt;To enable service-level auto scaling, auto healing, multi-tenant clustering and
service health checks, &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; was implemented. This allowed the platform
to meet the scaling requirements. The healing features of &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; allowed
the platform to be more resilient to virtual machine failure or network outages
resulting in a higher service availability.&lt;/p&gt;
&lt;h1 id=&#34;technologies--tools&#34;&gt;Technologies &amp;amp; Tools
&lt;/h1&gt;&lt;p&gt;Multiple technologies and tools were used to deliver this project.&lt;/p&gt;
&lt;h2 id=&#34;amazon-web-services&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;The initial cloud provider chosen was Amazon. Amazon Web Services (AWS) is a
mature cloud service with endless offerings. It is effortless to build
highly-available and highly-performant infrastructure stacks. Most tools (such
as &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes/kops&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kops&lt;/a&gt; below) offer excellent support for AWS. By using the
many AWS services available such as &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/iam/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IAM&lt;/a&gt; and availability zones it was
possible to create secure and resilient infrastructure.&lt;/p&gt;
&lt;h2 id=&#34;hashicorp-terraform&#34;&gt;Hashicorp &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Terraform was chosen to build foundation and networking infrastructure.
Terraform has excellent &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; support and code can easily be
ported to work with other cloud providers too - including OpenStack for
managing resources on-premises. Terraform made it very easy to meet the project
requirements to stay cloud agnostic and to fully automate infrastructure.&lt;/p&gt;
&lt;h2 id=&#34;docker&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Containerisation was chosen to help simplify development. Rather than pushing a
codebase that may have a complete different set of steps to deploy depending on
target environment, containerisation makes that a single image that may take
the target environment as a parameter. Additionally, all dependencies and
libraries required to run the application are packed into the container,
meaning that the same container can be ran locally, on tin or in the cloud with
minimal effort. Docker was chosen specifically due to it being well proven and
mature.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Kubernetes is fast becoming an industry standard for container orchestration.
It can also run on any cloud provider or even on-premises on tin. Native
support for service-level auto-scaling and &amp;lsquo;cluster autoscaler&amp;rsquo; add-on for the
scaling of underlying virtual machines allowed scaling requirements to be met.
The many different types of services (deployments, statefulsets, daemonsets),
specifications (disruption budgets, affinities) and probes (liveness,
readiness) made it possible to build a platform that is resilient against
hypervisor, network or even data centre failures.&lt;/p&gt;
&lt;h2 id=&#34;other-tools&#34;&gt;Other Tools
&lt;/h2&gt;&lt;p&gt;Other tools used to deliver this project include: &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes/kops&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kops&lt;/a&gt;, Hasicorp &lt;a class=&#34;link&#34; href=&#34;https://www.packer.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Packer&lt;/a&gt;
and &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;result&#34;&gt;Result
&lt;/h1&gt;&lt;p&gt;The result of this project allows &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/eclipse-group-solutions-ltd./&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Eclipse&lt;/a&gt; to offer their customers an
improved hosting service. Development environments can now be provisioned
rapidly and easily decommissioned when not in use to match project demands.
Automatic scaling allows customers websites to seamlessly handle high load
during sales and events whilst running economically during quiet periods. The
platform allows for zero-downtime code deployments and platform updates. High
availability is achieved by always running across multiple availability zones
(data centres) in addition to having automatic health checks and repairs.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>FoodFriends</title>
        <link>https://www.bitservices.io/projects/foodfriends/</link>
        <pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/foodfriends/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;https://www.bitservices.io/img/foodfriends/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FoodFriends&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;A small project carried out for a family member.&lt;/p&gt;
&lt;h1 id=&#34;the-problem&#34;&gt;The Problem
&lt;/h1&gt;&lt;p&gt;FoodFriends have a small &lt;a class=&#34;link&#34; href=&#34;https://wordpress.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wordpress&lt;/a&gt; website that was hosted with a traditional
hosting provider. The provider, unfortunately had crippling limits such as only
50MiB of disk for website media. FoodFriends required that website stayed on
the &lt;a class=&#34;link&#34; href=&#34;https://wordpress.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wordpress&lt;/a&gt; platform.&lt;/p&gt;
&lt;h1 id=&#34;the-solution&#34;&gt;The Solution
&lt;/h1&gt;&lt;p&gt;The website was moved to &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To remove future support costs and time, the supporting infrastructure was
automated with Hashicorp &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt;. The installation and configuration of
software fully automated with &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt; - even down to the renewal of the TLS
certificate!&lt;/p&gt;
&lt;p&gt;By using Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/s3/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;S3&lt;/a&gt; backups are automatically taken and rotated daily.
Restoration of data is managed by the &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt; playbooks meaning the entire
infrastructure can be built from nothing with all data restored in just
minutes.&lt;/p&gt;
&lt;h1 id=&#34;the-result&#34;&gt;The Result
&lt;/h1&gt;&lt;p&gt;There is now gigabytes of available diskspace for media. As
&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; is an enterprise grade platform capable of hosting even
the most busiest of e-commerce websites the performance of the FoodFriends
website has increased dramatically.&lt;/p&gt;
&lt;p&gt;Having TLS configured correctly and being made mandatory the FoodFriends
website has had its ranking increased on &lt;a class=&#34;link&#34; href=&#34;https://www.google.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The current cost of hosting the infrastructure is approximately $1 a month for
a couple of &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/route53/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Route53&lt;/a&gt; zones. Once the free-tier expires, the overall cost will
still be &lt;strong&gt;only a third&lt;/strong&gt; of what it was with the previous host.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        
    </channel>
</rss>
