<?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>DEV Community: Taylor Levits</title>
    <description>The latest articles on DEV Community by Taylor Levits (@tklevits).</description>
    <link>https://dev.to/tklevits</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%2F1689506%2F52ca3d4e-7e33-4851-a379-eaf9ad56b1eb.png</url>
      <title>DEV Community: Taylor Levits</title>
      <link>https://dev.to/tklevits</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tklevits"/>
    <language>en</language>
    <item>
      <title>Setting Up Velero for AKS Cluster Backups with Azure Workload Identity</title>
      <dc:creator>Taylor Levits</dc:creator>
      <pubDate>Wed, 02 Jul 2025 14:13:37 +0000</pubDate>
      <link>https://dev.to/tklevits/setting-up-velero-for-aks-cluster-backups-with-azure-workload-identity-5656</link>
      <guid>https://dev.to/tklevits/setting-up-velero-for-aks-cluster-backups-with-azure-workload-identity-5656</guid>
      <description>&lt;p&gt;I initially thought that taking cluster backups shouldn't need to be a thing, especially if you generally follow IaC principals.  However, in the case of backing up persistent storage data, point in time recovery, compliance, or simply peace of mind, cluster backups are extremely useful. For us, our current setup has application deployment is done through a self-managed CLI but microservices managed via IaC. If the cluster were to go down or be deleted, about 70+ apps would need to be redeployed manually.&lt;/p&gt;

&lt;p&gt;I recently completed the task of moving all of our applications from using the long-deprecated &lt;a href="https://github.com/Azure/aad-pod-identity" rel="noopener noreferrer"&gt;AAD Pod Identity&lt;/a&gt; to &lt;a href="https://azure.github.io/azure-workload-identity/" rel="noopener noreferrer"&gt;Azure Workload Identity&lt;/a&gt; for Azure resource authentication. I did this because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AAD Pod Identities have been deprecated since late 2023&lt;/li&gt;
&lt;li&gt;I wanted to upgrade our cluster to 1.31 and was tired of performing a backup using a hack described soon in this post&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I normally like to take a backup of the cluster before performing a Kubernetes upgrade, and we've used &lt;a href="https://docs.microsoft.com/en-us/azure/backup/azure-kubernetes-service-backup-overview" rel="noopener noreferrer"&gt;AKS backup&lt;/a&gt; in the past however...&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with AKS Native Backup
&lt;/h2&gt;

&lt;p&gt;Previously, we would hack our way through AKS backups by temporarily enabling pod identity (we installed it through helm, not through AKS) then disabling it for the upgrade process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az aks update &lt;span class="nt"&gt;--enable-pod-identity&lt;/span&gt; &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource-group&amp;gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;cluster-name&amp;gt;
az aks pod-identity exception add &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource-group&amp;gt; &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; &amp;lt;cluster-name&amp;gt; &lt;span class="nt"&gt;--namespace&lt;/span&gt; dataprotection-microsoft &lt;span class="nt"&gt;--pod-labels&lt;/span&gt; app.kubernetes.io/name&lt;span class="o"&gt;=&lt;/span&gt;dataprotection-microsoft-kubernetes
kubectl get azurepodidentityexceptions &lt;span class="nt"&gt;--all-namespaces&lt;/span&gt;
az aks update &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource-group&amp;gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;cluster-name&amp;gt; &lt;span class="nt"&gt;--enable-managed-identity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then perform the backup, followed by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az aks update &lt;span class="nt"&gt;--disable-pod-identity&lt;/span&gt; &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource-group&amp;gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;cluster-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is not sustainable! After migrating to Workload Identity, I attempted to use AKS backup and encountered this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error Code: UserErrorGenericPodIdentityMisconfiguration
Message: The AKS Backup extension is unable to use its managed identity because the AAD pod-managed identity is not properly configured.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though we no longer use pod identities and Microsoft recommends using Workload Identity, AKS backup still appears to depend on the deprecated pod identity system. It's hard to find documentation on this, but it seems like in order AKS backups work, I would have to append the pods with the necessary workload identity labels/service accounts. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Velero?
&lt;/h2&gt;

&lt;p&gt;I considered two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manually create a service account, managed identity, and federated credentials, then manually annotate all dataprotection pods. If this is indeed the solution, it would be difficult to store this configuration in IaC since it's a managed Microsoft solution. &lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://velero.io/" rel="noopener noreferrer"&gt;Velero&lt;/a&gt;. A popular, open-source backup service with lots of documentation and excellent examples.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I chose Velero because I can manage it through Helm and ArgoCD, rather than manual annotations and configurations, making it easier to document and maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing and Configuring Velero in AKS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli" rel="noopener noreferrer"&gt;Azure CLI&lt;/a&gt; installed and configured&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/tools/" rel="noopener noreferrer"&gt;kubectl&lt;/a&gt; configured for your AKS cluster&lt;/li&gt;
&lt;li&gt;Appropriate permissions to create Azure resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Create Storage Account and Container
&lt;/h3&gt;

&lt;p&gt;First, create the storage account and blob container where backups will be saved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create storage account&lt;/span&gt;
az storage account create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;storage-account-name&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--location&lt;/span&gt; &amp;lt;location&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--sku&lt;/span&gt; Standard_LRS

&lt;span class="c"&gt;# Create container&lt;/span&gt;
az storage container create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; velero-backups &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--public-access&lt;/span&gt; off &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--account-name&lt;/span&gt; &amp;lt;storage-account-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Custom Role for Velero
&lt;/h3&gt;

&lt;p&gt;Define the permissions Velero needs to perform backups and restores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;AZURE_ROLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Velero
&lt;span class="nv"&gt;AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;az account list &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'[?isDefault].id'&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;AZURE_BLOB_STORAGE_RESOURCE_GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;blob-storage-resource-group&amp;gt;
&lt;span class="nv"&gt;AKS_RESOURCE_GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;aks-resource-group, this generally starts with MC_&amp;gt;

az role definition create &lt;span class="nt"&gt;--role-definition&lt;/span&gt; &lt;span class="s1"&gt;'{
   "Name": "'&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_ROLE&lt;/span&gt;&lt;span class="s1"&gt;'",
   "Description": "Velero related permissions to perform backups, restores and deletions",
   "Actions": [
       "Microsoft.Compute/disks/read",
       "Microsoft.Compute/disks/write",
       "Microsoft.Compute/disks/endGetAccess/action",
       "Microsoft.Compute/disks/beginGetAccess/action",
       "Microsoft.Compute/snapshots/read",
       "Microsoft.Compute/snapshots/write",
       "Microsoft.Compute/snapshots/delete",
       "Microsoft.Storage/storageAccounts/listkeys/action",
       "Microsoft.Storage/storageAccounts/regeneratekey/action",
       "Microsoft.Storage/storageAccounts/read",
       "Microsoft.Storage/storageAccounts/blobServices/containers/delete",
       "Microsoft.Storage/storageAccounts/blobServices/containers/read",
       "Microsoft.Storage/storageAccounts/blobServices/containers/write",
       "Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey/action"
   ],
   "DataActions": [
     "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete",
     "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read",
     "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write",
     "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/move/action",
     "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action"
   ],
   "AssignableScopes": [
     "/subscriptions/'&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s1"&gt;'/resourceGroups/'&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_BLOB_STORAGE_RESOURCE_GROUP&lt;/span&gt;&lt;span class="s1"&gt;'",
     "/subscriptions/'&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s1"&gt;'/resourceGroups/'&lt;/span&gt;&lt;span class="nv"&gt;$AKS_RESOURCE_GROUP&lt;/span&gt;&lt;span class="s1"&gt;'"
   ]
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create Managed Identity
&lt;/h3&gt;

&lt;p&gt;Create the managed identity that Velero will use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;IDENTITY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;velero
&lt;span class="nv"&gt;AZURE_RESOURCE_GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;resource-group&amp;gt;

az identity create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--subscription&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_SUBSCRIPTION_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_RESOURCE_GROUP&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="nv"&gt;$IDENTITY_NAME&lt;/span&gt;

&lt;span class="nv"&gt;IDENTITY_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;az identity show &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_RESOURCE_GROUP&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$IDENTITY_NAME&lt;/span&gt; &lt;span class="nt"&gt;--subscription&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_SUBSCRIPTION_ID&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; clientId &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Assign Role to Managed Identity
&lt;/h3&gt;

&lt;p&gt;Grant the managed identity the necessary permissions to access blob storage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PRINCIPAL_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;az identity show &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="nv"&gt;$IDENTITY_NAME&lt;/span&gt; &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_RESOURCE_GROUP&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; principalId &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="si"&gt;)&lt;/span&gt;

az role assignment create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--role&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_ROLE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--assignee&lt;/span&gt; &lt;span class="nv"&gt;$PRINCIPAL_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="s2"&gt;"/subscriptions/&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s2"&gt;/resourceGroups/&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_RESOURCE_GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

az role assignment create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--role&lt;/span&gt; &lt;span class="nv"&gt;$AZURE_ROLE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--assignee&lt;/span&gt; &lt;span class="nv"&gt;$PRINCIPAL_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="s2"&gt;"/subscriptions/&lt;/span&gt;&lt;span class="nv"&gt;$AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s2"&gt;/resourceGroups/&lt;/span&gt;&lt;span class="nv"&gt;$AKS_RESOURCE_GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Deploy Velero with Helm
&lt;/h3&gt;

&lt;p&gt;This is our general folder configuration to deploy with Helm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;core/
└── velero/
    ├── Chart.yaml
    └── values.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chart.yaml:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;velero&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Velero Backup and Restore&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
&lt;span class="na"&gt;appVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.16.1"&lt;/span&gt;
&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;velero&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.16.1&lt;/span&gt;
  &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://vmware-tanzu.github.io/helm-charts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;values.yaml:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;velero&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;azure.workload.identity/use&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;

  &lt;span class="na"&gt;initContainers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;velero-plugin-for-microsoft-azure&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;velero/velero-plugin-for-microsoft-azure:v1.12.1&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;IfNotPresent&lt;/span&gt;
      &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/target&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;plugins&lt;/span&gt;

  &lt;span class="na"&gt;configuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;backupStorageLocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure&lt;/span&gt;
        &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure&lt;/span&gt;
        &lt;span class="na"&gt;bucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;velero-backups&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;useAAD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;resourceGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;resource-group&amp;gt;"&lt;/span&gt;
          &lt;span class="na"&gt;storageAccount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;storage-account-name&amp;gt;"&lt;/span&gt;
          &lt;span class="na"&gt;subscriptionId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;subscription-id&amp;gt;"&lt;/span&gt;

    &lt;span class="na"&gt;volumeSnapshotLocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure&lt;/span&gt;
        &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;resourceGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;resource-group&amp;gt;"&lt;/span&gt;
          &lt;span class="na"&gt;subscriptionId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;subscription-id&amp;gt;"&lt;/span&gt;

  &lt;span class="na"&gt;serviceAccount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;velero&lt;/span&gt;
      &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;azure.workload.identity/client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;client-id-from-managed-identity&amp;gt;"&lt;/span&gt;
        &lt;span class="na"&gt;azure.workload.identity/tenant-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;tenant-id&amp;gt;"&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;azure.workload.identity/use&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;

  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;secretContents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cloud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;AZURE_SUBSCRIPTION_ID=&amp;lt;subscription-id&amp;gt;&lt;/span&gt;
        &lt;span class="s"&gt;AZURE_RESOURCE_GROUP=&amp;lt;resource-group&amp;gt;&lt;/span&gt;
        &lt;span class="s"&gt;AZURE_CLOUD_NAME=AzurePublicCloud&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Create Federated Credential
&lt;/h3&gt;

&lt;p&gt;After deploying Velero, create the federated credential to enable Workload Identity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az identity federated-credential create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"kubernetes-federated-credential"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--identity-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IDENTITY_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AZURE_RESOURCE_GROUP&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--issuer&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;az aks show &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;cluster-name&amp;gt; &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource-group&amp;gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"oidcIssuerProfile.issuerUrl"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"system:serviceaccount:velero:velero"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--audience&lt;/span&gt; api://AzureADTokenExchange
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Your Velero Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a Test Application
&lt;/h3&gt;

&lt;p&gt;Install Velero according to the &lt;a href="https://velero.io/docs/v1.16/basic-install/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create a simple test application to backup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a test namespace&lt;/span&gt;
kubectl create namespace velero-test

&lt;span class="c"&gt;# Create a simple deployment&lt;/span&gt;
kubectl create deployment nginx-test &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx &lt;span class="nt"&gt;-n&lt;/span&gt; velero-test

&lt;span class="c"&gt;# Create a configmap with some data&lt;/span&gt;
kubectl create configmap test-config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;key1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;key2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value2 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-n&lt;/span&gt; velero-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Perform Different Types of Backups
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Basic Namespace Backup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backup specific namespace&lt;/span&gt;
velero backup create test-backup-namespace &lt;span class="nt"&gt;--include-namespaces&lt;/span&gt; velero-test

&lt;span class="c"&gt;# Check backup status&lt;/span&gt;
velero backup describe test-backup-namespace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cluster-wide Backup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backup entire cluster&lt;/span&gt;
velero backup create test-backup-cluster

&lt;span class="c"&gt;# Check status&lt;/span&gt;
velero backup get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Backup with Labels:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backup resources with specific labels&lt;/span&gt;
velero backup create test-backup-labels &lt;span class="nt"&gt;--selector&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scheduled Backup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a daily backup schedule&lt;/span&gt;
velero schedule create daily-backup &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--schedule&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0 2 * * *"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--include-namespaces&lt;/span&gt; velero-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Monitor the Backup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Watch backup progress&lt;/span&gt;
velero backup get

&lt;span class="c"&gt;# Get detailed backup information&lt;/span&gt;
velero backup describe test-backup-namespace &lt;span class="nt"&gt;--details&lt;/span&gt;

&lt;span class="c"&gt;# Check backup logs&lt;/span&gt;
velero backup logs test-backup-namespace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Verify Backup in Azure Storage
&lt;/h3&gt;

&lt;p&gt;Check your Azure storage account to confirm backup files were created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List containers in your storage account&lt;/span&gt;
az storage container list &lt;span class="nt"&gt;--account-name&lt;/span&gt; &amp;lt;storage-account-name&amp;gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# List backup files&lt;/span&gt;
az storage blob list &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--account-name&lt;/span&gt; &amp;lt;storage-account-name&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--container-name&lt;/span&gt; velero-backups &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Test Restore (Recommended)
&lt;/h3&gt;

&lt;p&gt;To fully validate your backup setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Delete the test namespace&lt;/span&gt;
kubectl delete namespace velero-test

&lt;span class="c"&gt;# Restore from backup&lt;/span&gt;
velero restore create test-restore &lt;span class="nt"&gt;--from-backup&lt;/span&gt; test-backup-namespace

&lt;span class="c"&gt;# Check restore status&lt;/span&gt;
velero restore describe test-restore

&lt;span class="c"&gt;# Verify the namespace and resources were restored&lt;/span&gt;
kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; velero-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Velero provides a robust, GitOps-friendly alternative to AKS Backup, especially using Azure Workload Identity to provide cluster backups. The CLI is intuitive and allows your the flexibility to schedule, control what you're backing up, and allow you to configure your setup. &lt;/p&gt;

&lt;p&gt;Please reach out if you have any questions!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://velero.io/docs/" rel="noopener noreferrer"&gt;Velero Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure" rel="noopener noreferrer"&gt;Velero Azure Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.github.io/azure-workload-identity/" rel="noopener noreferrer"&gt;Azure Workload Identity Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/backup/azure-kubernetes-service-backup-overview" rel="noopener noreferrer"&gt;AKS Backup Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/cli/azure/" rel="noopener noreferrer"&gt;Azure CLI Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/" rel="noopener noreferrer"&gt;Kubernetes Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helm.sh/docs/" rel="noopener noreferrer"&gt;Helm Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://argoproj.github.io/cd/" rel="noopener noreferrer"&gt;ArgoCD Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>velero</category>
      <category>aks</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Studying for the AWS SAA</title>
      <dc:creator>Taylor Levits</dc:creator>
      <pubDate>Wed, 26 Jun 2024 19:34:38 +0000</pubDate>
      <link>https://dev.to/tklevits/studying-for-the-aws-saa-4000</link>
      <guid>https://dev.to/tklevits/studying-for-the-aws-saa-4000</guid>
      <description>&lt;p&gt;With countless posts on the internet explaining the "best" way to study for the AWS Solutions Architect Associate exam, I thought I would add my own experience to the mix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adrian Cantrill's SAA course&lt;/li&gt;
&lt;li&gt;Tutorial Dojo's practice exams: One question on the exam exactly matched Review Set 7. Many services like Karpenter were covered, which I either forgot or didn't remember from Cantrill's course.&lt;/li&gt;
&lt;li&gt;Start with Review Mode, complete each exam in an hour and a half.&lt;/li&gt;
&lt;li&gt;Study incorrect answers using flashcards or another easy-to-review method.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've been dabbling in the DevOps field for a couple of years now. My job has me wearing many hats: sales, development, debugging, monitoring, finding solutions for other devs to improve workflow.&lt;/p&gt;

&lt;p&gt;In late 2023, I became serious about making DevOps my career path. After some searching on Reddit, I discovered Adrian Cantrill's course and committed to doing 20 minutes of coursework daily from November onwards.&lt;/p&gt;

&lt;p&gt;I quickly realized the videos had a notes section and started taking notes during the videos, which slowed me down as I paused to write things down.&lt;/p&gt;

&lt;p&gt;Life got busy. My job got responsibilities ebbed and flowed, and I lost motivation. Plus, I am expecting my first child in July. By April, I was still slogging through the videos but 80% done. I dedicated nights to finishing them, taking notes, and moving on. Eventually, I powered through and completed the course. This is not a shot against the course. At the time, I did not have the discipline to stay on a schedule.&lt;/p&gt;

&lt;p&gt;Adrian recommended Tutorial Dojo's practice exams. I bought them, but since I had started studying in November, I had forgotten much of what I learned. Fortunately, I had my notes. After each video, I copied and pasted my notes into a Notion document, but they were timestamped and hard to study from.&lt;/p&gt;

&lt;p&gt;So, I used ChatGPT to refine my notes and add any useful information for the SAA exam, a process that took about a week. I reviewed my cleaned-up notes and then moved on.&lt;/p&gt;

&lt;p&gt;I took the first Review Mode practice exam in an hour and a half to simulate real exam conditions. My first score was 58. Oof. There were questions and services on the test I had never seen before!&lt;/p&gt;

&lt;p&gt;Through Cantrill's article (You Might Be Using Practice Exams All Wrong), I adopted a system: take a test in an hour and a half, copy and paste all answers into a Notion document, and study the ones I got wrong. After studying, I retook the test without timing myself and rationalized every answer. This helped, but I still struggled with many services and API calls.&lt;/p&gt;

&lt;p&gt;I then bought index cards to write down information about AWS services I had trouble remembering (SQS queue maximum retention period is 14 days!). I quizzed myself repeatedly with 100 flashcards. My practice test scores improved, and I found a 33% off code on Reddit. I scheduled the test for July. For the reader, here is my takeaway from the exam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenging Topics on the Practice Tests&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;More Kubernetes and containers than expected&lt;br&gt;
No specific API call questions&lt;br&gt;
Some CloudWatch, IAM roles&lt;br&gt;
NLB&lt;br&gt;
FSx questions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Day Advice&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Take the test at a testing center if possible. Friends have had their tests shut down when taken remotely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the test center gives you a whiteboard, use it. It's easier to draw out the architecture (for me) than to think about it in your head.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flag questions if you're not 100% sure of the answer within 5 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the full hour and a half.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't spend more than 2 minutes on each question during the first pass.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take a break after the first pass if needed: leave the room, do jumping jacks, use the bathroom, drink water, and reset mentally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review flagged questions in the second pass.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeat until you run out of time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If unsure, and the question asks for the least overhead, choose the service (avoid scripts, Lambdas, EC2, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I passed with a 791. I left the test thinking it could have gone either way, but I'm very glad I didn't have to retake it. Happy to offer any additional advice that worked well for me! Good luck! On to the next certification! Either SAP or CKA. Please let me know if you have any questions or feedback. :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fniq3xfluvand0x7ixndr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fniq3xfluvand0x7ixndr.png" alt="Tim Robinson giving a thumbs up" width="772" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>solutionsarchitect</category>
    </item>
  </channel>
</rss>
