<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Relay</title>
    <description>The latest articles on Forem by Relay (@relaybypuppet).</description>
    <link>https://forem.com/relaybypuppet</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F561276%2F3e047b38-6a9f-4bb0-8534-781756374782.png</url>
      <title>Forem: Relay</title>
      <link>https://forem.com/relaybypuppet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/relaybypuppet"/>
    <language>en</language>
    <item>
      <title>How to Remediate Unencrypted S3 buckets</title>
      <dc:creator>Relay</dc:creator>
      <pubDate>Tue, 26 Jan 2021 19:29:05 +0000</pubDate>
      <link>https://forem.com/relay/how-to-remediate-unencrypted-s3-buckets-242n</link>
      <guid>https://forem.com/relay/how-to-remediate-unencrypted-s3-buckets-242n</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z-8R_0UF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/328d480136efa5627b162d0c718063c4/6050d/remediate-unencrypted-s3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z-8R_0UF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/328d480136efa5627b162d0c718063c4/6050d/remediate-unencrypted-s3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Cloud environments are always susceptible to security issues. A significant contributor to this problem is misconfigured resources.&lt;/p&gt;

&lt;p&gt;Traditional IT Infrastructure was somewhat static; server hardware only changed every few years. With few changes occurring, security was also more static. The modern cloud environment is a much different challenge. In cloud environments, servers, services, and storage are created with automation, resulting in a dynamic and potentially ever-changing server environment.&lt;/p&gt;

&lt;p&gt;Standardized policies and regular enforcement of best practices are key to reducing security risks. New automation can be created to enforce these policies on an ongoing basis. Even if the configuration drifts, automation can pull systems back into compliance.&lt;/p&gt;

&lt;p&gt;Unencrypted S3 buckets are an example of a configuration setting that could expose enormous quantities of sensitive data. In this article, we will look at using Relay to enforce encryption that is easy to set up and monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Relay for AWS
&lt;/h2&gt;

&lt;p&gt;Relay is an online platform with Graphical User Interface (GUI) and Command Line Interface (CLI) for all your cloud automation use cases. In our example, we will be using the GUI web interface.&lt;/p&gt;

&lt;p&gt;You will need to set up a Relay account at &lt;a href="https://app.relay.sh/signup"&gt;https://app.relay.sh/signup&lt;/a&gt; to create and run a workflow. The workflow will force encryption on specified S3 buckets in your Amazon Web Services (AWS) account.&lt;/p&gt;

&lt;p&gt;The Relay AWS connection requires creating an Identity and Access Management (IAM) user with permissions to edit S3 buckets. In your AWS console, go to the IAM dashboard and set up an IAM user. For example, under “Access management,” I set up a group called “BucketGroup” and a user named “relaydemouser”. Make sure you keep a copy of the “Access key ID” and “Secret access key” as you will need these. The “Secret access key” is only shown once.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/2bc6134609d714155b9e1d1dbc376fb6/ca2ce/Picture1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8tTNijfr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/2bc6134609d714155b9e1d1dbc376fb6/ca2ce/Picture1.png" alt="AWS IAM user" title="AWS IAM user"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user/group will need permissions to access the S3 buckets. For the example above, I added the policy “AmazonS3FullAccess” to the permissions of the BucketGroup. Do the same with the user/group you create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/c3583929cce2aad40bce682d44994f49/3fee3/Picture2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnAEVsk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/c3583929cce2aad40bce682d44994f49/3fee3/Picture2.png" alt="AWS permissions and managed policies" title="AWS permissions and managed policies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This policy gives the IAM user, or group of users, full access to the S3 buckets, including checking configuration, listing buckets, and encrypting S3 buckets.&lt;/p&gt;

&lt;p&gt;Once you have a user with the required permissions, you can set up the Relay connection configuration. Open the &lt;strong&gt;Connections&lt;/strong&gt; section of Relay and add a connection to AWS with this IAM user.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/43ea011b5c7ae7f7c1123f7d827e82bf/44463/Picture3.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E7_v6tYf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/43ea011b5c7ae7f7c1123f7d827e82bf/44463/Picture3.png" alt="Choose Relay connection" title="Choose Relay connection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can choose any name for the connection but will need to use the AWS “Access key ID” and “Secret access key” for your IAM user as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/7a19f7cea988b51277796b841fa6b124/52621/Picture4.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m13j8J39--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/7a19f7cea988b51277796b841fa6b124/52621/Picture4.png" alt="Add AWS connection form" title="Add AWS connection form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Workflow
&lt;/h2&gt;

&lt;p&gt;Relay has many sample workflows, including one to remediate unencrypted S3 buckets. &lt;a href="https://relay.sh/workflows/s3-remediate-unencrypted-buckets/"&gt;Use this link&lt;/a&gt; to find it, or, from inside the GUI, click on the workflow icon and then &lt;strong&gt;Explore workflows.&lt;/strong&gt; Under the &lt;strong&gt;Security&lt;/strong&gt; heading, you will see “Remediate unencrypted S3 buckets.”&lt;/p&gt;

&lt;p&gt;Looking at a new AWS S3 Storage bucket’s properties page, you will see that encryption is disabled by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/d59e3a82fbfc3f2ea7c39386e7a1b9c1/6a170/Picture5.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2ZTPCk7z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/d59e3a82fbfc3f2ea7c39386e7a1b9c1/6a170/Picture5.png" alt="Default encryption disabled" title="Default encryption disabled"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The workflow will enable server-side encryption. After running the workflow, your default encryption settings will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/49280fc4f35c4adb1e8067a1492f3c4e/11b02/Picture6.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jdKQ4ZOv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/49280fc4f35c4adb1e8067a1492f3c4e/11b02/Picture6.png" alt="Default encryption enabled" title="Default encryption enabled"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can review the workflow contents (code, graph, and so on) then click on the “Use this workflow” button.&lt;/p&gt;

&lt;p&gt;Clicking &lt;strong&gt;Try this workflow&lt;/strong&gt; will bring you to a new workflow dialog with a suggested name. Note that workflow names must be unique within your account. Click on &lt;strong&gt;Create workflow&lt;/strong&gt; and Relay will display the workflow graph:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/beda670392d785bf4da69655ae3e4e2c/047b0/Picture7.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wnh_5vXf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/beda670392d785bf4da69655ae3e4e2c/047b0/Picture7.png" alt="Relay workflow graph" title="Relay workflow graph"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To run the workflow, click &lt;strong&gt;Run&lt;/strong&gt; in the top right corner of the workflow page. Running the workflow will bring up a dialog showing &lt;code&gt;dryRun = true&lt;/code&gt;. Doing a dry run will test the logic but will not make any changes. Go ahead and run the workflow in dryRun mode. Visit the &lt;a href="https://relay.sh/docs/using-workflows/"&gt;Using Workflows&lt;/a&gt; section of the documentation for more information on workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/bdb10f38969bedd89cfb70716b58b034/08d47/Picture8.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gzN7jJNd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/bdb10f38969bedd89cfb70716b58b034/08d47/Picture8.png" alt="Dry run parameter" title="Dry run parameter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The workflow will stop at the approval step and will not execute the action step to encrypt the S3 bucket. In dryRun mode, the Yes and No approval buttons are disabled. If you rerun the workflow and set the dryRun dialog to &lt;code&gt;false&lt;/code&gt;, Relay will stop the workflow at the approval step and allow you to click on “Yes” or “No.” If you click on “Yes,” the flow will continue and encrypt the S3 buckets.&lt;/p&gt;

&lt;p&gt;After the workflow is complete, go back to AWS and check the encryption status on your S3 bucket. The buckets that had previously been unencrypted should now be encrypted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up a Trigger
&lt;/h2&gt;

&lt;p&gt;Relay supports multiple ways to trigger a workflow. We have already walked through the manual trigger, running a workflow manually. You can also schedule a trigger to run automatically, using a process similar to that of a Linux cron job. Relay also supports &lt;a href="https://relay.sh/docs/using-workflows/using-triggers/"&gt;webhook and REST API triggers&lt;/a&gt;. Services which support webhooks can post a JSON payload to Relay when an event happens. The Relay REST API receives JWT-authenticated requests from a remote system and runs a workflow in response. Read all about triggers in the &lt;a href="https://relay.sh/docs/using-workflows/using-triggers"&gt;Using Triggers&lt;/a&gt; section of the documentation.&lt;/p&gt;

&lt;p&gt;For this example, we’ll use a simple schedule trigger to run the workflow at midnight every day. Click on the “Add trigger” button in the first block of the graph to display the Add trigger dialog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/4450f9717a63d2c180858dae94ce99d5/187ee/Picture9.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--duhKbmeJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/4450f9717a63d2c180858dae94ce99d5/187ee/Picture9.png" alt="Add a trigger" title="Add a trigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/9925e462bb367ef072e7a5deccabb86c/78ab6/Picture10.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ggqcyGZ8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/9925e462bb367ef072e7a5deccabb86c/78ab6/Picture10.png" alt="Choose the scheduled trigger" title="Choose the scheduled trigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on “Run a trigger every day” will bring up a code snippet that will be added to your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/6d41bc3fbf94eda235173fad38a892ce/11b02/Picture11.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yz10-pYK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/6d41bc3fbf94eda235173fad38a892ce/11b02/Picture11.png" alt="Run a trigger every day" title="Run a trigger every day"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you save the modified code, you will see that the trigger block in the graph now says it will run every day. A summary of the five digits of Cron time setting ‘* * * * *’ is shown below—an asterisk (*) means no specific value.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Time Unit&lt;/th&gt;
&lt;th&gt;Possible Values&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Minute&lt;/td&gt;
&lt;td&gt;0 to 59 or *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Hour&lt;/td&gt;
&lt;td&gt;0 to 23 or *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Day of Month&lt;/td&gt;
&lt;td&gt;1 to 31 or *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Month&lt;/td&gt;
&lt;td&gt;1 to 12 or *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Day of Week&lt;/td&gt;
&lt;td&gt;0 to 7 or * Both 0 and 7 represent Sunday.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you run the workflow, it will run immediately, plus run automatically every day. You would need to remove or modify the approval step if you want the workflow to run continuously.&lt;/p&gt;

&lt;p&gt;You can remove the schedule trigger by deleting the triggers section in the code and saving changes. The graph button will change back to “Add trigger.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;You have configured a workflow to add encryption to AWS S3 storage buckets, and learned to set up a scheduled trigger. As described in this article, many preconfigured workflows make it easy to get started with Relay. Plus, the code is readily available for modification and expansion outside the GUI interface.&lt;/p&gt;

&lt;p&gt;Other example Relay flows are available for many Azure, AWS, and GCP tasks.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://relay.sh"&gt;Relay&lt;/a&gt; and start automating your DevOps maintenance today.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Save Time and Money by Automatically Deleting Unused Azure Load Balancers</title>
      <dc:creator>Relay</dc:creator>
      <pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate>
      <link>https://forem.com/relay/save-time-and-money-by-automatically-deleting-unused-azure-load-balancers-236j</link>
      <guid>https://forem.com/relay/save-time-and-money-by-automatically-deleting-unused-azure-load-balancers-236j</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6oNsjt10--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/8b4ceff77a8c32b96fb20578ddb20f06/0ff54/dollar-4492709_1280.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6oNsjt10--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/8b4ceff77a8c32b96fb20578ddb20f06/0ff54/dollar-4492709_1280.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the cloud reduces on-premises infrastructure costs and related maintenance. Instead of deploying more servers, storage, and networking components to your own datacenter, you are now deploying these as cloud resources. Using the cloud is supposed to reduce infrastructure and maintenance costs. However, deploying cloud resources also risks over-commissioning, under-usage, and keeping resources running that are not always needed or, even worse, no longer in use.&lt;/p&gt;

&lt;p&gt;To help you avoid wasting these unused resources, Puppet created Relay. This tool enables you to automate DevOps cloud maintenance, including automatically cleaning up resources you no longer need. This reduces resource waste while saving DevOps time, helping your team focus on delivering exciting new product features.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cleaning up Azure
&lt;/h1&gt;

&lt;p&gt;In this article, we walk you through a common scenario. You may be using Azure Infrastructure components, like Virtual Machines and related Virtual Networking resources, together with Azure Load Balancers. When you no longer need the Virtual Machine, and delete it, you may forget about the Azure Load Balancer. The Load Balancer then continues to use your valuable cloud computing resources. Relay workflow helps you clean up.&lt;/p&gt;

&lt;p&gt;To use Relay:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activate your Relay account at &lt;a href="https://relay.sh"&gt;relay.sh&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Define a connection between Relay and Azure, using an Azure service principal.&lt;/li&gt;
&lt;li&gt;Create your Relay workflow, which then performs the cleanup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s examine each of these steps with step-by-step guidance. If you already have an Azure subscription with administrative access, you can follow these steps in your own environment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Setting Up Relay
&lt;/h1&gt;

&lt;p&gt;Setting up a Relay account is rather straightforward. It is a hosted-cloud service with nothing to download, install, update, or maintain.&lt;/p&gt;

&lt;p&gt;First, create a new Relay account by completing the required fields on the &lt;a href="https://app.relay.sh/signup"&gt;signup page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/016c2de45ba4f756051ff3ddf4bfb395/0342e/image1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0SYcSjzW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/016c2de45ba4f756051ff3ddf4bfb395/0342e/image1.png" alt="Relay sign up screen" title="Relay sign up screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After accepting the activation link in your email, create a complex password, confirm it, and that’s all it takes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/7a54529869b1bc8659e60a44bf14d771/347c0/image2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o4hCKBdl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/7a54529869b1bc8659e60a44bf14d771/347c0/image2.png" alt="Welcome to Relay screen" title="Welcome to Relay screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, after successfully logging on to the Relay platform, you are ready to start. From the Relay portal, browse sample workflows or create a new one from scratch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/5d528dc9fdc1bcf90ba78665a7272684/4c61e/image3.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9CbpDC8Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/5d528dc9fdc1bcf90ba78665a7272684/4c61e/image3.png" alt="Relay Sidebar" title="Relay Sidebar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also an option to define &lt;em&gt;connections&lt;/em&gt;, where you specify the service account of your cloud platform. Relay supports many different public and private cloud environments, including Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), and Kubernetes. In our example, we will use Azure, but the process is similar in all environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/c886bf087c40d9386c590062247e1338/7ecec/image4.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3KJMN_kj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/c886bf087c40d9386c590062247e1338/7ecec/image4.png" alt="Add connection" title="Add connection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuring Access to Azure
&lt;/h1&gt;

&lt;p&gt;Before creating a workflow, let’s start by defining a connection for Azure. This relies on an Azure Active Directory service principal. Think of this object as just another user account, used by an application and similar to an Azure administrative account.&lt;/p&gt;

&lt;p&gt;Once you create the service principal, apply Azure Role Based Access Control (RBAC) permissions, limiting this account’s administrative capabilities to keep your production environment secure. &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/app-objects-and-service-principals"&gt;Optionally, you can read more about service principal objects.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are several ways to create a service principal, such as Azure Portal, Azure Cloud Shell, PowerShell, ARM Template, or REST API. We will show you how to create the service principal using Azure Cloud Shell.&lt;/p&gt;

&lt;p&gt;First, navigate to the &lt;a href="https://portal.azure.com"&gt;Azure Portal&lt;/a&gt;, and open Azure Cloud Shell from the top right menu. Note: if this is the first time you use Azure Cloud Shell, it will ask you to create an Azure Storage Account and Azure FileShare – complete this step to continue. Select Bash as the interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/e1d8057a552568aaf91a06a420d83559/a66f5/image5.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kl0BN5it--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/e1d8057a552568aaf91a06a420d83559/64756/image5.png" alt="Azure Cloud Shell" title="Azure Cloud Shell"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type the following Azure command-line interface (CLI) command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az ad sp create-for-rbac -n "Relaysp"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the service principal in your Azure Active Directory, and shows the actual account credential details as Shell output. Copy this information for later use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/434fc493443fc467098289a782aeac40/f27d7/image6.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--swhSzc8I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/434fc493443fc467098289a782aeac40/64756/image6.png" alt="Azure account credentials" title="Azure account credentials"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the &lt;a href="https://app.relay.sh"&gt;Relay portal&lt;/a&gt; and select “Connections”. Next, click the “Add Connection” button and choose Azure from the list. This opens the “Set up your Azure Connection” window. Complete the fields, copying the information from the Cloud Shell output, as shown in the below example:&lt;/p&gt;

&lt;p&gt;Relay Names Azure Service Connection Names&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription ID - Subscription&lt;/li&gt;
&lt;li&gt;Client ID - appId&lt;/li&gt;
&lt;li&gt;Tenant ID - tenant&lt;/li&gt;
&lt;li&gt;Secret - password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/62ed4eccbfed4efb68b2520630ffa716/65dc2/image7.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RLmrjP0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/62ed4eccbfed4efb68b2520630ffa716/65dc2/image7.png" alt="Set up your Azure connection" title="Set up your Azure connection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the information. This creates your connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/6546b3fcbaaac2a87b3bfaa62f78e8a6/37cfc/image8.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zwaId-qj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/6546b3fcbaaac2a87b3bfaa62f78e8a6/64756/image8.png" alt="Azure connection created" title="Azure connection created"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are now ready to create our workflow.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating a Workflow
&lt;/h1&gt;

&lt;p&gt;There are a couple of different ways to create the workflow. Remember, it is a YAML dialect, allowing us to author the file in any intelligent text editor, like Visual Studio Code or similar.&lt;/p&gt;

&lt;p&gt;You could write the YAML from scratch, but Relay provides an extensive open source library of sample workflows on GitHub, integrated into the Relay portal. So, let’s have a look.&lt;/p&gt;

&lt;p&gt;First, from the Relay portal, navigate to Workflows. Select “Explore our workflow library_”._&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/740980c01291e7eee5389ff071ec9511/35d52/image9.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pGXdPSLE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/740980c01291e7eee5389ff071ec9511/64756/image9.png" alt="Explore our workflow Library" title="Explore our workflow Library"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the category list, select “Cost optimization”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/69b1f4313eda30ea1ff1d999aa2e2a15/2bea0/image10.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jJuxTlJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/69b1f4313eda30ea1ff1d999aa2e2a15/64756/image10.png" alt="Select cost optimization" title="Select cost optimization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Locate the “Delete empty Azure Load Balancers” workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/fc1f715ed700241ec0ae57b980abfb2a/c807c/image11.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nQe9k0cL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/fc1f715ed700241ec0ae57b980abfb2a/64756/image11.png" alt="Delete empty Azure Load Balancers workflow" title="Delete empty Azure Load Balancers workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click “Use this workflow”, provide a unique name, and confirm by pressing “Create workflow”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/04a1e88780a15712ecb46af4fb1949d3/bb7f4/image12.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K6lH5YdT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/04a1e88780a15712ecb46af4fb1949d3/bb7f4/image12.png" alt="Create Relay workflow" title="Create Relay workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This imports the workflow into your dashboard. From here, you need to complete some minimal configuration settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/e348ff81f4f58fcf47fa1c99713a0a57/7bd25/image13.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R-oRp22f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/e348ff81f4f58fcf47fa1c99713a0a57/64756/image13.png" alt="Workflow created" title="Workflow created"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first warning we get is “missing required connection”. You need to specify which Azure Connection the workflow should use, namely, the one you created in the previous step. To fix this error, click the “Fill in missing connections” link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/dcf7f795aa729f37831501c7061d99f1/25327/image14.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nrebHWBh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/dcf7f795aa729f37831501c7061d99f1/25327/image14.png" alt="Ensure youre Azure connection is added" title="Ensure youre Azure connection is added"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, it shows a default Connection of “my-azure-account”. You could add a new connection here, however, we already created one. To use it, we need to switch back to the Code view of the workflow and make a change in the YAML.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/cb8881aa0932d72e1e992439dc7d8656/a1898/image15.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gc9w5FIP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/cb8881aa0932d72e1e992439dc7d8656/64756/image15.png" alt="Update your connection in the code view" title="Update your connection in the code view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the code editor, search for the keyword “connection” (line 27 in the sample file), and replace the name “my-azure-account” with the name of the Azure Connection you created earlier (Azure-Relay in our setup). Make sure you save the changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/0ffea7fb9e65808cd1818423e5fc6d96/55954/image16.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--63iqIQTh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/0ffea7fb9e65808cd1818423e5fc6d96/64756/image16.png" alt="Updated connection" title="Updated connection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice how the connection is ‘recognized’ under the settings pane to the right.&lt;/p&gt;

&lt;p&gt;From here, let’s test the workflow to ensure it can successfully connect to our Azure subscription and detect Load Balancers. Click “Run” and confirm by pressing “run workflow” in the popup window. Also, notice this flow can run in dryRun mode, which means it won’t actually change anything in our environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/1d9e02f9b3c92bf6ddbb85f7fb2bffb0/684d5/image17.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EO1j-4Qo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/1d9e02f9b3c92bf6ddbb85f7fb2bffb0/64756/image17.png" alt="Run the workflow manually" title="Run the workflow manually"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The workflow kicks off and displays the step-by-step sequence:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/4bea8381799a8493fa8f8b280edcfd17/66712/image18.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IYluKEh_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/4bea8381799a8493fa8f8b280edcfd17/66712/image18.png" alt="Queued worflow" title="Queued worflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/632c67936671167e9824f776c7c7d03d/afe45/image19.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kFwdNz1I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/632c67936671167e9824f776c7c7d03d/afe45/image19.png" alt="Running workflow" title="Running workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dry run workflow worked fine. To look at each step in a bit more detail, hover over the step, for example, “list-azure-load-balancers”, and select view logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/784815dcc328853a7d054ba6a705373b/8c7b4/image20.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NEgwCl0G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/784815dcc328853a7d054ba6a705373b/8c7b4/image20.png" alt="View logs" title="View logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following output is displayed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/5fbcae8d05c8783f7f81facc17b27751/e69c5/image21.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VL1FSQaC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/5fbcae8d05c8783f7f81facc17b27751/64756/image21.png" alt="Final output" title="Final output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the workflow lists the valid load balancers. Note: we didn’t deploy a Load Balancer yet, so it is normal that the result is zero, but at least it ran fine.&lt;/p&gt;

&lt;p&gt;Remember, this workflow is checking for “empty load balancers”, which means it looks for Azure Load Balancers without any endpoint connection parameters. To make this a more viable test, let’s deploy a Load Balancer in Azure. If you need some assistance on how to do this, you might use this &lt;a href="https://azure.microsoft.com/en-us/resources/templates/101-load-balancer-standard-create/"&gt;sample from Azure QuickStart Templates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This deploys a Standard-type Azure Load Balancer, together with three Virtual Machines (VMs) as a back-end pool. If you want, you can update the Azure deployment template to deploy only a single VM if you don’t want to test three.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/410cbf0644244710c3553432fab25359/f8041/image22.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3emIfXNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/410cbf0644244710c3553432fab25359/64756/image22.png" alt="Create a load balancer in Azure" title="Create a load balancer in Azure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After deploying this template, the setup looks similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/b7b5c36d3d881c83643164a2757ed011/cdade/image23.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E50GuoNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/b7b5c36d3d881c83643164a2757ed011/64756/image23.png" alt="Load balancer list page" title="Load balancer list page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s go back to Relay and run our workflow once more. Notice that, this time, the Load Balancer is actually detected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/8a1d091bc11e1046be96eada99301852/dc4d2/image24.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vSfMVe89--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/8a1d091bc11e1046be96eada99301852/64756/image24.png" alt="Logs for list load balancers step" title="Logs for list load balancers step"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select the next step in the flow, filter-loadbalancers, and view logs. This reveals that the detected Load Balancer is not empty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/ce142c63d2c822e86a83394bd5afa774/27773/image25.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5ovSjge3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/ce142c63d2c822e86a83394bd5afa774/64756/image25.png" alt="Logs for filter step" title="Logs for filter step"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is interesting to know how Relay identifies if the Load Balancer configuration is empty or not. Let’s have a look at the actual YAML code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/4e6349911687b195bc8613caf8265f00/93b57/image26.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3p4bX0tU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/4e6349911687b195bc8613caf8265f00/64756/image26.png" alt="Input file for filtering" title="Input file for filtering"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script includes a pointer to a Python script, which looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/1f65d7c5593185e6ef235632c2b18f7a/c8502/image27.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CXOvyGsl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/1f65d7c5593185e6ef235632c2b18f7a/64756/image27.png" alt="Logic within filtering input file" title="Logic within filtering input file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see it is checking for any Load Balancers with empty “backend_address_pools”.&lt;/p&gt;

&lt;p&gt;To run a more valid test, let’s go back to the Azure Load Balancer, and clear the backend pool configuration. The easiest way to remove this is by using the following PowerShell cmdlet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remove-AzureRMLoadBalancerBackendAddressPoolConfig

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more information on doing this, refer to the following Microsoft Doc:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/azurerm.network/remove-azurermloadbalancerbackendaddresspoolconfig?view=azurermps-6.13.0"&gt;Remove-AzureRmLoadBalancerBackendAddressPoolConfig&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: if you used the default settings from the Azure Quickstart Template sample deployment earlier, use the following PowerShell script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Get-AzureRmLoadBalancer -Name "MyLB-lb" -ResourceGroupName "MyLBRG" | Remove-AzureRmLoadBalancerBackendAddressPool -Name "LoadBalancerBackendPool" | Set-AzureRmLoadBalancer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://relay.sh/static/ff831ee5e138edc00c42401bd88949ed/ef7d6/image28.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B3TgGel2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/ff831ee5e138edc00c42401bd88949ed/64756/image28.png" alt="Running the Azure PowerShell script" title="Running the Azure PowerShell script"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Load Balancer configuration shows an empty BackEndPool now:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/5cd702b001e1577bf894ea2ee56f76de/2c0f3/image29.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9VMiNkCT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/5cd702b001e1577bf894ea2ee56f76de/64756/image29.png" alt="Azure load balancer configuration" title="Azure load balancer configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the Relay workflow once more to see what happens with the Azure Resource. To test, make sure you keep the DryRun value set as True. The result is the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/a1e2d312819aa065c06b57191d1b6ecc/cb670/image30.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OImGwi79--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/a1e2d312819aa065c06b57191d1b6ecc/64756/image30.png" alt="Logs for filter step" title="Logs for filter step"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This time, the empty Load Balancer is detected for removal.&lt;/p&gt;

&lt;p&gt;Next, trigger the workflow once more, this time setting the DryRun to False, which means it will actually force the removal of the Azure Load Balancer resource. You will also need to confirm “Yes” on the approval step in the workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/72944be0e621febc5752e0f263e2f960/fc2b1/image31.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GBUHmMop--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/72944be0e621febc5752e0f263e2f960/64756/image31.png" alt="Logs for delete Azure load balancers step" title="Logs for delete Azure load balancers step"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After about a minute, we get positive confirmation saying all specified load balancers are deleted. Validating from the Azure Portal confirms this.&lt;/p&gt;

&lt;p&gt;As a last step in this process, I want to highlight the trigger option at the beginning of the workflow. Up till now, we kicked off the workflow manually. This works fine for testing, but doesn’t work well in production. You may want to schedule this cleanup, validating your environment every week or maybe every night.&lt;/p&gt;

&lt;p&gt;To schedule your load balancer cleanup, first, select the first step in the workflow, “Add trigger”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/7f7aba1f807bea31ac782ecdf198f2cb/cec09/image32.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QRZ4YG9t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/7f7aba1f807bea31ac782ecdf198f2cb/cec09/image32.png" alt="Add a trigger" title="Add a trigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This opens a list with different triggers to choose from, like running a “per day” job or triggering the workflow using an HTTP interaction. This could be interesting if you want to automate the process from your systems management tool. Whenever you connect to the trigger-HTTP-URL, the workflow executes. Let’s go back to the day-trigger scenario for now.&lt;/p&gt;

&lt;p&gt;Select the “Run a trigger every day” option, which reflects the corresponding code. The most important setting here is “schedule”, using the standardized cron notation to define the scheduling format.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relay.sh/static/6be10daed8202f532eee30570a4d190f/b38af/image33.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TnDg8v4a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://relay.sh/static/6be10daed8202f532eee30570a4d190f/b38af/image33.png" alt="Add a scheduled trigger" title="Add a scheduled trigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information on the cron definition, I can recommend this &lt;a href="https://cron.help/examples"&gt;helpful link&lt;/a&gt;. You now have one less thing to monitor. You can check it off your busy DevOps team’s to-do list.&lt;/p&gt;

&lt;h1&gt;
  
  
  Next Steps
&lt;/h1&gt;

&lt;p&gt;In this article, we introduced you to Relay, a product Puppet created to automate cloud management tasks. From first configuring the cloud connection, we explored an example scenario, cleaning up empty Azure Load Balancers. We then learned how to trigger the workflow as a daily scheduled task.&lt;/p&gt;

&lt;p&gt;Other &lt;a href="https://github.com/puppetlabs/relay-workflows"&gt;example workflows&lt;/a&gt; enable you to easily set up maintenance of VMs, network interface controllers (NICs), and Disks.&lt;/p&gt;

&lt;p&gt;While this example detailed how to clean up Azure, Relay also works with other cloud environments. You can adjust the example above to develop workflows for any Azure, AWS or GCP resources.&lt;/p&gt;

&lt;p&gt;Automating your load balancer cleanup and other DevOps tasks saves you time and money as your team instead focuses on creating great new features for your software applications. Check out &lt;a href="https://relay.sh/"&gt;Relay&lt;/a&gt; to automate your DevOps maintenance today.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
