<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Armory Docs – Guides for Installing Armory Continuous Deployment for Spinnaker</title><link>/continuous-deployment/installation/guide/</link><description>Recent content in Guides for Installing Armory Continuous Deployment for Spinnaker on Armory Docs</description><generator>Hugo -- gohugo.io</generator><atom:link href="/continuous-deployment/installation/guide/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous-Deployment: Install Armory Continuous Deployment for Spinnaker in Air-Gapped Environments</title><link>/continuous-deployment/installation/guide/air-gapped/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/continuous-deployment/installation/guide/air-gapped/</guid><description>
&lt;blockquote>
&lt;p>Armory Continuous Deployment (Armory CD) requires a license. For more information, contact &lt;a href="https://www.armory.io/contact-us/">Armory&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="overview-of-air-gapped-environments">Overview of air-gapped environments&lt;/h2>
&lt;p>An air-gapped deployment environment is one where any combination of the following conditions is true:&lt;/p>
&lt;ul>
&lt;li>Your deployment environment, such as a Kubernetes cluster, doesn&amp;rsquo;t have internet access AWS S3 bucket and &lt;code>docker.io&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>If your deployment environment is air-gapped, you need to host the Armory Continuous Deployment Bill of Materials (BOM) and Docker images in a location that your deployment environment can access. To set this up, you need public internet access so you can get the BOM and images, authority to create or access internal storage and image hosting, and permissions to move the Armory Continuous Deployment materials to your internal systems.&lt;/p>
&lt;p>The first step is to familiarize yourself with the Armory Continuous Deployment Bill of Materials.&lt;/p>
&lt;h2 id="before-you-begin">Before you begin&lt;/h2>
&lt;ul>
&lt;li>You have access to public AWS S3 buckets and docker.io.&lt;/li>
&lt;li>You have installed the &lt;a href="https://aws.amazon.com/cli/">AWS CLI&lt;/a>.&lt;/li>
&lt;/ul>
&lt;h2 id="inspect-the-armory-continuous-deployment-bill-of-materials">Inspect the Armory Continuous Deployment Bill of Materials&lt;/h2>
&lt;p>Armory Continuous Deployment&amp;rsquo;s Bill of Materials (BOM) is stored in the public S3 bucket &lt;code>halconfig&lt;/code>. You can see the contents of this bucket using the AWS CLI:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>aws s3 ls s3://halconfig
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>There are &lt;code>bom&lt;/code> and &lt;code>profiles&lt;/code> directories as well as four files: &lt;code>versions-edge.yml&lt;/code>, &lt;code>versions-ossedge.yml&lt;/code>, &lt;code>version-rc.yml&lt;/code>, and &lt;code>versions.yml&lt;/code>.&lt;/p>
&lt;p>You can view the content of &lt;code>s3://halconfig/versions.yml&lt;/code> by executing:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>aws s3 cp s3://halconfig/versions.yml -
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Output is similar to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">latestHalyard&lt;/span>: &lt;span style="color:#bd93f9">1.10.1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">latestSpinnaker&lt;/span>: &lt;span style="color:#bd93f9">2.25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">versions&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">alias&lt;/span>: Spinnaker Release 1.25.3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">changelog&lt;/span>: https://docs.armory.io/docs/release-notes/rn-armory-spinnaker/armoryspinnaker_v2-25-0/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">minimumHalyardVersion&lt;/span>: &lt;span style="color:#bd93f9">1.10.1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">lastUpdate&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;1616710502000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>bom&lt;/code> folder contains files for each release. To see the BOM for a specific release, you can run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span> aws s3 ls s3://halconfig/bom/&amp;lt;release-number&amp;gt;.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then you can inspect the file&amp;rsquo;s contents. For example, to see the BOM for release 2.25.0:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>aws s3 cp s3://halconfig/bom/2.25.0.yml -
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Output is similar to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">timestamp&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2021-03-25 09:28:32&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">clouddriver&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: de3aa3f0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">deck&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 516bcf0a
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">dinghy&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 522e67e5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">echo&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 3a098acc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">fiat&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: ca75f0d0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">front50&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 502b753e
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">gate&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;47352833&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">igor&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 252dbd5c
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">kayenta&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;72616529&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">monitoring-daemon&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">monitoring-third-party&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">orca&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 53f48823
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">rosco&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 272f4f82
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">terraformer&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">commit&lt;/span>: 5dcae243
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2.25.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">dependencies&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">redis&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">version&lt;/span>: &lt;span style="color:#bd93f9">2&lt;/span>:&lt;span style="color:#bd93f9">2.8.4-2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">artifactSources&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">dockerRegistry&lt;/span>: docker.io/armory
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="whats-next">What&amp;rsquo;s next&lt;/h2>
&lt;p>Follow the instructions for your deployment method: &lt;a href="/continuous-deployment/installation/guide/air-gapped/ag-operator/"}>Air-Gapped with the Armory Operator&lt;/a>.&lt;/p></description></item><item><title>Continuous-Deployment: Install Armory Continuous Deployment from the AWS Container Marketplace</title><link>/continuous-deployment/installation/guide/aws-container-marketplace/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/continuous-deployment/installation/guide/aws-container-marketplace/</guid><description>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>This document is intended for users who have purchased Armory&amp;rsquo;s AWS Container Marketplace offering. It will not work if you have not subscribed to the Armory Container Marketplace offering.&lt;/p>
&lt;p>Please contact &lt;a href="mailto:hello@armory.io">Armory&lt;/a> if you&amp;rsquo;re interested in an AWS Marketplace Private Offer.&lt;/p>
&lt;/div>
&lt;h2 id="overview-of-the-armory-operator">Overview of the Armory Operator&lt;/h2>
&lt;p>The Armory Operator is a Kubernetes Operator for Spinnaker&lt;sup>TM&lt;/sup> that makes it easier to install, deploy, and upgrade Spinnaker or Armory. The AWS Container Marketplace offering for Armory installs a version of the Armory Operator in an EKS cluster. After that, Armory can be installed in any namespace in your EKS cluster; this document assumes that Armory will be installed in the &lt;code>spinnaker&lt;/code> namespace.&lt;/p>
&lt;h2 id="aws-resources">AWS Resources&lt;/h2>
&lt;p>Before you install Armory on AWS, it is essential that you familiarize yourself with &lt;a href="/continuous-deployment/cloud-resources/resources-aws/">relevant AWS services&lt;/a>.&lt;/p>
&lt;h2 id="prerequisites-for-using-the-armory-operator">Prerequisites for using the Armory Operator&lt;/h2>
&lt;p>To use the Marketplace&amp;rsquo;s Armory offering, make sure you meet the following requirements:&lt;/p>
&lt;ul>
&lt;li>You have reviewed and met the Armory Continuous Deployment &lt;a href="/continuous-deployment/installation/system-requirements/">system requirements&lt;/a>.&lt;/li>
&lt;li>You have access to an EKS cluster configured with &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html">IAM roles for service accounts&lt;/a>.&lt;/li>
&lt;li>You have an ingress controller for your EKS cluster. This document assumes the EKS cluster is using the NGINX Ingress Controller.&lt;/li>
&lt;li>You have &lt;code>cluster-admin&lt;/code> access on the EKS cluster.&lt;/li>
&lt;li>You have An AWS S3 bucket to store Armory application and pipeline configuration.&lt;/li>
&lt;/ul>
&lt;h2 id="installation-summary">Installation summary&lt;/h2>
&lt;p>This document covers the following high-level steps:&lt;/p>
&lt;ol>
&lt;li>Creating and configuring the necessary AWS IAM roles for your Kubernetes cluster&lt;/li>
&lt;li>Installing the Armory Operator Custom Resource Definitions (CRDs) for Armory into your Kubernetes cluster&lt;/li>
&lt;li>Installing the Armory Operator&lt;/li>
&lt;li>Creating a SpinnakerService Custom Resource&lt;/li>
&lt;li>Exposing your Armory instance&lt;/li>
&lt;/ol>
&lt;h2 id="create-an-aws-bucket">Create an AWS bucket&lt;/h2>
&lt;p>If you do not already have an AWS S3 bucket, create one with these settings:&lt;/p>
&lt;ul>
&lt;li>Versioning turned on (&amp;ldquo;Keep all versions of an object in the same bucket&amp;rdquo;)&lt;/li>
&lt;li>Default encryption turned on&lt;/li>
&lt;li>All public access blocked&lt;/li>
&lt;/ul>
&lt;h2 id="create-and-configure-the-aws-iam-roles-for-your-kubernetes-cluster">Create and configure the AWS IAM roles for your Kubernetes cluster&lt;/h2>
&lt;p>AWS IAM permissions are granted to Armory through the use of AWS&amp;rsquo;s IAM roles for Kubernetes Service Accounts. This feature must be enabled at a cluster level. You need to create three IAM roles:&lt;/p>
&lt;ul>
&lt;li>An IAM role for the Armory Operator (&lt;code>spinnaker-operator&lt;/code> ServiceAccount in &lt;code>spinnaker-operator&lt;/code> namespace) that has these permissions:
&lt;ul>
&lt;li>&lt;code>aws-marketplace:RegisterUsage&lt;/code>&lt;/li>
&lt;li>&lt;code>s3:*&lt;/code> on your AWS Bucket&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>An IAM role for the Front50 service (&lt;code>front50&lt;/code> ServiceAccount in the &lt;code>spinnaker&lt;/code> namespace), that has these permissions:
&lt;ul>
&lt;li>&lt;code>s3:*&lt;/code> on your AWS Bucket&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>An IAM role for the Clouddriver service (&lt;code>clouddriver&lt;/code> ServiceAccount in the &lt;code>spinnaker&lt;/code> namespace). This IAM role does not require any explicit permissions. If you want Armory to deploy AWS resources (AWS EC2, AWS ECS, AWS Lambda, or other AWS EKS clusters), you can add these permissions later.
&lt;ul>
&lt;li>&lt;em>AWS permissions are &lt;strong>not&lt;/strong> needed to deploy to the EKS cluster where Spinnaker is installed.&lt;/em>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Upon completion of this section, you should have these three IAM roles:&lt;/p>
&lt;ul>
&lt;li>&lt;code>arn:aws:iam::AWS_ACCOUNT_ID:role/eks-spinnaker-operator&lt;/code> granted to the Kubernetes Service Account &lt;code>system:serviceaccount:spinnaker-operator:spinnaker-operator&lt;/code>&lt;/li>
&lt;li>&lt;code>arn:aws:iam::AWS_ACCOUNT_ID:role/eks-spinnaker-front50&lt;/code> granted to the Kubernetes Service Account &lt;code>system:serviceaccount:spinnaker:front50&lt;/code>&lt;/li>
&lt;li>&lt;code>arn:aws:iam::AWS_ACCOUNT_ID:role/eks-spinnaker-clouddriver&lt;/code> granted to the Kubernetes Service Account &lt;code>system:serviceaccount:spinnaker:clouddriver&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="iam-role-for-armory-operator-pod">IAM role for Armory Operator Pod&lt;/h3>
&lt;p>Create an IAM role for the Armory Operator pod (call it &lt;code>eks-spinnaker-operator&lt;/code>) and configure it for use by EC2. You will replace the trust relationship later.&lt;/p>
&lt;p>Grant the role the AWS managed policy &lt;code>AWSMarketplaceMeteringRegisterUsage&lt;/code>.&lt;/p>
&lt;p>Grant the role an inline policy granting permissions on your S3 bucket (replace &lt;code>BUCKET_NAME&lt;/code> with the name of your bucket):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;s3:*&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Resource&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::BUCKET_NAME&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::BUCKET_NAME/*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;s3:*&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Resource&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::my-spinnaker-bucket&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::my-spinnaker-bucket/*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create this trust relationship on the IAM role, with these fields replaced:&lt;/p>
&lt;ul>
&lt;li>replace &lt;code>AWS_ACCOUNT_ID&lt;/code> with your AWS account ID&lt;/li>
&lt;li>replace &lt;code>OIDC_PROVIDER&lt;/code> with the &amp;ldquo;OpenID Connect provider URL&amp;rdquo; for your Kubernetes cluster (&lt;em>with the &lt;code>https://&lt;/code> removed&lt;/em>)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Principal&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Federated&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:iam::AWS_ACCOUNT_ID:oidc-provider/OIDC_PROVIDER&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;sts:AssumeRoleWithWebIdentity&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Condition&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;StringEquals&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;OIDC_PROVIDER:sub&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;system:serviceaccount:spinnaker-operator:spinnaker-operator&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Principal&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Federated&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:iam::111222333444:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/AAAABBBBCCCCDDDDEEEEFFFF00001111&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;sts:AssumeRoleWithWebIdentity&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Condition&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;StringEquals&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;oidc.eks.us-east-1.amazonaws.com/id/AAAABBBBCCCCDDDDEEEEFFFF00001111:sub&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;system:serviceaccount:spinnaker-operator:spinnaker-operator&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="iam-role-for-front50-pod">IAM role for Front50 Pod&lt;/h3>
&lt;p>Create an IAM role for the Armory Operator pod (call it &lt;code>eks-spinnaker-front50&lt;/code>) and configure it for use by EC2. You will replace the trust relationship later.&lt;/p>
&lt;p>Grant the role an inline policy granting permissions on your S3 bucket (replace &lt;code>BUCKET_NAME&lt;/code> with the name of your bucket):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;s3:*&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Resource&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::BUCKET_NAME&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::BUCKET_NAME/*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;s3:*&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Resource&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::my-spinnaker-bucket&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::my-spinnaker-bucket/*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create this trust relationship on the IAM role, with these fields replaced:&lt;/p>
&lt;ul>
&lt;li>Replace &lt;code>AWS_ACCOUNT_ID&lt;/code> with your AWS account ID&lt;/li>
&lt;li>Replace &lt;code>OIDC_PROVIDER&lt;/code> with the &amp;ldquo;OpenID Connect provider URL&amp;rdquo; for your Kubernetes cluster (&lt;em>with the &lt;code>https://&lt;/code> removed&lt;/em>)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Principal&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Federated&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:iam::AWS_ACCOUNT_ID:oidc-provider/OIDC_PROVIDER&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;sts:AssumeRoleWithWebIdentity&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Condition&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;StringEquals&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;OIDC_PROVIDER:sub&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;system:serviceaccount:spinnaker:front50&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Principal&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Federated&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:iam::111222333444:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/AAAABBBBCCCCDDDDEEEEFFFF00001111&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;sts:AssumeRoleWithWebIdentity&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Condition&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;StringEquals&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;oidc.eks.us-east-1.amazonaws.com/id/AAAABBBBCCCCDDDDEEEEFFFF00001111:sub&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;system:serviceaccount:spinnaker:front50&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="iam-role-for-clouddriver-pod">IAM role for Clouddriver pod&lt;/h3>
&lt;p>Create an IAM role for the Armory Operator pod (call it &lt;code>eks-spinnaker-clouddriver&lt;/code>) and configure it for use by EC2. You will replace the trust relationship later. It does not need explicit AWS permissions.&lt;/p>
&lt;p>Create this trust relationship on the IAM role, with these fields replaced:&lt;/p>
&lt;ul>
&lt;li>Replace &lt;code>AWS_ACCOUNT_ID&lt;/code> with your AWS account ID&lt;/li>
&lt;li>Replace &lt;code>OIDC_PROVIDER&lt;/code> with the &amp;ldquo;OpenID Connect provider URL&amp;rdquo; for your Kubernetes cluster (&lt;em>with the &lt;code>https://&lt;/code> removed&lt;/em>)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Principal&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Federated&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:iam::AWS_ACCOUNT_ID:oidc-provider/OIDC_PROVIDER&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;sts:AssumeRoleWithWebIdentity&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Condition&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;StringEquals&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;OIDC_PROVIDER:sub&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;system:serviceaccount:spinnaker:clouddriver&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Principal&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Federated&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:iam::111222333444:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/AAAABBBBCCCCDDDDEEEEFFFF00001111&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;sts:AssumeRoleWithWebIdentity&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Condition&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;StringEquals&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;oidc.eks.us-east-1.amazonaws.com/id/AAAABBBBCCCCDDDDEEEEFFFF00001111:sub&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;system:serviceaccount:spinnaker:clouddriver&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-the-armory-operator-custom-resource-definitions-crds">Install the Armory Operator Custom Resource Definitions (CRDs)&lt;/h2>
&lt;p>Download the Kubernetes manifest for Armory Operator and install it into your Kubernetes cluster:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir -p spinnaker-operator &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">cd&lt;/span> spinnaker-operator
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bash -c &lt;span style="color:#f1fa8c">&amp;#39;curl -L https://github.com/armory/marketplace/releases/latest/download/marketplace.tgz | tar -xz&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Install or update CRDs cluster wide&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl apply -f manifests/crds/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-the-armory-operator">Install the Armory Operator&lt;/h2>
&lt;p>Update the manifest for the Armory Operator with your AWS Account ID:&lt;/p>
&lt;ul>
&lt;li>You must update &lt;code>AWS_ACCOUNT_ID&lt;/code> (in the ServiceAccount annotation) with your account ID, so the ServiceAccount can access your AWS IAM roles.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#bd93f9">111122223333&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i.bak &lt;span style="color:#f1fa8c">&amp;#34;s|AWS_ACCOUNT_ID|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> manifests/operator/ServiceAccount.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm manifests/operator/ServiceAccount.yaml.bak
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Install the armory operator&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl apply -f manifests/operator
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Deploying the Armory Operator may take a little bit of time. You can monitor its status by running this command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl -n spinnaker-operator get pod -owide
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You&amp;rsquo;re looking for the deployment to be completely up (READY of &lt;code>2/2&lt;/code> and STATUS of &lt;code>Running&lt;/code>).&lt;/p>
&lt;h3 id="creating-a-spinnakerservice-custom-resource">Creating a SpinnakerService Custom Resource&lt;/h3>
&lt;p>Update the manifest for the SpinnakerService object with these:&lt;/p>
&lt;ul>
&lt;li>&lt;code>AWS_ACCOUNT_ID&lt;/code> (in both ServiceAccount annotations) - your account ID, so the ServiceAccount can access your AWS IAM roles&lt;/li>
&lt;li>&lt;code>BUCKET_NAME&lt;/code> (in the SpinnakerService) - the name of your AWS S3 Bucket&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#bd93f9">111122223333&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">BUCKET_NAME&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>my-spinnaker-bucket
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i.bak &lt;span style="color:#f1fa8c">&amp;#34;s|AWS_ACCOUNT_ID|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> manifests/spinnaker/ServiceAccount-clouddriver.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i.bak &lt;span style="color:#f1fa8c">&amp;#34;s|AWS_ACCOUNT_ID|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> manifests/spinnaker/ServiceAccount-front50.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm manifests/spinnaker/ServiceAccount-clouddriver.yaml.bak
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm manifests/spinnaker/ServiceAccount-front50.yaml.bak
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i.bak &lt;span style="color:#f1fa8c">&amp;#34;s|BUCKET_NAME|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">BUCKET_NAME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> manifests/spinnaker/SpinnakerService.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm manifests/spinnaker/SpinnakerService.yaml.bak
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Install the operator&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl apply -f manifests/spinnaker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If everything is configured properly, the Armory Operator should see the SpinnakerService custom resource, and start creating Kubernetes Deployments, ServiceAccounts, and Secrets in the &lt;code>spinnaker&lt;/code> Namespace. You can monitor this with the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl -n spinnaker get all -owide
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="exposing-your-armory-instance">Exposing your Armory instance&lt;/h2>
&lt;p>Once your Armory instance is running, you need to configure it so that it is accessible. There are two main parts to this:&lt;/p>
&lt;ol>
&lt;li>Expose the &lt;code>spin-deck&lt;/code> and &lt;code>spin-gate&lt;/code> services so that they can be reached by your end users (and client services)&lt;/li>
&lt;li>Configure Armory so that it knows about the endpoints it is exposed on&lt;/li>
&lt;/ol>
&lt;p>Given a domain name (or IP address) (such as spinnaker.domain.com or 55.55.55.55), you should be able to:&lt;/p>
&lt;ul>
&lt;li>Reach the &lt;code>spin-deck&lt;/code> service at the root of the domain (&lt;code>http://spinnaker.domain.com&lt;/code> or &lt;code>http://55.55.55.55&lt;/code>)&lt;/li>
&lt;li>Reach the &lt;code>spin-gate&lt;/code> service at the root of the domain (&lt;code>http://spinnaker.domain.com/api/v1&lt;/code> or &lt;code>http://55.55.55.55/api/v1&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>You can use either &lt;code>http&lt;/code> or &lt;code>https&lt;/code>, as long as you use the same for both. Additionally, you have to configure Armory to be aware of its endpoints.&lt;/p>
&lt;p>This section assumes the following:&lt;/p>
&lt;ul>
&lt;li>You have installed the &lt;a href="https://kubernetes.github.io/ingress-nginx/deploy/#aws">NGINX Ingress Controller&lt;/a> in the EKS cluster&lt;/li>
&lt;li>You can set up a DNS CNAME Record pointing at the AWS Load Balancer in front of your NGINX Ingress Controller&lt;/li>
&lt;/ul>
&lt;h2 id="set-up-an-ingress-for-spin-deck-and-spin-gate">Set up an Ingress for &lt;code>spin-deck&lt;/code> and &lt;code>spin-gate&lt;/code>&lt;/h2>
&lt;p>First, determine a DNS name that you can use for Armory, and set up a CNAME pointing that DNS name at your AWS Load Balancer. For example:&lt;/p>
&lt;ul>
&lt;li>NGINX Ingress Controller has created an NLB at &lt;code>abcd1234abcd1234abcd1234abcd1234-1234567812345678.elb.us-east-1.amazonaws.com&lt;/code>&lt;/li>
&lt;li>Desired domain name for Armory is &lt;code>spinnaker.domain.com&lt;/code>&lt;/li>
&lt;li>Create a CNAME DNS Record pointing &lt;code>spinnaker.domain.com&lt;/code> at &lt;code>abcd1234abcd1234abcd1234abcd1234-1234567812345678.elb.us-east-1.amazonaws.com&lt;/code> (you may also use an ALIAS Record in Route 53)&lt;/li>
&lt;/ul>
&lt;p>Then, create a Kubernetes Ingress to expose &lt;code>spin-deck&lt;/code> and &lt;code>spin-gate&lt;/code>. Create a file called &lt;code>spin-ingress.yml&lt;/code> with the following content:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">apiVersion&lt;/span>: extensions/v1beta1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">kind&lt;/span>: Ingress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">name&lt;/span>: spin-ingress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">namespace&lt;/span>: spinnaker
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">labels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">app&lt;/span>: spin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">cluster&lt;/span>: spin-ingress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">annotations&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">kubernetes.io/ingress.class&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;nginx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">rules&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">host&lt;/span>: spinnaker.domain.com &lt;span style="color:#6272a4"># Make sure to update this field&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">http&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">paths&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ff79c6">backend&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">serviceName&lt;/span>: spin-deck
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">servicePort&lt;/span>: &lt;span style="color:#bd93f9">9000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">path&lt;/span>: /
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ff79c6">backend&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">serviceName&lt;/span>: spin-gate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">servicePort&lt;/span>: &lt;span style="color:#bd93f9">8084&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">path&lt;/span>: /api/v1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>&lt;strong>Make sure the host field is updated with the correct DNS record.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>Apply the ingress file you just created:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl -n spinnaker apply -f spin-ingress.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configure-armory-to-be-aware-of-its-endpoints">Configure Armory to be aware of its endpoints&lt;/h2>
&lt;p>Update the spec.spinnakerConfig.config.security section of &lt;code>manifests/spinnaker/SpinnakerService.yaml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">spinnakerConfig&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">config&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4"># ... more configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">security&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">uiSecurity&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">overrideBaseUrl&lt;/span>: http://spinnaker.domain.com &lt;span style="color:#6272a4"># Replace this with the IP address or DNS that points to our nginx ingress instance&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">apiSecurity&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">overrideBaseUrl&lt;/span>: http://spinnaker.domain.com/api/v1 &lt;span style="color:#6272a4"># Replace this with the IP address or DNS that points to our nginx ingress instance&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4"># ... more configuration&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>&lt;strong>Make sure to specify &lt;code>http&lt;/code> or &lt;code>https&lt;/code> according to your environment&lt;/strong>&lt;/em>&lt;/p>
&lt;p>Apply the changes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f manifests/spinnaker/SpinnakerService.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you encounter an error, delete and recreate the SpinnakerService.&lt;/p>
&lt;h2 id="configure-tls-certificates">Configure TLS certificates&lt;/h2>
&lt;p>Configuring TLS certificates for ingresses is environment-specific. In general, you want to do the following:&lt;/p>
&lt;ul>
&lt;li>Add certificate(s) so that our ingress controller can use them&lt;/li>
&lt;li>Configure the ingress(es) so that NGINX (or the load balancer in front of NGINX, or your alternative ingress controller) terminates TLS using the certificate(s)&lt;/li>
&lt;li>Update Spinnaker to be aware of the new TLS endpoints, by replacing &lt;code>http&lt;/code> by &lt;code>https&lt;/code> to override the base URLs in the previous section.&lt;/li>
&lt;/ul>
&lt;h2 id="next-steps">Next steps&lt;/h2>
&lt;p>Now that Armory is running, here are potential next steps:&lt;/p>
&lt;ul>
&lt;li>Configure certificates to secure our cluster (see &lt;a href="#configuring-tls-certificates">this section&lt;/a> for notes on this)&lt;/li>
&lt;li>Configure authentication/authorization (see the &lt;a href="https://www.spinnaker.io/setup/security/">Open Source Spinnaker documentation&lt;/a>)&lt;/li>
&lt;li>Add external Kubernetes accounts to deploy applications to (see &lt;a href="/continuous-deployment/armory-admin/kubernetes-account-add/">Creating and Adding a Kubernetes Account to Spinnaker (Deployment Target)&lt;/a>)&lt;/li>
&lt;li>Add AWS accounts to deploy applications to (see the &lt;a href="https://www.spinnaker.io/setup/install/providers/aws/">Open Source Spinnaker documentation&lt;/a>)&lt;/li>
&lt;/ul></description></item><item><title>Continuous-Deployment: Install Armory Continuous Deployment in Amazon Web Services (AWS)</title><link>/continuous-deployment/installation/guide/install-on-aws/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/continuous-deployment/installation/guide/install-on-aws/</guid><description>
&lt;blockquote>
&lt;p>Armory Continuous Deployment (Armory CD) requires a license. For more information, contact &lt;a href="https://www.armory.io/contact-us/">Armory&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="overview-of-installing-armory-in-aws">Overview of installing Armory in AWS&lt;/h2>
&lt;ul>
&lt;li>A running &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html">AWS EKS&lt;/a> cluster.&lt;/li>
&lt;li>An &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html">Amazon S3 (Simple Storage Service) bucket&lt;/a>. You can use an existing one or create a new one.&lt;/li>
&lt;li>An NGINX Ingress controller in your EKS cluster.&lt;/li>
&lt;/ul>
&lt;p>This document currently does not fully cover the following (see &lt;a href="#next-steps">Next Steps&lt;/a> for some links to achieve these)&lt;/p>
&lt;ul>
&lt;li>TLS Encryption&lt;/li>
&lt;li>Authentication/Authorization&lt;/li>
&lt;li>Add K8s accounts to deploy to&lt;/li>
&lt;li>Add cloud accounts to deploy to&lt;/li>
&lt;/ul>
&lt;h2 id="aws-resources">AWS Resources&lt;/h2>
&lt;p>Before you install Armory on AWS, it is essential that you familiarize yourself with &lt;a href="/continuous-deployment/cloud-resources/resources-aws/">relevant AWS services&lt;/a>.&lt;/p>
&lt;h2 id="before-you-begin">Before you begin&lt;/h2>
&lt;ul>
&lt;li>You have reviewed and met the Armory Continuous Deployment &lt;a href="/continuous-deployment/installation/system-requirements/">system requirements&lt;/a>.&lt;/li>
&lt;li>You have a running EKS and can access the Kubernetes API. Either your user/role created the EKS cluster or your user/role has been added to the &lt;code>aws-auth&lt;/code> configmap in the EKS cluster. See the &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html">AWS documentation&lt;/a> for more details.&lt;/li>
&lt;li>You have access to an S3 bucket or access to create an S3 bucket.&lt;/li>
&lt;li>You have access to an IAM role or user with access to the S3 bucket or can create an IAM role or user with access to the S3 bucket.&lt;/li>
&lt;/ul>
&lt;p>This document is written with the following workflow in mind:&lt;/p>
&lt;ul>
&lt;li>You have a machine (referred to as the &lt;code>workstation machine&lt;/code> in this document) configured to use the &lt;code>aws&lt;/code> CLI tool and a recent version of &lt;code>kubectl&lt;/code> tool&lt;/li>
&lt;li>You have a machine (referred to as the &lt;code>Halyard machine&lt;/code> in this document) with the Docker daemon installed, and can run Docker containers on it&lt;/li>
&lt;li>You can transfer files created on the &lt;code>workstation machine&lt;/code> to the &lt;code>Halyard machine&lt;/code> (to a directory mounted on a running Docker container)&lt;/li>
&lt;li>These two machines can be the same machine&lt;/li>
&lt;/ul>
&lt;p>Furthermore:&lt;/p>
&lt;p>On the &lt;code>Halyard machine&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Halyard (the tool used to install and manage Armory) is run in a Docker container on the &lt;code>Halyard machine&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The Halyard container on the &lt;code>Halyard machine&lt;/code> will be configured with the following volume mounts, which should be persisted or preserved to manage your Armory cluster&lt;/p>
&lt;ul>
&lt;li>&lt;code>.hal&lt;/code> directory (mounted to &lt;code>/home/spinnaker/.hal&lt;/code>) - stores all Halyard Armory configurations in a &lt;code>.hal/config&lt;/code> YAML file and assorted subdirectories&lt;/li>
&lt;li>&lt;code>.secret&lt;/code> directory (mounted to &lt;code>/home/spinnaker/.secret&lt;/code>) stores all external secret keys and files used by Halyard&lt;/li>
&lt;li>&lt;code>resources&lt;/code> directory (mounted to &lt;code>/home/spinnaker/resources&lt;/code>) stores all Kubernetes manifests and other resources that help create Kubernetes resources&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>You will create &lt;code>kubeconfig&lt;/code> files that will be added to the &lt;code>.secret&lt;/code> directory&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Note: If you are not using the Halyard Docker container, but sure to install &lt;code>kubectl&lt;/code> before you install Halyard. Otherwise you will have to restart the Halyard daemon in order for &lt;code>hal&lt;/code> to find &lt;code>kubectl&lt;/code> in your &lt;code>$PATH&lt;/code>. Execute &lt;code>hal shutdown&lt;/code> and then any &lt;code>hal&lt;/code> command to start the daemon.&lt;/p>
&lt;p>On the &lt;code>workstation machine&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>If using EKS, you can use the &lt;code>aws&lt;/code> CLI tool to interact with the AWS API and configure/communicate with the following:&lt;/p>
&lt;ul>
&lt;li>EKS clusters (or, alternately, have a EKS cluster already built)&lt;/li>
&lt;li>S3 buckets (or, alternately, have an S3 bucket already built)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>You have the &lt;code>kubectl&lt;/code> (Kubernetes CLI tool) installed and are able to use it to interact with your Kubernetes cluster&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You have a persistent working directory in which to work in. One option here is &lt;code>~/aws-spinnaker&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You will create AWS resources, such as service accounts, that will be permanently associated with your Armory cluster&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="installation-summary">Installation summary&lt;/h2>
&lt;p>In order to install Armory, this document covers the following:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Generating a &lt;code>kubeconfig&lt;/code> file, which is a Kubernetes credential file that Halyard and Armory will use to communicate with the Kubernetes cluster where Armory will be installed&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Creating an S3 bucket for Armory to store persistent configuration in&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Creating an IAM user that Armory will use to access the S3 bucket&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Running the Halyard daemon in a Docker container&lt;/p>
&lt;ul>
&lt;li>Persistent configuration directories from the workstation/host will be mounted into the container&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Running the &lt;code>hal&lt;/code> client interactively in the same Docker container, to:&lt;/p>
&lt;ul>
&lt;li>Build out the halconfig YAML file (&lt;code>.hal/config&lt;/code>)&lt;/li>
&lt;li>Configure Armory/Halyard to use &lt;code>kubeconfig&lt;/code> to install Armory&lt;/li>
&lt;li>Configure Armory with the IAM credentials and bucket information&lt;/li>
&lt;li>Turn on other recommended settings (artifacts and http artifact provider)&lt;/li>
&lt;li>Install Armory&lt;/li>
&lt;li>Expose Armory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="connect-to-the-kubernetes-cluster">Connect to the Kubernetes cluster&lt;/h2>
&lt;p>Armory needs a credential to talk to Kubernetes, so you must create a service account in your Kubernetes cluster.&lt;/p>
&lt;h3 id="connecting-to-an-eks-cluster">Connecting to an EKS cluster&lt;/h3>
&lt;p>If you&amp;rsquo;re using an EKS cluster, you must be able to connect to the EKS cluster. This assumes you have already configured the &lt;code>aws&lt;/code> CLI with credentials and a default region / availability zone (see installation directions &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html">here&lt;/a> and configuration directions &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html">here&lt;/a>)&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Create the local working directory on your workstation. For the purposes of this document, we will be using &lt;code>~/aws-spinnaker&lt;/code>, but this can be any persistent directory on any Linux or OSX machine.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir ~/aws-spinnaker
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">cd&lt;/span> ~/aws-spinnaker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>If you have access to the role that created the EKS cluster, you can create a kubeconfig with access to your Kubernetes cluster with this command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>aws eks update-kubeconfig --name &amp;lt;EKS_CLUSTER_NAME&amp;gt; --kubeconfig kubeconfig-aws
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>From here, you can validate access to the cluster with this command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl --kubeconfig kubeconfig-aws get namespaces
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="connecting-to-other-kubernetes-clusters">Connecting to other Kubernetes clusters&lt;/h3>
&lt;p>If you&amp;rsquo;ve stood up Kubernetes on AWS with KOPS or another Kubernetes tool, ensure that you can communicate with your Kubernetes cluster with kubectl.&lt;/p>
&lt;p>Then, copy your &lt;code>kubeconfig&lt;/code> file (this is typically located in &lt;code>~/.kube/config&lt;/code>) to your working directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cp ~/.kube/config ~/aws-spinnaker/kubeconfig-aws
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="create-a-kubeconfig-file-for-halyardarmory">Create a &lt;code>kubeconfig&lt;/code> file for Halyard/Armory&lt;/h2>
&lt;p>Armory will be installed in its own namespace in your EKS or AWS-hosted Kubernetes cluster. For the purposes of this document, we will be installing Armory in the &lt;code>spinnaker-system&lt;/code> namespace; you&amp;rsquo;re welcome to use a different namespace for this.&lt;/p>
&lt;p>We&amp;rsquo;re going to create the following:&lt;/p>
&lt;ul>
&lt;li>A namespace called &lt;code>spinnaker-system&lt;/code> to install Armory in&lt;/li>
&lt;li>A service account for that namespace&lt;/li>
&lt;li>A role and rolebinding in that namespace, granting permissions to the service account&lt;/li>
&lt;li>A kubeconfig containing credentials for the service account&lt;/li>
&lt;/ul>
&lt;p>This document uses the Armory &lt;code>spinnaker-tools&lt;/code> Go CLI (available on &lt;a href="https://github.com/armory/spinnaker-tools">Github&lt;/a>) to create many of these resources. There are separate instructions to perform these steps manually.&lt;/p>
&lt;p>Halyard uses this Kubeconfig file to create the Kubernetes deployment objects that create the microservices that compose Armory. This same Kubeconfig is passed to Armory so that Armory can see and manage its own resources.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Obtain the &lt;code>spinnaker-tools&lt;/code> CLI tool. Go to &lt;a href="https://github.com/armory/spinnaker-tools/releases">https://github.com/armory/spinnaker-tools/releases&lt;/a>, and download the latest release for your operating system (OSX and Linux available). You can also use curl:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># If you&amp;#39;re not already in the directory&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">cd&lt;/span> ~/aws-spinnaker
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># If you&amp;#39;re on Linux instead of OSX, use this URL instead:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># https://github.com/armory/spinnaker-tools/releases/download/0.0.6/spinnaker-tools-linux&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -L https://github.com/armory/spinnaker-tools/releases/download/0.0.6/spinnaker-tools-darwin -o spinnaker-tools
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod +x spinnaker-tools
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Run the tool. Feel free to substitute other values for the parameters:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># The &amp;#39;aws eks update-kubeconfig&amp;#39; command from above will create/update this file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SOURCE_KUBECONFIG&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>kubeconfig-aws
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Get the name of the context created by the aws tool)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">CONTEXT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#ff79c6">$(&lt;/span>kubectl --kubeconfig &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SOURCE_KUBECONFIG&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> config current-context&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">DEST_KUBECONFIG&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>kubeconfig-spinnaker-system-sa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPINNAKER_NAMESPACE&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPINNAKER_SERVICE_ACCOUNT_NAME&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker-service-account
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./spinnaker-tools create-service-account &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --kubeconfig &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SOURCE_KUBECONFIG&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --context &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">CONTEXT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --output &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">DEST_KUBECONFIG&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --namespace &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPINNAKER_NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --service-account-name &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPINNAKER_SERVICE_ACCOUNT_NAME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>You should be left with a file called &lt;code>kubeconfig-spinnaker-system-sa&lt;/code> (or something similar, if you&amp;rsquo;re using a different namespace for spinnaker)&lt;/p>
&lt;h2 id="create-the-s3-bucket-and-credentials">Create the S3 bucket and credentials&lt;/h2>
&lt;p>If you do not yet have an S3 bucket, create the S3 bucket:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Log into the AWS Console (web UI)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Navigate to the S3 Console (Click on &amp;ldquo;Services&amp;rdquo; at the top, and then on &amp;ldquo;S3&amp;rdquo; under &amp;ldquo;Storage&amp;rdquo;)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click on &amp;ldquo;Create Bucket&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Specify a globally unique name for this bucket, in your AWS region of choice, following your organization&amp;rsquo;s naming convention (if applicable). For this document, we will use, &lt;code>spinnaker-jq6cqvmpro&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click &amp;ldquo;Next&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Select the following two checkboxes:&lt;/p>
&lt;ul>
&lt;li>Keep all versions of an object in the same bucket&lt;/li>
&lt;li>Automatically encrypt objects when they are stored in S3&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Click &amp;ldquo;Next&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Do not add any additional permissions, unless specified by your organization. Click &amp;ldquo;Next&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click &amp;ldquo;Create bucket&amp;rdquo;&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Armory (the &lt;code>front50&lt;/code> service, specifically) will need access to your newly-created bucket. There are a number of ways to achieve this. This document describes two mechanisms to do this.&lt;/p>
&lt;p>By default, Armory will store all Armory information in a folder called &lt;code>front50&lt;/code> in your bucket. You can optionally specify a different directory (for example, if you&amp;rsquo;re using a pre-existing or shared S3 bucket).&lt;/p>
&lt;h3 id="create-an-iam-user-using-an-inline-policy">Create an IAM user using an inline policy&lt;/h3>
&lt;p>You can create an IAM user with credentials, and provide that to Armory via Halyard&lt;/p>
&lt;ol>
&lt;li>Log into the AWS Console (Web UI)&lt;/li>
&lt;li>Navigate to the IAM Console (Click on &amp;ldquo;Services&amp;rdquo; at the top, and then on &amp;ldquo;IAM&amp;rdquo; under &amp;ldquo;Security, Identity, &amp;amp; Compliance&amp;rdquo;)&lt;/li>
&lt;li>Click on &amp;ldquo;Users&amp;rdquo; on the left&lt;/li>
&lt;li>Click on &amp;ldquo;Add user&amp;rdquo;&lt;/li>
&lt;li>Give your user a distinct name, per your organization&amp;rsquo;s naming conventions. For this document, we will use &lt;code>s3-spinnaker-jq6cqvmpro&lt;/code>&lt;/li>
&lt;li>Click on &amp;ldquo;Programmatic access&amp;rdquo;&lt;/li>
&lt;li>We will not be adding a distinct policy to this user. Click on &amp;ldquo;Next: Tags&amp;rdquo;. &lt;em>You may receive a warning about how there are no policies attached to this user - this warning can be ignored.&lt;/em>&lt;/li>
&lt;li>Optionally, add tags, then click on &amp;ldquo;Next: Review&amp;rdquo;&lt;/li>
&lt;li>Click &amp;ldquo;Create user&amp;rdquo;&lt;/li>
&lt;li>Save the Access Key ID and Secret Access Key - these will be used later, during Halyard configuration&lt;/li>
&lt;li>Click &amp;ldquo;Close&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>Then, add an inline policy to your IAM user:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Click on your newly-created IAM user&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click on &amp;ldquo;Add inline policy&amp;rdquo; (on the right)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click on the &amp;ldquo;JSON&amp;rdquo; tab&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Add this text (replace &lt;code>s3-spinnaker-jq6cqvmpro&lt;/code> with the name of your bucket)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;s3:*&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Resource&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::spinnaker-jq6cqvmpro&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::spinnaker-jq6cqvmpro/*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Click on &amp;ldquo;Review Policy&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Give your inline policy some name. For example &lt;code>s3-spinnaker-jq6cqvmpro&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click &amp;ldquo;Create Policy&amp;rdquo;&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="create-an-iam-policy-attached-to-the-kubernetes-nodes-using-an-inline-policy">Create an IAM policy attached to the Kubernetes nodes using an inline policy&lt;/h2>
&lt;p>Alternately, you can attach an IAM policy to the role attached to your Kubernetes nodes.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Log into the AWS Console (Web UI)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Navigate to EC2 (Click on &amp;ldquo;Services&amp;rdquo; at the top, and then on &amp;ldquo;EC2&amp;rdquo; under &amp;ldquo;Compute&amp;rdquo;)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click on one of your Kubernetes nodes&lt;/p>
&lt;/li>
&lt;li>
&lt;p>In the bottom section, look for &amp;ldquo;IAM role&amp;rdquo; and click on the role&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click on &amp;ldquo;Add inline policy&amp;rdquo; (on the right)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click on the &amp;ldquo;JSON&amp;rdquo; tab&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Add this text (replace &lt;code>s3-spinnaker-jq6cqvmpro&lt;/code> with the name of your bucket)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f1fa8c">&amp;#34;s3:*&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">&amp;#34;Resource&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::spinnaker-jq6cqvmpro&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;arn:aws:s3:::spinnaker-jq6cqvmpro/*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Click on &amp;ldquo;Review Policy&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Give your inline policy some name. For example &lt;code>s3-spinnaker-jq6cqvmpro&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click &amp;ldquo;Create Policy&amp;rdquo;&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="stage-files-on-the-halyard-machine">Stage files on the Halyard machine&lt;/h2>
&lt;p>On the Halyard machine, choose a local working directory for Halyard. In it, we will create two folders:&lt;/p>
&lt;ul>
&lt;li>&lt;code>WORKING_DIRECTORY/.hal&lt;/code>&lt;/li>
&lt;li>&lt;code>WORKING_DIRECTORY/.secret&lt;/code>&lt;/li>
&lt;li>&lt;code>WORKING_DIRECTORY/resources&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Feel free to use some other directory for this; make sure it is a persistent directory.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Also, make sure this directory doesn&amp;#39;t live on an NFS mount, as that can cause issues&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>~/aws-spinnaker/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/.hal
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/.secret
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/resources
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should have one files:&lt;/p>
&lt;ul>
&lt;li>A kubeconfig file (&lt;code>kubeconfig-spinnaker-system-sa&lt;/code>) with the credentials for a service account in your EKS cluster&lt;/li>
&lt;/ul>
&lt;p>Copy it into &lt;code>.secret&lt;/code> so it is available to your Halyard docker container:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cp kubeconfig-spinnaker-system-sa &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/.secret
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="start-the-halyard-container">Start the Halyard container&lt;/h2>
&lt;p>On the &lt;code>Halyard machine&lt;/code>, start the Halyard container .&lt;/p>
&lt;p>&lt;em>If you want to install open source Spinnaker instead, use &lt;code>gcr.io/spinnaker-marketplace/halyard:stable&lt;/code> for the Docker Halyard image reference in substitution of &lt;code>armory/halyard-armory:&amp;lt;image_version&amp;gt;&lt;/code> in the commands below&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>Before you execute the command below, you need to set permissions on the host (local) directories mapped to the Docker container. These directories must allow for modification from within the container. The &lt;code>~/.hal&lt;/code> folder within
the &lt;em>host (local) system directory&lt;/em> needs write permissions (&lt;code>chmod 777 ~/.hal&lt;/code>), or you will encounter issues when attempting to execute a &lt;code>hal deploy apply&lt;/code> from within the container.&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run --name armory-halyard -it --rm &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/.hal:/home/spinnaker/.hal &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/.secret:/home/spinnaker/.secret &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">WORKING_DIRECTORY&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/resources:/home/spinnaker/resources &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> armory/halyard-armory:1.12.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The installer expects to find your kubeconfig named &lt;code>config&lt;/code> in
the &lt;code>.kube&lt;/code> directory you map below. If you&amp;rsquo;ve named your config something
else, you need to rename or symlink the file accordingly.&lt;/p>
&lt;h2 id="enter-the-halyard-container">Enter the Halyard container&lt;/h2>
&lt;p>From a separate terminal session on your &lt;code>docker machine&lt;/code>, create a second bash/shell session on the Docker container:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker &lt;span style="color:#8be9fd;font-style:italic">exec&lt;/span> -it armory-halyard bash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Also, once in the container, you can run these commands for a friendlier environment to:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># - prompt with information&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># - alias for ls&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># - cd to the home directory&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">PS1&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;\h:\w \u\$ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">alias&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">ll&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#f1fa8c">&amp;#39;ls -alh&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">cd&lt;/span> ~
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="add-the-kubeconfig-and-cloud-provider-to-armory-via-halyard">Add the kubeconfig and cloud provider to Armory (via Halyard)&lt;/h2>
&lt;p>From the &lt;code>docker exec&lt;/code> separate terminal session, add (re-export) the relevant environment variables&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">###### Use the same values as the start of the document&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Enter the namespace that you want to install Armory in. This should have been created in the previous step.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;spinnaker-system&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Enter the name you want Armory to use to identify the cloud provider account&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">ACCOUNT_NAME&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;spinnaker&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Update this with the full path to your kubeconfig inside the container)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">KUBECONFIG_FULL&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>/home/spinnaker/.secret/kubeconfig-spinnaker-system-sa
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Use the Halyard &lt;code>hal&lt;/code> command line tool to add a Kubernetes account using your minified kubeconfig&lt;/p>
&lt;p>Configure the kubeconfig:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Enable the Kubernetes cloud provider&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config provider kubernetes &lt;span style="color:#8be9fd;font-style:italic">enable&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note: If you get an &lt;code>AccessDenied&lt;/code> error, change permissions on the host machine&amp;rsquo;s &lt;code>.hal&lt;/code> folder to allow read/write access by the Halyard container. Example: &lt;code>chmod 777 ~/.hal&lt;/code>.&lt;/p>
&lt;p>Next, configure the account:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Add account&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config provider kubernetes account add &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">ACCOUNT_NAME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --provider-version v2 &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --kubeconfig-file &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">KUBECONFIG_FULL&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --only-spinnaker-managed &lt;span style="color:#8be9fd;font-style:italic">true&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --namespaces &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configure-armory-to-install-in-kubernetes">Configure Armory to install in Kubernetes&lt;/h2>
&lt;p>&lt;strong>Important: This will by default limit your Armory to deploying to the&lt;/strong> namespace specified. If you want to be able to deploy to other namespaces, &lt;strong>either add a second cloud provider target or remove the &lt;code>--namespaces&lt;/code> flag.&lt;/strong>&lt;/p>
&lt;p>Use the Halyard &lt;code>hal&lt;/code> command line tool to configure Halyard to install Armory in your Kubernetes cluster&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal config deploy edit &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --type distributed &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --account-name &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">ACCOUNT_NAME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --location &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="enable-artifacts">Enable Artifacts&lt;/h2>
&lt;p>Within Armory, &amp;lsquo;artifacts&amp;rsquo; are consumable references to items that live outside of Armory, such as a file in a git repository or a file in an S3 bucket. The Artifacts feature must be explicitly turned on.&lt;/p>
&lt;p>Enable the &amp;ldquo;Artifacts&amp;rdquo; feature and the &amp;ldquo;http&amp;rdquo; artifact provider:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Enable artifacts&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config features edit --artifacts &lt;span style="color:#8be9fd;font-style:italic">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config artifact http &lt;span style="color:#8be9fd;font-style:italic">enable&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>(In order to add specific types of artifacts, there are further configuration items that must be completed. For now, it is sufficient to just turn on the artifacts feature with the http artifact provider. This will allow Armory to retrieve files via unauthenticated http.)&lt;/p>
&lt;h2 id="configure-armory-to-use-your-s3-bucket">Configure Armory to use your S3 bucket&lt;/h2>
&lt;p>Use the Halyard &lt;code>hal&lt;/code> command line tool to configure Halyard to configure Armory to use your S3 bucket&lt;/p>
&lt;h3 id="if-you-are-using-an-iam-user">If you are using an IAM user&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Update these with the information from the bucket that you created&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">BUCKET_NAME&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker-jq6cqvmpro
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">REGION&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>us-west-2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">ACCESS_KEY_ID&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&amp;lt;access-key&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># This will prompt for the secret key&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config storage s3 edit &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --bucket &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">BUCKET_NAME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --access-key-id &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">ACCESS_KEY_ID&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --secret-access-key &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --region &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">REGION&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config storage edit --type s3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="if-you-are-using-the-iam-instance-roles">If you are using the IAM instance roles&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Update these with the information from the bucket that you created&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">BUCKET_NAME&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker-jq6cqvmpro
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">REGION&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>us-west-2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># This will prompt for the secret key&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config storage s3 edit &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --bucket &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">BUCKET_NAME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --region &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">REGION&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> --no-validate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config storage edit --type s3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="if-you-want-to-use-a-specific-folder-in-the-bucket">If you want to use a specific folder in the bucket&lt;/h3>
&lt;p>By default, Halyard will configure Armory to use the folder &lt;code>front50&lt;/code> in your S3 bucket. You can configure it to use a different folder with this command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">ROOT_FOLDER&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>not_front50
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config storage s3 edit --root-folder &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">ROOT_FOLDER&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="choose-the-armory-version">Choose the Armory version&lt;/h2>
&lt;p>Before Halyard will install Armory, you should specify the version of Armory you want to use.&lt;/p>
&lt;p>You can get a list of available versions of spinnaker with this command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal version list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>If you are installing Armory, you will get a version that starts with &lt;code>2.x.x&lt;/code>&lt;/em>&lt;/p>
&lt;p>&lt;em>If you are installing open source Spinnaker and using &lt;code>gcr.io/spinnaker-marketplace/halyard:stable&lt;/code>, you will get a version that starts with &lt;code>1.x.x&lt;/code>&lt;/em>&lt;/p>
&lt;p>And then you can select the version with this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Replace with version of choice:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">export&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">VERSION&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#ff79c6">$(&lt;/span>hal version latest -q&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config version edit --version &lt;span style="color:#8be9fd;font-style:italic">$VERSION&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-armory">Install Armory&lt;/h2>
&lt;p>Now that your Halconfig is completely configured for the initial Armory deployment, you can tell Halyard to actually install Armory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal deploy apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once this is complete, congratulations! Armory Continuous Deployment is installed. Now, we have to access and expose it.&lt;/p>
&lt;h2 id="connect-to-armory-continuous-deployment-using-kubectl-port-forward">Connect to Armory Continuous Deployment using &lt;code>kubectl port-forward&lt;/code>&lt;/h2>
&lt;p>If you have kubectl on a local machine with access to your Kubernetes cluster, you can test connecting to it with the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">DECK_POD&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#ff79c6">$(&lt;/span>kubectl -n &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> get pod -l &lt;span style="color:#8be9fd;font-style:italic">cluster&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spin-deck -ojsonpath&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#f1fa8c">&amp;#39;{.items[0].metadata.name}&amp;#39;&lt;/span>&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">GATE_POD&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#ff79c6">$(&lt;/span>kubectl -n &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> get pod -l &lt;span style="color:#8be9fd;font-style:italic">cluster&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spin-gate -ojsonpath&lt;span style="color:#ff79c6">=&lt;/span>&lt;span style="color:#f1fa8c">&amp;#39;{.items[0].metadata.name}&amp;#39;&lt;/span>&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl -n &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> port-forward &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">DECK_POD&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#bd93f9">9000&lt;/span> &amp;amp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl -n &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> port-forward &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">GATE_POD&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span> &lt;span style="color:#bd93f9">8084&lt;/span> &amp;amp;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then, you can access Armory at &lt;a href="http://localhost:9000">http://localhost:9000&lt;/a>&lt;/p>
&lt;p>(If you are doing this on a remote machine, this will not work because your browser attempts to access localhost on your local workstation rather than on the remote machine where the port is forwarded)&lt;/p>
&lt;p>&lt;strong>Note:&lt;/strong> Even if the &lt;code>hal deploy apply&lt;/code> command returns successfully, the
installation may not be complete yet. This is especially the case with
distributed Kubernetes installs. If you see errors such as &lt;code>Connection refused&lt;/code>,
the containers may not be available yet. You can either wait
or check the status of all of the containers using the command for your cloud provider
(such as &lt;code>kubectl get pods --namespace spinnaker&lt;/code>).&lt;/p>
&lt;h2 id="install-the-nginx-ingress-controller">Install the NGINX ingress controller&lt;/h2>
&lt;p>In order to expose Armory to end users, you have perform the following actions:&lt;/p>
&lt;ul>
&lt;li>Expose the spin-deck (UI) Kubernetes service on some URL endpoint&lt;/li>
&lt;li>Expose the spin-gate (API) Kubernetes service on some URL endpoint&lt;/li>
&lt;li>Update Armory (via Halyard) to be aware of the new endpoints&lt;/li>
&lt;/ul>
&lt;p>We&amp;rsquo;re going to install the NGINX ingress controller on AWS (this uses the Layer 4 ELB, as indicated in the NGINX ingress controller &lt;a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md#aws">documentation&lt;/a> - you can use other NGINX ingress controller configurations such as the Layer 7 load balancer per your organization&amp;rsquo;s ingress policy.)&lt;/p>
&lt;p>(Both of these are configurable with Armory, but the NGINX ingress controller is also generally much more configurable)&lt;/p>
&lt;p>From the &lt;code>workstation machine&lt;/code> (where &lt;code>kubectl&lt;/code> is installed):&lt;/p>
&lt;p>Install the NGINX ingress controller components:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl --kubeconfig kubeconfig-aws apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/aws/deploy.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install the NGINX ingress controller AWS-specific service:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl --kubeconfig kubeconfig-aws apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/aws/service-l4.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl --kubeconfig kubeconfig-aws apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/aws/patch-configmap-l4.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="set-up-the-ingress-for-spin-deck-and-spin-gate">Set up the Ingress for &lt;code>spin-deck&lt;/code> and &lt;code>spin-gate&lt;/code>&lt;/h2>
&lt;p>Identify the URLs you will use to expose Armory&amp;rsquo;s UI and API.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># Replace with actual values&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_ENDPOINT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_ENDPOINT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>api.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker-system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create a Kubernetes Ingress manifest to expose spin-deck and spin-gate (change your hosts and namespace accordingly):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tee spin-ingress.yaml &lt;span style="color:#f1fa8c">&amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">apiVersion: extensions/v1beta1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">kind: Ingress
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">metadata:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> name: spinnaker-nginx-ingress
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> namespace: NAMESPACE
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> labels:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> app: spin
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> cluster: spin-ingress
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> annotations:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> kubernetes.io/ingress.class: &amp;#34;nginx&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> rules:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> - host: SPIN_DECK_ENDPOINT
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> http:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> paths:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> - backend:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> serviceName: spin-deck
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> servicePort: 9000
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> path: /
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> - host: SPIN_GATE_ENDPOINT
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> http:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> paths:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> - backend:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> serviceName: spin-gate
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> servicePort: 8084
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c"> path: /
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i.bak &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -e &lt;span style="color:#f1fa8c">&amp;#34;s|NAMESPACE|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">NAMESPACE&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -e &lt;span style="color:#f1fa8c">&amp;#34;s|SPIN_DECK_ENDPOINT|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_ENDPOINT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -e &lt;span style="color:#f1fa8c">&amp;#34;s|SPIN_GATE_ENDPOINT|&lt;/span>&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_ENDPOINT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>&lt;span style="color:#f1fa8c">|g&amp;#34;&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> spin-ingress.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create the Ingress&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f spin-ingress.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configure-armory-to-be-aware-of-its-endpoints">Configure Armory to be aware of its endpoints&lt;/h2>
&lt;p>Armory must be aware of its endpoints to work properly.&lt;/p>
&lt;p>This should be done from the halyard container:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_ENDPOINT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_ENDPOINT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>api.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_URL&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>http://&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_ENDPOINT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_URL&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>http://&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_ENDPOINT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config security ui edit --override-base-url &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_URL&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config security api edit --override-base-url &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_URL&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal deploy apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="set-up-dns">Set up DNS&lt;/h2>
&lt;p>Once the ingress is up (this may take some time), you can get the IP address for the ingress:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ kubectl describe -n spinnaker-system ingress spinnaker-nginx-ingress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Name: spinnaker-nginx-ingress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Namespace: spinnaker-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Address: 35.233.216.189
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Default backend: default-http-backend:80 &lt;span style="color:#ff79c6">(&lt;/span>10.36.2.7:8080&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rules:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Host Path Backends
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ---- ---- --------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> spinnaker.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> / spin-deck:9000 &lt;span style="color:#ff79c6">(&lt;/span>&amp;lt;none&amp;gt;&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> api.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> / spin-gate:8084 &lt;span style="color:#ff79c6">(&lt;/span>&amp;lt;none&amp;gt;&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Annotations:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> kubectl.kubernetes.io/last-applied-configuration: &lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;apiVersion&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;extensions/v1beta1&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;kind&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;Ingress&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;metadata&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;annotations&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;kubernetes.io/ingress.class&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;nginx&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">}&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;spinnaker-nginx-ingress&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;namespace&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;spinnaker&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">}&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;spec&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;rules&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">[{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;host&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;spinnaker.some-url.com&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;http&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;paths&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">[{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;backend&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;serviceName&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;spin-deck&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;servicePort&amp;#34;&lt;/span>:9000&lt;span style="color:#ff79c6">}&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;path&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;/&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">}]}}&lt;/span>,&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;host&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;api.some-url.com&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;http&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;paths&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">[{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;backend&amp;#34;&lt;/span>:&lt;span style="color:#ff79c6">{&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;serviceName&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;spin-gate&amp;#34;&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;servicePort&amp;#34;&lt;/span>:8084&lt;span style="color:#ff79c6">}&lt;/span>,&lt;span style="color:#f1fa8c">&amp;#34;path&amp;#34;&lt;/span>:&lt;span style="color:#f1fa8c">&amp;#34;/&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">}]}}]}}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> kubernetes.io/ingress.class: nginx
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Events:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Type Reason Age From Message
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ---- ------ ---- ---- -------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Normal CREATE 28s nginx-ingress-controller Ingress spinnaker/spinnaker-nginx-ingress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Normal UPDATE 20s nginx-ingress-controller Ingress spinnaker/spinnaker-nginx-ingress
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Set up DNS so that your two URLs point to the IP address for the ingress (in the above, configure &lt;code>spinnaker.some-url.com&lt;/code> and &lt;code>api.some-url.com&lt;/code> to point to &lt;code>35.233.216.189&lt;/code>). This can be done via whatever your organization uses for DNS.&lt;/p>
&lt;h2 id="configuring-tls-certificates">Configuring TLS certificates&lt;/h2>
&lt;p>Configuration of TLS certificates for ingresses is often very organization-specific. In general, you would want to do the following:&lt;/p>
&lt;ul>
&lt;li>Add certificate(s) so that your ingress controller can use them&lt;/li>
&lt;li>Configure the ingress(es) so that NGINX (or your ingress) terminates TLS using the certificate(s)&lt;/li>
&lt;li>Update Armory to be aware of the new TLS endpoints (note &lt;code>https&lt;/code> instead of &lt;code>http&lt;/code>)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_ENDPOINT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>spinnaker.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_ENDPOINT&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>api.some-url.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_URL&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>https://&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_ENDPOINT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_URL&lt;/span>&lt;span style="color:#ff79c6">=&lt;/span>https://&lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_ENDPOINT&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config security ui edit --override-base-url &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_DECK_URL&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal config security api edit --override-base-url &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">SPIN_GATE_URL&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hal deploy apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="next-steps">Next steps&lt;/h2>
&lt;p>Now that you have Armory up and running, here are some of the next things you may want to do:&lt;/p>
&lt;ul>
&lt;li>Configuration of certificates to secure your cluster (see &lt;a href="#configuring-tls-certificates">this section&lt;/a> for notes on this)&lt;/li>
&lt;li>Configuration of Authentication/Authorization (see the &lt;a href="https://www.spinnaker.io/setup/security/">Open Source Spinnaker documentation&lt;/a>)&lt;/li>
&lt;li>Add Kubernetes accounts to deploy applications to (see &lt;a href="/continuous-deployment/armory-admin/kubernetes-account-add/">Creating and Adding a Kubernetes Account to Armory as a Deployment Target&lt;/a>)&lt;/li>
&lt;li>Add GCP accounts to deploy applications to (see the &lt;a href="https://www.spinnaker.io/setup/install/providers/gce/">Open Source Spinnaker documentation&lt;/a>)&lt;/li>
&lt;li>Add AWS accounts to deploy applications to (see the &lt;a href="https://www.spinnaker.io/setup/install/providers/aws/">Open Source Spinnaker documentation&lt;/a>)&lt;/li>
&lt;/ul></description></item><item><title>Continuous-Deployment: Upgrade Spinnaker to Armory Continuous Deployment</title><link>/continuous-deployment/installation/guide/upgrade-oss-to-armory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/continuous-deployment/installation/guide/upgrade-oss-to-armory/</guid><description>
&lt;blockquote>
&lt;p>Armory Continuous Deployment (Armory CD) requires a license. For more information, contact &lt;a href="https://www.armory.io/contact-us/">Armory&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="overview-of-upgrading-spinnaker-to-armory-continuous-deployment">Overview of upgrading Spinnaker to Armory Continuous Deployment&lt;/h2>
&lt;p>Armory Continuous Deployment for Spinnaker is installed with Armory-extended Halyard, very similarly to the way Open Source Spinnaker&lt;sup>TM&lt;/sup> is installed with Open Source Halyard. These are the key differences:&lt;/p>
&lt;ul>
&lt;li>Armory-extended Halyard installs Armory&amp;rsquo;s enterprise distribution of Spinnaker; Open Source Halyard installs Open Source Spinnaker.&lt;/li>
&lt;li>Armory versions are one major version ahead of Open Source. For example, Armory 2.18.x maps to Open Source Spinnaker 1.18.x.&lt;/li>
&lt;li>Armory has an extra subcommand block &lt;code>hal armory&lt;/code> (mapping to an &lt;code>armory&lt;/code> block in your &lt;code>.hal/config&lt;/code>), which controls Armory-specific features.&lt;/li>
&lt;/ul>
&lt;p>This guide differentiates between the two by referring to them as Armory and open source Spinnaker, respectively.&lt;/p>
&lt;p>If you are currently on open source Spinnaker and interested in upgrading to Armory, you can easily upgrade if you used Halyard to install your Spinnaker cluster.&lt;/p>
&lt;p>This guide assumes the following:&lt;/p>
&lt;ul>
&lt;li>Spinnaker is currently running in Kubernetes&lt;/li>
&lt;li>Spinnaker is configured with some form of persistent storage (Minio, S3, GCS, or AZS)&lt;/li>
&lt;li>Spinnaker was installed with Halyard in one of these forms:
&lt;ul>
&lt;li>Halyard is running locally on a workstation&lt;/li>
&lt;li>Halyard is running in a Docker container in Docker daemon (in Linux, Windows, or OSX)&lt;/li>
&lt;li>Halyard is running in a Kubernetes pod&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Depending on where Halyard is currently running, the detailed installation instructions will be slightly different, but the high level process is the same:&lt;/p>
&lt;ol>
&lt;li>Start Armory-extended Halyard in a Docker container with your open source Halyard configuration directories available to Armory Halyard.&lt;/li>
&lt;li>Enter the Armory-extended Halyard container.&lt;/li>
&lt;li>Update the Spinnaker version to use an Armory version. Recall that Armory versions are ahead of open source Spinnaker by one major version.&lt;/li>
&lt;li>Apply your changes.&lt;/li>
&lt;/ol>
&lt;h2 id="halyard-running-locally-on-a-workstation">Halyard running locally on a workstation&lt;/h2>
&lt;p>If Halyard is running locally on your workstation, then perform the following steps:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Make copies of any directores used by Halyard. These include&lt;code>~.hal&lt;/code> and &lt;code>~.kube&lt;/code> and potentially &lt;code>~/.aws&lt;/code>, &lt;code>~/.config/gcloud&lt;/code>, &lt;code>~/.azure&lt;/code>). &lt;em>You can mount these directly into Halyard, but it may be safer to operate on copies.&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir -p ~/armory/.config
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp -rpv ~/.hal ~/armory/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp -rpv ~/.aws ~/armory/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp -rpv ~/.kube ~/armory/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp -rpv ~/.azure ~/armory/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp -rpv ~/.config/gcloud ~/armory/.config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Omit any directories that do not apply to you. For example, if you do not use Azure, omit it.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Start Halyard as a Docker container in daemon mode, with your directories mounted in (add/remove volume mounts as applicable):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run --name armory-halyard --rm &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.hal:/home/spinnaker/.hal &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.kube:/home/spinnaker/.kube &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.aws:/home/spinnaker/.aws &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.azure:/home/spinnaker/.azure &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.config:/home/spinnaker/.config &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -d &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -u &lt;span style="color:#ff79c6">$(&lt;/span>id -u&lt;span style="color:#ff79c6">)&lt;/span> &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> index.docker.io/armory/halyard-armory:1.12.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Omit any directories that do not apply to you. For example, if you do not use Azure, omit it.&lt;/p>
&lt;p>&lt;em>The above specifies that Halyard will run as your local user id. Depending on how your Halyard daemon was initially run and what user id owns the various Halyard directories, you may need to specify some other user. For example, if user &lt;code>1000&lt;/code> owns the .hal directory, replace &amp;ldquo;&lt;code>-u $(id -u)&lt;/code>&amp;rdquo; with &amp;ldquo;&lt;code>-u 1000&lt;/code>&amp;rdquo;&lt;/em>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Exec into the Halyard container&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker &lt;span style="color:#8be9fd;font-style:italic">exec&lt;/span> -it armory-halyard bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update the version of Spinnaker&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal config version edit --version &lt;span style="color:#ff79c6">$(&lt;/span>hal version latest -q&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will use the latest stable version; If you want to use a different version, use &lt;code>hal version list&lt;/code> to get a list of available versions. Then, run &lt;code>hal config version edit --version X.X.X&lt;/code> to specify a version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Apply your changes&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal deploy apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="halyard-running-in-a-docker-container-in-docker-daemon">Halyard running in a Docker container in Docker daemon&lt;/h2>
&lt;p>If Halyard is already running in a Docker container in your Docker daemon, you can do an in-place upgrade.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>First, do a backup of your existing Halyard configuration. Exec into the Docker container, then run &lt;code>hal backup create&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Stop the Halyard docker container, and re-start it with the Armory-extended Halyard image (&lt;code>index.docker.io/armory/halyard-armory:1.12.1&lt;/code>) instead of the open source Halyard image (&lt;code>gcr.io/spinnaker-marketplace/halyard:stable&lt;/code>). Also, change the user id for Armory-extended Halyard to be &lt;code>1000&lt;/code>. For example, if you run the previous Docker image (open source Halyard) like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run --name halyard --rm &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.hal:/home/spinnaker/.hal &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.kube:/home/spinnaker/.kube &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -d &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> gcr.io/spinnaker-marketplace/halyard:stable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then run Armory-extended Halyard like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run --name armory-halyard --rm &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.hal:/home/spinnaker/.hal &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -v &lt;span style="color:#f1fa8c">${&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">HOME&lt;/span>&lt;span style="color:#f1fa8c">}&lt;/span>/armory/.kube:/home/spinnaker/.kube &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> -d &lt;span style="color:#f1fa8c">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f1fa8c">&lt;/span> index.docker.io/armory/halyard-armory:1.12.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note the different Docker image and different container name.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Exec into the Halyard container:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker &lt;span style="color:#8be9fd;font-style:italic">exec&lt;/span> -it armory-halyard bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update the version of Spinnaker:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal config version edit --version &lt;span style="color:#ff79c6">$(&lt;/span>hal version latest -q&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will use the latest stable version. If you want to use a different version, use &lt;code>hal version list&lt;/code> to get a list of available versions, and then &lt;code>hal config version edit --version X.X.X&lt;/code> to specify a specific version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Apply your changes&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal deploy apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="halyard-running-in-a-kubernetes-pod">Halyard running in a Kubernetes pod&lt;/h2>
&lt;p>If Halyard is running in your Kubernetes cluster, either as a Kubernetes Deployment or a Kubernetes StatefulSet, then you can do an in-place upgrade:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>First, update the image for your Halyard Deployment / StatefulSet from the open source Halyard image (&lt;code>gcr.io/spinnaker-marketplace/halyard:stable&lt;/code>) to the Armory-extended Halyard image (&lt;code>index.docker.io/armory/halyard-armory:1.12.1&lt;/code>)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Wait for the pod to start up.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Exec into your Kubernetes pod (insert your namespace and pod name, accordingly):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl &lt;span style="color:#8be9fd;font-style:italic">exec&lt;/span> -it spinnaker bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update the version of Spinnaker:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal config version edit --version &lt;span style="color:#ff79c6">$(&lt;/span>hal version latest -q&lt;span style="color:#ff79c6">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will use the latest stable version. If you want to use a different version, use &lt;code>hal version list&lt;/code> to get a list of available versions, and then &lt;code>hal config version edit --version X.X.X&lt;/code> to specify a specific version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Apply your changes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hal deploy apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="revert-back-to-spinnaker">Revert back to Spinnaker&lt;/h2>
&lt;p>If you want to go back to open source Spinnaker, you can repeat the same process as above with open source Halyard. Specifically, replace the Armory-extended Halyard image with the open source Halyard image, update Spinnaker version (from 2.x to 1.x), and run &lt;code>hal deploy apply&lt;/code>&lt;/p>
&lt;h2 id="troubleshooting">Troubleshooting&lt;/h2>
&lt;p>Depending on what version of Halyard / Armory-extended Halyard you&amp;rsquo;re moving to/from, there may be some fields in your Halyard configuration that are present in one version but not the other. You&amp;rsquo;ll see an &lt;code>Unrecognized field&lt;/code> error like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ hal deploy apply
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- Get current deployment
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Failure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Problems in Global:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>! ERROR Could not translate your halconfig: Unrecognized field
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;nodeSelectors&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">(&lt;/span>class
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> com.netflix.spinnaker.halyard.config.model.v1.node.DeploymentEnvironment&lt;span style="color:#ff79c6">)&lt;/span>, not
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> marked as ignorable &lt;span style="color:#ff79c6">(&lt;/span>&lt;span style="color:#bd93f9">14&lt;/span> known properties: &lt;span style="color:#f1fa8c">&amp;#34;size&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;initContainers&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;updateVersions&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;consul&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;customSizing&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;vault&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;gitConfig&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;location&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;sidecars&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;haServices&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;accountName&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;type&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;hostAliases&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;bootstrapOnly&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>at &lt;span style="color:#ff79c6">[&lt;/span>Source: N/A; line: -1, column: -1&lt;span style="color:#ff79c6">]&lt;/span> &lt;span style="color:#ff79c6">(&lt;/span>through reference chain:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> io.armory.halyard.config.model.v1.node.ArmoryHalconfig&lt;span style="color:#ff79c6">[&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;deploymentConfigurations&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">]&lt;/span>-&amp;gt;java.util.ArrayList&lt;span style="color:#ff79c6">[&lt;/span>0&lt;span style="color:#ff79c6">]&lt;/span>-&amp;gt;com.netflix.spinnaker.halyard.config.model.v1.node.ArmoryDeploymentConfiguration&lt;span style="color:#ff79c6">[&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;deploymentEnvironment&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">]&lt;/span>-&amp;gt;com.netflix.spinnaker.halyard.config.model.v1.node.DeploymentEnvironment&lt;span style="color:#ff79c6">[&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;nodeSelectors&amp;#34;&lt;/span>&lt;span style="color:#ff79c6">])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- Failed to get deployment name.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you see the above error, go to the &lt;code>/home/spinnaker/.hal/config&lt;/code> file in your Halyard container, search for the offending field, and remove the yaml block (comment it out or completely remove it).&lt;/p>
&lt;p>For example, in the above case, find the &lt;code>deploymentEnvironment.nodeSelectors field&lt;/code>, and remove it. Repeat as necessary.&lt;/p></description></item><item><title>Continuous-Deployment: QuickStart for Deploying to AWS from Spinnaker</title><link>/continuous-deployment/installation/guide/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/continuous-deployment/installation/guide/quickstart/</guid><description>
&lt;blockquote>
&lt;p>Armory Continuous Deployment (Armory CD) requires a license. For more information, contact &lt;a href="https://www.armory.io/contact-us/">Armory&lt;/a>.&lt;/p>
&lt;/blockquote></description></item></channel></rss>