<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PAUL'S BLOG</title><link>https://paulyu.dev/</link><description>Recent content on PAUL'S BLOG</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 20 Apr 2026 13:00:00 +0000</lastBuildDate><atom:link href="https://paulyu.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Installing VMware Workstation Pro 25H2 on Ubuntu Desktop</title><link>https://paulyu.dev/article/installing-vmware-25h2-on-ubuntu-desktop/</link><pubDate>Mon, 20 Apr 2026 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/installing-vmware-25h2-on-ubuntu-desktop/</guid><description>&lt;p&gt;Last year, I wrote a guide on how to install &lt;a href="https://paulyu.dev/article/installing-vmware-on-ubuntu-desktop/"&gt;VMware Workstation Pro on Ubuntu Desktop&lt;/a&gt;. Since then, I&amp;rsquo;ve learned there&amp;rsquo;s an easier way to manually install and sign the vmmon and vmnet modules when attempting to run VMware Workstation Pro on a UEFI-based system with secure boot enabled. No more custom building of the modules required! The modules can be installed using VMware&amp;rsquo;s installer, and you just need to manually sign them. Let&amp;rsquo;s go through this process step by step.&lt;/p&gt;</description></item><item><title>Study Guide: Kubernetes and Cloud Native Associate (KCNA)</title><link>https://paulyu.dev/article/kcna-study-guide/</link><pubDate>Fri, 19 Dec 2025 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/kcna-study-guide/</guid><description>&lt;p&gt;My KCNA certification is up for renewal, and as I&amp;rsquo;m preparing to retake the exam, it dawned on me that I wrote up a study guide for it never actually published it. Doh! 🫣&lt;/p&gt;
&lt;p&gt;So here it is 🤗&lt;/p&gt;
&lt;p&gt;The KCNA is a great entry point for anyone looking to validate their foundational knowledge of Kubernetes and the cloud native ecosystem. I thought it would be helpful to document my study notes and share them with others who are also preparing for the exam.&lt;/p&gt;</description></item><item><title>Local LLMs: Running Ollama and Open WebUI in Docker on Ubuntu</title><link>https://paulyu.dev/article/ollama-and-openwebui-containers/</link><pubDate>Wed, 08 Oct 2025 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/ollama-and-openwebui-containers/</guid><description>&lt;p&gt;&lt;a href="https://docs.ollama.com/"&gt;Ollama&lt;/a&gt; is a popular tool for running large language models (LLMs) locally on your machine. It provides a simple interface to interact with various models without needing an internet connection. &lt;a href="https://docs.openwebui.com"&gt;Open WebUI&lt;/a&gt; is a web-based user interface that allows you to interact with LLMs through a browser.&lt;/p&gt;
&lt;p&gt;I am working on an Ubuntu 24.04.3 LTS Desktop machine with decent hardware to run models locally, so my preference is to run Ollama as a local service rather than confining it to a container. This way, Ollama can take full advantage of my machine&amp;rsquo;s capabilities, especially the GPU.&lt;/p&gt;</description></item><item><title>Build a Weather MCP Server with Rust: Complete Tutorial for AI Integration</title><link>https://paulyu.dev/article/rust-mcp-server-weather-tutorial/</link><pubDate>Tue, 10 Jun 2025 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/rust-mcp-server-weather-tutorial/</guid><description>&lt;p&gt;Building AI tools that can access real-time data requires bridging the gap between language models and external APIs. The Model Context Protocol (MCP) makes this possible by providing a standard way for AI assistants to interact with data sources.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll build a weather MCP server using Rust that connects to the National Weather Service API, giving any MCP-compatible AI assistant the ability to fetch live weather alerts and forecasts.&lt;/p&gt;</description></item><item><title>Deploying AKS Automatic clusters with Pulumi: A step-by-step guide</title><link>https://paulyu.dev/article/deploying-aks-automatic-with-pulumi/</link><pubDate>Mon, 10 Mar 2025 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/deploying-aks-automatic-with-pulumi/</guid><description>&lt;p&gt;Yo! Let&amp;rsquo;s build an AKS Automatic cluster with Pulumi 🚀&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t already know, &lt;a href="https://www.pulumi.com/"&gt;Pulumi&lt;/a&gt; is a modern Infrastructure as Code (IaC) tool that allows you to use your favorite programming language to deploy and manage cloud resources. I like it because I can use &lt;a href="https://go.dev/"&gt;Go&lt;/a&gt; and the &lt;a href="https://www.pulumi.com/docs/iac/languages-sdks/go/"&gt;Pulumi Go SDK&lt;/a&gt; to write my infrastructure code. There are other languages supported like Python, TypeScript, .NET, and more so be sure to check out their &lt;a href="https://www.pulumi.com/docs/iac/languages-sdks/#pulumi-languages-sdks"&gt;docs&lt;/a&gt; for more information.&lt;/p&gt;</description></item><item><title>Installing VMware Workstation Pro on Ubuntu Desktop</title><link>https://paulyu.dev/article/installing-vmware-on-ubuntu-desktop/</link><pubDate>Mon, 03 Mar 2025 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/installing-vmware-on-ubuntu-desktop/</guid><description>&lt;p&gt;This is a guide that will walk you through the steps to install VMware Workstation Pro on Ubuntu Desktop. I am currently using Ubuntu 24.10 with version 6.11.x of the Linux kernel on a UEFI-based system with secure boot enabled. This guide is based on my experience with this setup and may not apply to all systems.&lt;/p&gt;
&lt;h2 id="download-vmware-workstation-pro"&gt;Download VMware Workstation Pro&lt;/h2&gt;
&lt;p&gt;To start, browse to &lt;a href="https://support.broadcom.com"&gt;https://support.broadcom.com&lt;/a&gt; and login or create an account if you don&amp;rsquo;t already have one.&lt;/p&gt;</description></item><item><title>Certified Argo Project Associate (CAPA) Exam Study Guide</title><link>https://paulyu.dev/article/capa-study-guide/</link><pubDate>Thu, 06 Feb 2025 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/capa-study-guide/</guid><description>&lt;p&gt;I recently passed the &lt;a href="https://training.linuxfoundation.org/certification/certified-argo-project-associate-capa/"&gt;Certified Argo Project Associate (CAPA)&lt;/a&gt; exam and wanted to share a study guide to help you prepare for the exam. If you are not already aware, the &lt;a href="https://www.cncf.io/training/certification/"&gt;Cloud Native Computing Foundation (CNCF)&lt;/a&gt; offers a suite of certifications that validate your knowledge and expertise in cloud-native technologies, with &lt;a href="https://argoproj.github.io/"&gt;Argo&lt;/a&gt; being one of them.&lt;/p&gt;
&lt;p&gt;The CAPA exam is designed for beginners who are new to Argo and its suite of tools which includes Argo Workflows, Argo CD, Argo Rollouts, and Argo Events.&lt;/p&gt;</description></item><item><title>Installing Kubernetes 1.30</title><link>https://paulyu.dev/article/installing-kubernetes/</link><pubDate>Fri, 09 Aug 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/installing-kubernetes/</guid><description>&lt;h2 id="kubernetes-on-your-laptop-3-part-series"&gt;Kubernetes on your Laptop (3 part series)&lt;/h2&gt;
&lt;ul&gt;
&lt;li hugo-nav="/article/installing-vmware-fusion/"&gt;&lt;a href="https://paulyu.dev/article/installing-vmware-fusion/"&gt;Installing VMware Fusion&lt;/a&gt;&lt;/li&gt;
&lt;li hugo-nav="/article/installing-ubuntu-server/"&gt;&lt;a href="https://paulyu.dev/article/installing-ubuntu-server/"&gt;Installing Ubuntu Server 22.04&lt;/a&gt;&lt;/li&gt;
&lt;li hugo-nav="/article/installing-kubernetes/"&gt;&lt;a href="https://paulyu.dev/article/installing-kubernetes/"&gt;Installing Kubernetes 1.30&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the third and final post in my &amp;ldquo;Kubernetes on your Laptop&amp;rdquo; series. In this post, I will show you how to install Kubernetes on Ubuntu server. If you haven&amp;rsquo;t read the previous posts, I recommend you go back and ensure you have an Ubuntu server running on your laptop before proceeding.&lt;/p&gt;</description></item><item><title>Installing Ubuntu Server 22.04</title><link>https://paulyu.dev/article/installing-ubuntu-server/</link><pubDate>Thu, 08 Aug 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/installing-ubuntu-server/</guid><description>&lt;h2 id="kubernetes-on-your-laptop-3-part-series"&gt;Kubernetes on your Laptop (3 part series)&lt;/h2&gt;
&lt;ul&gt;
&lt;li hugo-nav="/article/installing-vmware-fusion/"&gt;&lt;a href="https://paulyu.dev/article/installing-vmware-fusion/"&gt;Installing VMware Fusion&lt;/a&gt;&lt;/li&gt;
&lt;li hugo-nav="/article/installing-ubuntu-server/"&gt;&lt;a href="https://paulyu.dev/article/installing-ubuntu-server/"&gt;Installing Ubuntu Server 22.04&lt;/a&gt;&lt;/li&gt;
&lt;li hugo-nav="/article/installing-kubernetes/"&gt;&lt;a href="https://paulyu.dev/article/installing-kubernetes/"&gt;Installing Kubernetes 1.30&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the second post in my &amp;ldquo;Kubernetes on your Laptop&amp;rdquo; series. In this post, I&amp;rsquo;ll show you how to install Ubuntu Server on a virtual machine using VMware Fusion. If you need help installing VMware Fusion, check out my previous post.&lt;/p&gt;
&lt;h2 id="download-ubuntu-server-image"&gt;Download Ubuntu Server Image&lt;/h2&gt;
&lt;p&gt;First thing we need to do is download the Ubuntu Server image based on your machine&amp;rsquo;s architecture:&lt;/p&gt;</description></item><item><title>Installing VMware Fusion</title><link>https://paulyu.dev/article/installing-vmware-fusion/</link><pubDate>Wed, 07 Aug 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/installing-vmware-fusion/</guid><description>&lt;h2 id="kubernetes-on-your-laptop-3-part-series"&gt;Kubernetes on your Laptop (3 part series)&lt;/h2&gt;
&lt;ul&gt;
&lt;li hugo-nav="/article/installing-vmware-fusion/"&gt;&lt;a href="https://paulyu.dev/article/installing-vmware-fusion/"&gt;Installing VMware Fusion&lt;/a&gt;&lt;/li&gt;
&lt;li hugo-nav="/article/installing-ubuntu-server/"&gt;&lt;a href="https://paulyu.dev/article/installing-ubuntu-server/"&gt;Installing Ubuntu Server 22.04&lt;/a&gt;&lt;/li&gt;
&lt;li hugo-nav="/article/installing-kubernetes/"&gt;&lt;a href="https://paulyu.dev/article/installing-kubernetes/"&gt;Installing Kubernetes 1.30&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m preparing to renew my &lt;a href="https://training.linuxfoundation.org/certification/certified-kubernetes-administrator-cka/"&gt;CKA&lt;/a&gt; and &lt;a href="https://training.linuxfoundation.org/certification/certified-kubernetes-security-specialist/"&gt;CKS&lt;/a&gt; certifications, and to practice, I&amp;rsquo;ve decided to set up a local Kubernetes cluster as a lab environment on my laptop to work with control plane components which isn&amp;rsquo;t be possible in a managed Kubernetes environment like &lt;a href="https://cloud.google.com/kubernetes-engine"&gt;GKE&lt;/a&gt;, &lt;a href="https://aws.amazon.com/eks/"&gt;EKS&lt;/a&gt;, or &lt;a href="https://learn.microsoft.com/azure/aks/what-is-aks"&gt;AKS&lt;/a&gt;. There are other local Kubernetes options like &lt;a href="https://minikube.sigs.k8s.io/docs/"&gt;Minikube&lt;/a&gt;, &lt;a href="https://kind.sigs.k8s.io/"&gt;Kind&lt;/a&gt;, &lt;a href="https://docs.docker.com/desktop/kubernetes/"&gt;Docker Desktop&lt;/a&gt;, or &lt;a href="https://ranchermanager.docs.rancher.com/integrations-in-rancher/rancher-desktop"&gt;Rancher Desktop&lt;/a&gt; but you may run into some limitations especially as you try to prepare for the CKA and CKS exams. I wanted to have a full-blown Kubernetes cluster running locally without any restrictions.&lt;/p&gt;</description></item><item><title>Study Guide: Kubernetes Certified Security Associate (KCSA)</title><link>https://paulyu.dev/article/kcsa-study-guide/</link><pubDate>Tue, 23 Jul 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/kcsa-study-guide/</guid><description>&lt;p&gt;I&amp;rsquo;ve been studying for the Kubernetes Certified Security Associate (KCSA) exam, and I thought it would be helpful to document my study notes and share them with others who are also preparing for the exam.&lt;/p&gt;
&lt;p&gt;This article is a bit long but it will cover everything you need to know to pass the KCSA exam. I&amp;rsquo;ll be updating this article as I find additional content to share, so make sure to bookmark it and check back often.&lt;/p&gt;</description></item><item><title>Publishing Helm Charts to GitHub Container Registry</title><link>https://paulyu.dev/article/publishing-helm-charts-to-ghcr/</link><pubDate>Mon, 22 Jul 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/publishing-helm-charts-to-ghcr/</guid><description>&lt;p&gt;So you have a local &lt;a href="https://helm.sh"&gt;Helm&lt;/a&gt; chart that you want to share with others?&lt;/p&gt;
&lt;p&gt;In this quick tutorial, I&amp;rsquo;ll walk you through the process of publishing Helm charts to your very own Helm repository using GitHub Container Registry and GitHub Pages using GitHub Actions.&lt;/p&gt;
&lt;p&gt;Before you begin, make sure you have the following prerequisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A GitHub account&lt;/li&gt;
&lt;li&gt;A GitHub repository with your Helm chart&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.github.com"&gt;GitHub CLI&lt;/a&gt; installed on your local machine&lt;/li&gt;
&lt;li&gt;Bash shell&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-pages-setup"&gt;GitHub Pages Setup&lt;/h2&gt;
&lt;p&gt;We will use GitHub Pages to host the Helm repository. So you will need to create a new branch called &lt;strong&gt;gh-pages&lt;/strong&gt;. This branch will contain the Helm chart binaries and a &lt;strong&gt;README.md&lt;/strong&gt; file with instructions on how to use the helm repo and install its charts.&lt;/p&gt;</description></item><item><title>Publishing Container Images to GitHub Container Registry</title><link>https://paulyu.dev/article/publishing-container-images-to-ghcr/</link><pubDate>Tue, 18 Jun 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/publishing-container-images-to-ghcr/</guid><description>&lt;p&gt;Do you have a container image that you want to share with the world? GitHub Container Registry (GHCR) is a great place to store and share your container images. In this tutorial, we&amp;rsquo;ll show you how to publish container images to GHCR using GitHub Actions.&lt;/p&gt;
&lt;p&gt;Start by creating a new repository on GitHub or cloning an existing one. Then make sure you have a Dockerfile in the root of your repository.&lt;/p&gt;</description></item><item><title>You Down with PDB?</title><link>https://paulyu.dev/article/you-down-with-pdb/</link><pubDate>Fri, 22 Mar 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/you-down-with-pdb/</guid><description>&lt;blockquote&gt;
&lt;p&gt;P.D.B. how can I explain it&lt;br&gt;
I&amp;rsquo;ll take you frame by frame it&lt;br&gt;
To have y&amp;rsquo;all all jumpin&amp;rsquo;, shoutin&amp;rsquo;, sayin&amp;rsquo; it&lt;br&gt;
&lt;strong&gt;P&lt;/strong&gt; is for Pod, &lt;strong&gt;D&lt;/strong&gt; is for Disruption, reboot and watch it ripple&lt;br&gt;
The last &lt;strong&gt;B&lt;/strong&gt;, well, that&amp;rsquo;s super simple&lt;/p&gt;
&lt;p&gt;~ An ode to Naughty by Nature&amp;rsquo;s track titled O.P.P. which Microsoft Copilot helped me write 😂&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll take a look at Kubernetes &lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/disruptions/"&gt;Pod Disruption Budgets (PDBs)&lt;/a&gt; and how they can be used to ensure that your applications remain available during planned disruptions.&lt;/p&gt;</description></item><item><title>Adding a GitHub Codespace button to your README</title><link>https://paulyu.dev/code/adding-codespace-button-to-your-github-readme/</link><pubDate>Thu, 21 Mar 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/code/adding-codespace-button-to-your-github-readme/</guid><description>&lt;p&gt;&lt;a href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt; is a great way to make it easier for people to contribute to your project. With a few clicks, folks can spin up a Codespace environment with all necessary tooling installed and be productive right away. But it does take a few clicks and this quick post is to show how you can save developers a click or two because every click matters 😆&lt;/p&gt;
&lt;p&gt;With one line of markdown in your README, you can add a button that looks like this&amp;hellip;&lt;/p&gt;</description></item><item><title>Soaring to New Heights with Kaito: The Kubernetes AI Toolchain Operator</title><link>https://paulyu.dev/article/soaring-with-kaito/</link><pubDate>Wed, 20 Mar 2024 14:00:00 +0000</pubDate><guid>https://paulyu.dev/article/soaring-with-kaito/</guid><description>&lt;p&gt;Earlier today at KubeCon Europe 2024, &lt;a href="https://twitter.com/jorgefpalma"&gt;Jorge Palma&lt;/a&gt; of the AKS team gave a &lt;a href="https://x.com/CloudNativeFdn/status/1770375558607647132?s=20"&gt;keynote talk on Kaito, the Kubernetes AI Toolchain Operator&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Next keynote speaker &lt;a href="https://twitter.com/jorgefpalma?ref_src=twsrc%5Etfw"&gt;@jorgefpalma&lt;/a&gt; 🙌 we are truly living in the AI revolution &lt;a href="https://t.co/ATxLWUKDeD"&gt;pic.twitter.com/ATxLWUKDeD&lt;/a&gt;&lt;/p&gt;&amp;mdash; CNCF (@CloudNativeFdn) &lt;a href="https://twitter.com/CloudNativeFdn/status/1770375558607647132?ref_src=twsrc%5Etfw"&gt;March 20, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;This tool has been released as an &lt;a href="https://github.com/Azure/kaito"&gt;open-source project&lt;/a&gt; a few months back and you may or may not have heard of it.&lt;/p&gt;
&lt;p&gt;So if you don&amp;rsquo;t know, now you know&amp;hellip;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re probably thinking, &amp;ldquo;but what is it, and what can it do for me?&amp;rdquo; 🤔&lt;/p&gt;</description></item><item><title>Strengthening the Secure Supply Chain</title><link>https://paulyu.dev/article/strengthening-the-secure-supply-chain/</link><pubDate>Sun, 17 Mar 2024 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/strengthening-the-secure-supply-chain/</guid><description>&lt;p&gt;This post will walk you through a demo I presented at the &lt;a href="https://www.socallinuxexpo.org/scale/21x"&gt;SCaLE21X&lt;/a&gt; conference. The session is titled, &lt;a href="https://www.socallinuxexpo.org/scale/21x/presentations/strengthening-secure-supply-chain-project-copacetic-eraser-and-fluxcd"&gt;Strengthening the Secure Supply Chain with Project Copacetic, Eraser, and FluxCD&lt;/a&gt; and this step-by-step guide will enable you do it on your own.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;To begin, you will need to have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/get-started/"&gt;Docker Desktop&lt;/a&gt; to run a Kubernetes cluster locally&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; to clone the demo repository&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/signup"&gt;GitHub account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will also be using the following tools:&lt;/p&gt;</description></item><item><title>KubeConNA | Building Carbon Awareness with KEDA: Taking the First Step Towards Sustainability</title><link>https://paulyu.dev/video/kubecon-building-carbon-awareness-with-keda/</link><pubDate>Thu, 16 Nov 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/video/kubecon-building-carbon-awareness-with-keda/</guid><description>&lt;p&gt;Speaking at KubeConNA 2023 was an awesome experience. But what was equally awesome was being able to speak about a topic and project that was very close to my heart. I spoke about how we can build carbon awareness on the Kubernetes platform with the open-source KEDA project, and how we can take the first step towards sustainability just by being aware of the carbon intensity of energy produced during time periods and reducing our demand for energy during those periods.&lt;/p&gt;</description></item><item><title>Bootstrap your GitOps-enabled AKS cluster with Terraform: A code sample using the Flux v2 K8s Extension</title><link>https://paulyu.dev/article/bootstrap-gitops-with-aks-extension-using-terraform/</link><pubDate>Thu, 28 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/bootstrap-gitops-with-aks-extension-using-terraform/</guid><description>&lt;p&gt;In my previous posts, we learned how to &lt;a href="https://aka.ms/cloudnative/GitGoingWithGitOps"&gt;get started with GitOps on AKS&lt;/a&gt; using the K8s extension for AKS.&lt;/p&gt;
&lt;p&gt;Then, we took a look at the Flux CLI and explored how it can be used to bootstrap your cluster and generate FluxCD manifests so that we can use GitOps to implement GitOps 🤯, and implemented Flux&amp;rsquo;s &lt;a href="https://aka.ms/cloudnative/ImageAutomationWithFluxCD"&gt;image update automation&lt;/a&gt; capability.&lt;/p&gt;
&lt;p&gt;From there, we built on the concept of image update automation, and showed you how you can use Flagger to &lt;a href="https://aka.ms/cloudNative/ProgressiveDeliveryWithFlagger"&gt;automate canary deployments&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Progressive Delivery on AKS: A Step-by-Step Guide using Flagger with Istio and FluxCD</title><link>https://paulyu.dev/article/more-gitops-with-fluxcd-and-flagger-on-aks/</link><pubDate>Tue, 26 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/more-gitops-with-fluxcd-and-flagger-on-aks/</guid><description>&lt;p&gt;In my previous &lt;a href="https://aka.ms/cloudnative/ImageAutomationWithFluxCD"&gt;post&lt;/a&gt;, we setup an Azure Kubernetes Service (AKS) cluster to automatically update images based on new image tags in a container registry. As soon as a new image was pushed to the registry the image was immediately updated.&lt;/p&gt;
&lt;p&gt;But what if you don&amp;rsquo;t want an agent automatically pushing out new images without some sort of testing? 🤔&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll build upon Flux&amp;rsquo;s image update automation capability and add &lt;a href="https://flagger.app/"&gt;Flagger&lt;/a&gt; to implement a &lt;a href="https://docs.flagger.app/usage/deployment-strategies#canary-release"&gt;canary release strategy&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Automating Image Updates with FluxCD on AKS</title><link>https://paulyu.dev/article/automating-image-updates-with-fluxcd-on-aks/</link><pubDate>Fri, 22 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/automating-image-updates-with-fluxcd-on-aks/</guid><description>&lt;p&gt;In my previous &lt;a href="https://aka.ms/cloudnative/GitGoingWithGitOps"&gt;post&lt;/a&gt;, we walked through the setup of FluxCD on AKS via AKS extensions. In this article, we&amp;rsquo;ll go a bit deeper and take a look at how you can use FluxCD to automate image updates in your AKS cluster.&lt;/p&gt;
&lt;p&gt;The goal here is to streamline the process of updating your application deployments in your cluster.&lt;/p&gt;
&lt;p&gt;Here is our intended workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Modify application code, then commit and push the change to the repo.&lt;/li&gt;
&lt;li&gt;Create a new release in GitHub which kicks off a release workflow to build and push an updated container image to a GitHub Container Registry.&lt;/li&gt;
&lt;li&gt;FluxCD detects the new image and updates the image tag in the cluster.&lt;/li&gt;
&lt;li&gt;FluxCD rolls out the new image to the cluster.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We&amp;rsquo;ll use same AKS store demo app we used in the previous post, but this time we&amp;rsquo;ll go a bit faster.&lt;/p&gt;</description></item><item><title>Git going with GitOps on AKS: A Step-by-Step Guide using FluxCD AKS Extension</title><link>https://paulyu.dev/article/git-going-with-gitops-on-aks/</link><pubDate>Wed, 20 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/git-going-with-gitops-on-aks/</guid><description>&lt;p&gt;In reading through &lt;a href="https://dev.to/smurawski"&gt;@StevenMurawski&lt;/a&gt;&amp;rsquo;s blog post titled, &lt;a href="https://aka.ms/cloudnative/WhatReallyIsGitOps"&gt;What Really is GitOps?&lt;/a&gt; we learned that GitOps is a way to do &lt;a href="https://learn.microsoft.com/devops/deliver/what-is-continuous-delivery"&gt;Continuous Delivery&lt;/a&gt; of our applications on Kubernetes.&lt;/p&gt;
&lt;p&gt;In this post, I will jump right into how you can &amp;ldquo;git&amp;rdquo; going with GitOps by enabling the &lt;a href="https://learn.microsoft.com/azure/azure-arc/kubernetes/conceptual-gitops-flux2"&gt;FluxCD AKS Extension&lt;/a&gt; on your Azure Kubernetes Service (AKS) and using a tool called &lt;a href="https://kustomize.io/"&gt;Kustomize&lt;/a&gt; to help with Kubernetes configuration management.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll deploy my new favorite demo app, &lt;a href="https://github.com/Azure-Samples/aks-store-demo"&gt;AKS Store Demo&lt;/a&gt; to our AKS cluster and then make some changes to the application and see how FluxCD handles them.&lt;/p&gt;</description></item><item><title>Installing .NET on Ubuntu</title><link>https://paulyu.dev/code/installing-dotnet-ubuntu/</link><pubDate>Sat, 09 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/code/installing-dotnet-ubuntu/</guid><description>&lt;p&gt;Installing .NET on Ubuntu is supposed to be easy. Sometimes it&amp;rsquo;s not. You should be able to follow the instructions on the &lt;a href="https://learn.microsoft.com/dotnet/core/install/linux-ubuntu"&gt;Microsoft docs&lt;/a&gt; and install from a package manager but I&amp;rsquo;ve had issues with that. It&amp;rsquo;s been a frustrating experience; the package installs but then I can&amp;rsquo;t run &lt;code&gt;dotnet --version&lt;/code&gt; and I can&amp;rsquo;t figure out why.&lt;/p&gt;
&lt;p&gt;Thankfully there is an option to &lt;a href="https://learn.microsoft.com/dotnet/core/install/linux-scripted-manual#scripted-install"&gt;manually install&lt;/a&gt; .NET, this is what I&amp;rsquo;ve had the most success with.&lt;/p&gt;</description></item><item><title>Pushing Multi-Architecture Container Images</title><link>https://paulyu.dev/article/pushing-multi-arch-container-images-guide/</link><pubDate>Thu, 07 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/pushing-multi-arch-container-images-guide/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;My previous article, &lt;a href="https://paulyu.dev/article/building-and-deploying-multi-arch-container-images-guide/"&gt;Building Multi-Architecture Container Images&lt;/a&gt;, covered the basics of building multi-architecture container images using Docker Buildx. In this article, we&amp;rsquo;ll explore how to push multi-architecture container images to Azure Container Registry (ACR) using GitHub Actions.&lt;/p&gt;
&lt;h2 id="what-is-a-github-action"&gt;What is a GitHub Action?&lt;/h2&gt;
&lt;p&gt;GitHub Actions is a continuous integration and continuous deployment (CI/CD) platform built into GitHub. It allows you to automate, customize, and execute your software development workflows. Using GitHub Actions, you can create workflows that respond to GitHub events, such as push, issue creation, or a new release.&lt;/p&gt;</description></item><item><title>Building Multi-Architecture Container Images</title><link>https://paulyu.dev/article/building-and-deploying-multi-arch-container-images-guide/</link><pubDate>Tue, 05 Sep 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/building-and-deploying-multi-arch-container-images-guide/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Over the past several years, we&amp;rsquo;ve seen the emergence of the &lt;strong&gt;ARM64&lt;/strong&gt; architecture, which is gaining popularity due to its energy efficiency and performance benefits. We often seen these processors in mobile devices, such as smartphones and tablets. We also seen them in our IoT devices, such as smartwatches and smart TVs. Now, we are starting to see increased adoption of &lt;strong&gt;ARM64&lt;/strong&gt; processors in servers and personal computers.&lt;/p&gt;
&lt;p&gt;This emergence of the &lt;strong&gt;ARM64&lt;/strong&gt; architecture, means that we now have two major processor architectures to consider when building and deploying our containerized applications in order to maximize our application&amp;rsquo;s reach.&lt;/p&gt;</description></item><item><title>Does Workload Identity on AKS work across tenants?</title><link>https://paulyu.dev/article/cross-tenant-workload-identity-on-aks/</link><pubDate>Fri, 25 Aug 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/cross-tenant-workload-identity-on-aks/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;An interesting use case for Workload Identity came up recently. I was asked if a Pod in an AKS cluster that was deployed in one tenant can access Azure resources within another tenant.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve configured Workload Identity on AKS many times, and I thought &amp;ldquo;in theory&amp;rdquo; it should &amp;ldquo;just work&amp;rdquo;, but I never tested it across tenants. So I decided to give it a try.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR: Yes, it does work.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Streamline Network Observability on AKS: A Step-by-Step Guide to enable the AKS add-on with Terraform</title><link>https://paulyu.dev/article/streamline-network-observability-aks-addon-terraform-guide/</link><pubDate>Mon, 10 Jul 2023 13:00:00 +0000</pubDate><guid>https://paulyu.dev/article/streamline-network-observability-aks-addon-terraform-guide/</guid><description>&lt;p&gt;Have you ever had to troubleshoot network issues in your Kubernetes clusters? If so, you know how challenging it can be to identify and resolve problems.&lt;/p&gt;
&lt;p&gt;To troubleshoot network issues you probably had to use a combination of tools like &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;tcpdump&lt;/code&gt;, &lt;code&gt;wireshark&lt;/code&gt;, and &lt;code&gt;netstat&lt;/code&gt;. The list goes on and on&amp;hellip; While these tools are great for debugging and capturing network logs and traces, they don&amp;rsquo;t provide a holistic view of your cluster&amp;rsquo;s network traffic.&lt;/p&gt;</description></item><item><title>Efficient Configuration Management in AKS: Integrating Azure App Configuration for Seamless Loading of Key-Value Pairs into Config Maps</title><link>https://paulyu.dev/article/efficient-configuration-management-aks-integrating-azure-app-configuration/</link><pubDate>Tue, 13 Jun 2023 06:00:00 -0700</pubDate><guid>https://paulyu.dev/article/efficient-configuration-management-aks-integrating-azure-app-configuration/</guid><description>&lt;p&gt;Did you know that &lt;a href="https://learn.microsoft.com/azure/azure-app-configuration/overview"&gt;Azure App Configuration Service&lt;/a&gt; is a managed service that helps you centralize your application configuration? It provides a way to store all your app configs in one place and manage them centrally. It also provides a way to manage feature flags and control feature rollouts. I highlighted the feature management capabilities in a breakout session the &lt;a href="https://build.microsoft.com"&gt;Microsoft Build&lt;/a&gt; conference a few weeks ago. If you have not watched the session yet, you can find the recording &lt;a href="https://youtu.be/LhJODembils"&gt;here&lt;/a&gt;&lt;/p&gt;</description></item><item><title>#MSBuild | Integrating Azure AI and Azure Kubernetes Service to build intelligent apps | BRK225H</title><link>https://paulyu.dev/video/msbuild-2023-brk225h/</link><pubDate>Fri, 02 Jun 2023 14:05:46 -0800</pubDate><guid>https://paulyu.dev/video/msbuild-2023-brk225h/</guid><description>&lt;p&gt;I had the opportunity to speak at #MSBuild 2023. Build is Microsoft&amp;rsquo;s largest developer conference held every year in May. This year, we were lucky enough to get back to a full in-person experience with plenty of awesome sessions with tons of technical demos. I shared the stage with Jorge Palma from the AKS PM team, and we spoke about how you can to integrate Azure AI and Azure Kubernetes Service to build and run your intelligent apps.&lt;/p&gt;</description></item><item><title>Purging Deleted Azure Key Vaults</title><link>https://paulyu.dev/code/purging-deleted-azure-vaults/</link><pubDate>Mon, 27 Feb 2023 13:09:20 -0800</pubDate><guid>https://paulyu.dev/code/purging-deleted-azure-vaults/</guid><description>&lt;p&gt;Do you constantly provision and delete Azure Key Vaults?&lt;/p&gt;
&lt;p&gt;If so, you may have noticed attempts to recreate a recently deleted key vault will result in the following error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The vault name is already in use.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is because Azure Key Vaults are kept in a deleted state and not automatically purged. You must manually purge these key vaults to be able to reuse the name.&lt;/p&gt;
&lt;p&gt;To confirm the key vault in question is in &amp;ldquo;deleted&amp;rdquo; state, you can run the following:&lt;/p&gt;</description></item><item><title>Effortlessly Deploy to Azure Kubernetes with Open Source Tools Draft and Acorn</title><link>https://paulyu.dev/article/app-to-aks-with-draft-and-acorn/</link><pubDate>Tue, 03 Jan 2023 11:11:01 -0800</pubDate><guid>https://paulyu.dev/article/app-to-aks-with-draft-and-acorn/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;
On March 15, 2024 Acorn Labs &lt;a href="https://www.acorn.io/resources/blog/our-new-focus-developing-an-llm-app-platform-based-on-gpt-script-technology?fromOther=true"&gt;announced&lt;/a&gt; that they will be shifting focus to developing an LLM app platform based on GPT-Script technology and has archived the Acorn &lt;a href="https://github.com/acorn-io/runtime"&gt;Runtime&lt;/a&gt; project.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll walk you through deploying a web application to &lt;a href="https://learn.microsoft.com/azure/aks"&gt;Azure Kubernetes Service (AKS)&lt;/a&gt; without having to write any Docker or Kubernetes manifest files.&lt;/p&gt;
&lt;p&gt;Using open-source command-line tools &lt;a href="https://github.com/Azure/draft"&gt;Draft&lt;/a&gt; and &lt;a href="https://docs.acorn.io"&gt;Acorn&lt;/a&gt;, we&amp;rsquo;ll containerize and deploy to AKS in just a few steps! Let&amp;rsquo;s go 🚀&lt;/p&gt;</description></item><item><title>Service Mesh Considerations</title><link>https://paulyu.dev/article/service-mesh-considerations/</link><pubDate>Wed, 14 Dec 2022 07:00:00 -0700</pubDate><guid>https://paulyu.dev/article/service-mesh-considerations/</guid><description>&lt;p&gt;&amp;ldquo;Build microservices&amp;rdquo;, they said&amp;hellip; &amp;ldquo;it&amp;rsquo;ll be fun&amp;rdquo;, they said&amp;hellip;&lt;/p&gt;
&lt;p&gt;There are many reasons why you would want to deploy a solution based on the &lt;a href="https://microservices.io/patterns/microservices.html"&gt;microservices architectural pattern&lt;/a&gt;, but it comes at a cost. More microservices means more deployments to manage, more microservices to connect, more microservices to secure&amp;hellip; yeah, it gets complex real quick.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re just getting started with microservices or have a small number of microservices deployed, you may have heard of the term &amp;ldquo;service mesh&amp;rdquo;, but not needed one yet.&lt;/p&gt;</description></item><item><title>Re-visiting Dev Container Features</title><link>https://paulyu.dev/article/revisiting-devcontainer-features/</link><pubDate>Fri, 02 Dec 2022 08:00:10 -0700</pubDate><guid>https://paulyu.dev/article/revisiting-devcontainer-features/</guid><description>&lt;p&gt;A few months ago I wrote a post that described how you can &lt;a href="https://github.com/microsoft/dev-container-features-template"&gt;add custom features to your Dev Containers&lt;/a&gt;. That didn&amp;rsquo;t age very well 😅&lt;/p&gt;
&lt;p&gt;But good news is that there is a better way to add or extend functionality for your Dev Containers. 🥳&lt;/p&gt;
&lt;p&gt;Since my original post, &lt;a href="https://twitter.com/BrigitMurtaugh"&gt;@BrigitMurtaugh&lt;/a&gt; published a post on the VS Code blog announcing new repos, the &lt;a href="https://containers.dev/"&gt;open dev container specification&lt;/a&gt; and discussed a new way of adding features. If you haven&amp;rsquo;t read the post, go check it out &lt;a href="https://code.visualstudio.com/blogs/2022/09/15/dev-container-features"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Web Application Routing on AKS</title><link>https://paulyu.dev/article/managed-ingress-on-aks/</link><pubDate>Wed, 16 Nov 2022 07:00:00 -0700</pubDate><guid>https://paulyu.dev/article/managed-ingress-on-aks/</guid><description>&lt;p&gt;Exposing your web applications on &lt;a href="https://learn.microsoft.com/azure/aks/intro-kubernetes"&gt;Azure Kubernetes Service (AKS)&lt;/a&gt; has gotten a little bit easier. In this post, I will cover the new &lt;a href="https://learn.microsoft.com/azure/aks/web-app-routing?tabs=with-osm"&gt;Web Application Routing&lt;/a&gt; feature for AKS and discuss reasons why you may want to implement it within your cluster.&lt;/p&gt;
&lt;h2 id="exposing-your-app"&gt;Exposing your app&lt;/h2&gt;
&lt;p&gt;You have a lot of options when it comes to exposing your application &lt;strong&gt;Pods&lt;/strong&gt; to the world. If you&amp;rsquo;re using a managed-Kubernetes service in the cloud, you could deploy a &lt;a href="https://kubernetes.io/docs/concepts/services-networking/service/"&gt;Service&lt;/a&gt; and set the type to &lt;a href="https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer"&gt;LoadBalancer&lt;/a&gt; and your cloud provider will provision one with a public IP. The &lt;strong&gt;Service&lt;/strong&gt; sits in front of your &lt;strong&gt;Pods&lt;/strong&gt; and if all you need is a public IP, you&amp;rsquo;re good to go.&lt;/p&gt;</description></item><item><title>Ubuntu Dev Tools</title><link>https://paulyu.dev/code/ubuntu-dev-tools/</link><pubDate>Fri, 11 Nov 2022 06:57:20 -0800</pubDate><guid>https://paulyu.dev/code/ubuntu-dev-tools/</guid><description>&lt;p&gt;Is this the year of the Linux desktop? I&amp;rsquo;m not sure but I have been making more of an effort to &amp;ldquo;daily drive&amp;rdquo; a Linux desktop lately. I&amp;rsquo;m currently working off of an Ubuntu 22.10 machine and here is my script for installing common tools that I work with daily.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# add git repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository ppa:git-core/ppa
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install some basic tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; python3 &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; python3-pip &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bpytop &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; guvcview &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vim &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gnupg2 &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; jq &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; zsh &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; build-essential &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cmake &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libssl-dev &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; openssl &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unzip &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkg-config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install brew tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/bin/bash -c &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ff7b72"&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span style="color:#ff7b72"&gt;)&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#39;# Set PATH, MANPATH, etc., for Homebrew.&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /home/paul/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#39;eval &amp;#34;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /home/paul/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ff7b72"&gt;$(&lt;/span&gt;/home/linuxbrew/.linuxbrew/bin/brew shellenv&lt;span style="color:#ff7b72"&gt;)&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install gcc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install hugo &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install hugo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install azure cli&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install dotnet6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install dotnet6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://go.dev/dl/go1.19.3.linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /usr/local/go &lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#34;export PATH=&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$PATH&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;:/usr/local/go/bin&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm go1.19.3.linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install kubectl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y ca-certificates curl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/kubernetes.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y kubectl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install docker desktop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#79c0ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#ff7b72"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#ff7b72"&gt;)&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#ff7b72"&gt;)&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt; stable&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://desktop.docker.com/linux/main/amd64/docker-desktop-4.13.1-amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y ./docker-desktop-4.13.1-amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm docker-desktop-4.13.1-amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install rancher desktop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -s https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | gpg --dearmor | sudo dd &lt;span style="color:#79c0ff"&gt;status&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;none &lt;span style="color:#79c0ff"&gt;of&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#39;deb [signed-by=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg] https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./&amp;#39;&lt;/span&gt; | sudo dd &lt;span style="color:#79c0ff"&gt;status&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;none &lt;span style="color:#79c0ff"&gt;of&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;/etc/apt/sources.list.d/isv-rancher-stable.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y rancher-desktop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install hashi tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com jammy main&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/hashicorp.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y terraform packer consul nomad vault waypoint
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export &lt;span style="color:#79c0ff"&gt;NVM_DIR&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$HOME&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/.nvm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt; -s &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$NVM_DIR&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/nvm.sh&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#79c0ff"&gt;\.&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$NVM_DIR&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/nvm.sh&amp;#34;&lt;/span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# This loads nvm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt; -s &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$NVM_DIR&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/bash_completion&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#79c0ff"&gt;\.&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$NVM_DIR&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/bash_completion&amp;#34;&lt;/span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# This loads nvm bash_completion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command -v nvm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nvm install &lt;span style="color:#a5d6ff"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install pulumi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://get.pulumi.com | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install rust and toolchains&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl --proto &lt;span style="color:#a5d6ff"&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; --tlsv1.2 -sSf https://sh.rustup.rs | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#34;source &lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$HOME&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/.cargo/env&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source &lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$HOME&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/.cargo/env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#34;PATH=&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$PATH&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;:&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;$HOME&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;/.cargo/bin&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install tools for building wasm apps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup install nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup component add rustfmt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup component add rustfmt --toolchain nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup component add clippy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup component add clippy --toolchain nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo install cargo-expand
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo install cargo-edit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo install cargo-generate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo install --git https://github.com/bytecodealliance/wit-bindgen wit-bindgen-cli --tag v0.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup target add wasm32-wasi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustup target add wasm32-unknown-unknown
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install rustwasm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install wasmtime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl https://wasmtime.dev/install.sh -sSf | bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# install snaps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install --classic code
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install spotify
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install postman
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install zoom-client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install sublime-text --classic
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install storage-explorer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install obs-studio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install discord
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install slack --classic
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install vlc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Rust for the Impatient</title><link>https://paulyu.dev/video/rust-for-the-impatient/</link><pubDate>Thu, 10 Nov 2022 19:34:46 -0800</pubDate><guid>https://paulyu.dev/video/rust-for-the-impatient/</guid><description>&lt;p&gt;An awesome video to quickly get up to speed on how to read Rust code. Be sure to give the video a 👍&lt;/p&gt;</description></item><item><title>Fixing a NodeJS Digital Envelope Routines Error</title><link>https://paulyu.dev/article/fixing-node-digital-envelope-routines-error/</link><pubDate>Tue, 08 Nov 2022 19:55:21 -0800</pubDate><guid>https://paulyu.dev/article/fixing-node-digital-envelope-routines-error/</guid><description>&lt;p&gt;In my journey to learn Rust, I&amp;rsquo;ve decided to pick up this book called &lt;a href="https://www.amazon.com/Practical-Rust-Web-Projects-Applications/dp/1484265882"&gt;&amp;ldquo;Practical Rust Web Projects&amp;rdquo; by Shing Lyu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the last chapter, you walk through an example of packaging a WebAssembly module using &lt;code&gt;wasm-pack&lt;/code&gt; and using the .wasm binary in a NodeJS application. On the step where I needed to compile the application, I ran into the following error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; create-wasm-app@0.1.0 build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; webpack --config webpack.config.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node:internal/crypto/hash:71
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this&lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;kHandle&lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; new _Hash&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;algorithm, xofLen&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: error:0308010C:digital envelope routines::unsupported
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at new Hash &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;node:internal/crypto/hash:71:19&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at Object.createHash &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;node:crypto:133:10&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at module.exports &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;/Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/webpack/lib/util/createHash.js:135:53&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at NormalModule._initBuildHash &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;/Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/webpack/lib/NormalModule.js:417:16&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at handleParseError &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;/Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/webpack/lib/NormalModule.js:471:10&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at /Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/webpack/lib/NormalModule.js:503:5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at /Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/webpack/lib/NormalModule.js:358:12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at /Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/loader-runner/lib/LoaderRunner.js:373:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at iterateNormalLoaders &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;/Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/loader-runner/lib/LoaderRunner.js:214:10&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at Array.&amp;lt;anonymous&amp;gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;/Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/loader-runner/lib/LoaderRunner.js:205:4&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at Storage.finished &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;/Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:43:16&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at /Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:79:9
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at /Users/paul/repos/Apress/practical-rust-web-projects/Ch06/hello-wasm/client/node_modules/graceful-fs/graceful-fs.js:78:16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at FSReqCallback.readFileAfterClose &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;as oncomplete&lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;node:internal/fs/read_file_context:68:3&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; opensslErrorStack: &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;error:03000086:digital envelope routines::initialization error&amp;#39;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; library: &lt;span style="color:#a5d6ff"&gt;&amp;#39;digital envelope routines&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reason: &lt;span style="color:#a5d6ff"&gt;&amp;#39;unsupported&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code: &lt;span style="color:#a5d6ff"&gt;&amp;#39;ERR_OSSL_EVP_UNSUPPORTED&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Node.js v18.7.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After a bit of Googling, I ran across someone suggesting to run the following command:&lt;/p&gt;</description></item><item><title>Deploying ARM64 workloads to AKS</title><link>https://paulyu.dev/article/arm64-on-aks/</link><pubDate>Wed, 02 Nov 2022 07:00:00 -0700</pubDate><guid>https://paulyu.dev/article/arm64-on-aks/</guid><description>&lt;p&gt;You might have heard by now that &lt;a href="https://azure.microsoft.com/blog/azure-virtual-machines-with-ampere-altra-arm-based-processors-generally-available/"&gt;Azure has partnered with Ampere&lt;/a&gt; to bring ARM-based processors for virtual machines on Azure. This is super exciting as it gives you an opportunity to deploy workloads on highly performant and power efficient virtual machines and these characteristics ultimately result in excellent price-performance (lower costs 🥳)&lt;/p&gt;
&lt;p&gt;So&amp;hellip; are you ready to deploy your workloads to ARM64 node pools on AKS? I sure wasn&amp;rsquo;t when attempting to deploy the &lt;a href="https://github.com/Azure-Samples/azure-voting-app-redis"&gt;azure-voting-app-redis&lt;/a&gt; application to my cluster.&lt;/p&gt;</description></item><item><title>Sharing Bicep Modules with Azure Container Registry</title><link>https://paulyu.dev/article/sharing-bicep-modules-with-azure-container-registry/</link><pubDate>Tue, 11 Oct 2022 07:00:00 -0700</pubDate><guid>https://paulyu.dev/article/sharing-bicep-modules-with-azure-container-registry/</guid><description>&lt;p&gt;One of the things I do as a Cloud Native Advocate at Microsoft is build end-to-end lab scenarios in the &lt;a href="https://aka.ms/oss-labs"&gt;https://aka.ms/oss-labs&lt;/a&gt; repo. Most of the demo scenarios we aim to cover is in and around the container space and a majority of the labs uses &lt;a href="https://learn.microsoft.com/azure/azure-resource-manager/bicep/overview?tabs=bicep"&gt;Azure Bicep&lt;/a&gt; to declaratively provision Azure infrastructure. As more labs get spun up, there is a potential for redundant Bicep code. You might have already guessed, there&amp;rsquo;s a need for re-usable code to spin up AKS clusters.&lt;/p&gt;</description></item><item><title>Autoscaling Azure Container Apps</title><link>https://paulyu.dev/article/azure-container-apps-autoscaling/</link><pubDate>Sun, 11 Sep 2022 06:00:00 -0700</pubDate><guid>https://paulyu.dev/article/azure-container-apps-autoscaling/</guid><description>&lt;h2 id="so-what-makes-azure-container-apps-serverless"&gt;So, what makes Azure Container Apps &amp;ldquo;serverless&amp;rdquo;?&lt;/h2&gt;
&lt;p&gt;Today we are going to focus on what makes Azure Container Apps (ACA) a &amp;ldquo;serverless&amp;rdquo; offering. But what does the term &amp;ldquo;&lt;em&gt;serverless&lt;/em&gt;&amp;rdquo; really mean? As much as we&amp;rsquo;d like to think there aren&amp;rsquo;t any servers involved, that is certainly not the case. In general, &amp;ldquo;serverless&amp;rdquo; means that most (if not all) server maintenance has been abstracted away from you.&lt;/p&gt;
&lt;p&gt;With serverless, you don&amp;rsquo;t spend any time managing and patching servers. This concern is offloaded to Azure and you simply focus on adding business value through application delivery. In addition to operational efficiency, cost efficiency can be achieved with serverless on-demand pricing models. Your workload horizontally scales out based on need and you only pay for what you use. To me, this is &lt;strong&gt;serverless&lt;/strong&gt;, and my teammate &lt;a href="https://github.com/smurawski"&gt;@StevenMurawski&lt;/a&gt; said it best&amp;hellip; &amp;ldquo;&lt;em&gt;being able to &lt;strong&gt;scale to zero&lt;/strong&gt; is what gives ACA it&amp;rsquo;s serverless magic&lt;/em&gt;.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Microservices Communications with Azure Container Apps</title><link>https://paulyu.dev/article/azure-container-apps-microservices-communication/</link><pubDate>Sat, 10 Sep 2022 06:00:00 -0700</pubDate><guid>https://paulyu.dev/article/azure-container-apps-microservices-communication/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In yesterday&amp;rsquo;s &lt;a href="https://azure.github.io/Cloud-Native/blog/08-containerapps-intro"&gt;#ServerlessSeptember&lt;/a&gt; post, we learned what the Azure Container Apps (ACA) service is and the problems it aims to solve. It is considered to be a Container-as-a-Service platform since much of the complex implementation details of running a Kubernetes cluster is managed for you.&lt;/p&gt;
&lt;p&gt;Some of the use cases for ACA include event-driven processing jobs and background tasks, but this article will focus on hosting microservices, and how they can communicate with each other within the ACA service. At the end of this article, you will have a solid understanding of how networking and communication is handled and will leave you with a few tutorials to try.&lt;/p&gt;</description></item><item><title>Monitoring Azure Container Apps With Azure Managed Grafana</title><link>https://paulyu.dev/article/monitoring-azure-container-apps-with-azure-managed-grafana/</link><pubDate>Fri, 09 Sep 2022 06:00:00 -0700</pubDate><guid>https://paulyu.dev/article/monitoring-azure-container-apps-with-azure-managed-grafana/</guid><description>&lt;p&gt;The Azure Monitor team has &lt;a href="https://azure.microsoft.com/blog/elevate-your-visualizations-with-azure-managed-grafana-now-generally-available/"&gt;announced the general availability of the Azure Managed Grafana (AMG) service&lt;/a&gt;. As part of the announcement, they also announced the availability of curated &lt;a href="https://grafana.com/orgs/azuremonitorteam/dashboards"&gt;Grafana dashboards&lt;/a&gt; for various Azure services including &lt;a href="https://grafana.com/grafana/dashboards/16592-azure-container-apps-container-app-view/"&gt;Azure Container Apps&lt;/a&gt; 🎉&lt;/p&gt;
&lt;p&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; is very popular within the Cloud Native community and it seems natural to use it for Azure Container Apps (ACA) observability.&lt;/p&gt;
&lt;p&gt;In this post, I will walk you through provisioning the ACA and AMG resources using the &lt;a href="https://registry.terraform.io/providers/Azure/azapi/latest/docs"&gt;Terraform AzAPI&lt;/a&gt; provider and show you how easy it is to import the ACA dashboards into your AMG instance.&lt;/p&gt;</description></item><item><title>Terraform: Azure Container Apps with Azure Managed Grafana using the AzAPI provider</title><link>https://paulyu.dev/code/terraform-aca-with-amg-using-azapi-provider/</link><pubDate>Fri, 09 Sep 2022 06:00:00 -0700</pubDate><guid>https://paulyu.dev/code/terraform-aca-with-amg-using-azapi-provider/</guid><description>&lt;p&gt;Code snippet for the &lt;a href="https://paulyu.dev/article/2022-09-07-monitoring-azure-container-apps-with-azure-managed-grafana/"&gt;Monitoring Azure Container Apps With Azure Managed Grafana&lt;/a&gt; article.&lt;/p&gt;
&lt;h2 id="maintf"&gt;&lt;code&gt;main.tf&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;terraform &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; required_providers &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;azurerm&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;hashicorp/azurerm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;version&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;&amp;gt;=3.0.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;azapi&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;azure/azapi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;version&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;&amp;gt;=0.5.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;provider &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; features &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resource_group &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;prevent_deletion_if_contains_resources&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key_vault &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;purge_soft_delete_on_destroy&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;random_pet&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;length&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;separator&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;random_integer&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;min&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;max&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;random_string&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;length&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;lower&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;upper&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;numeric&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;special&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;keepers&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# Generate a new random_string on every run to avoid a conflict with the previous revision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;none&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; timestamp&lt;span style="color:#ff7b72;font-weight:bold"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;locals &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;resource_name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; format&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;, random_pet.aca.id&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;resource_name_unique&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; format&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;%s%s&amp;#34;&lt;/span&gt;, random_pet.aca.id, random_integer.aca.result&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;location&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;eastus&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm_resource_group&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;rg-&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;${&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;local&lt;/span&gt;.resource_name&lt;span style="color:#a5d6ff"&gt;}&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;location&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; local.location
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm_log_analytics_workspace&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;law-&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;${&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;local&lt;/span&gt;.resource_name_unique&lt;span style="color:#a5d6ff"&gt;}&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;resource_group_name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;location&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.location
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;sku&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;PerGB2018&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;retention_in_days&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# https://docs.microsoft.com//azure/templates/microsoft.app/2022-03-01/managedenvironments?tabs=bicep&amp;amp;pivots=deployment-language-terraform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azapi_resource&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;env&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; type &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Microsoft.App/managedEnvironments@2022-03-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;env-&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;${&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;local&lt;/span&gt;.resource_name&lt;span style="color:#a5d6ff"&gt;}&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;parent_id&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;location&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.location
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;body&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; jsonencode&lt;span style="color:#ff7b72;font-weight:bold"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;properties&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;appLogsConfiguration&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;destination&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;log-analytics&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;logAnalyticsConfiguration&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;customerId&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_log_analytics_workspace.aca.workspace_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;sharedKey&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_log_analytics_workspace.aca.primary_shared_key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azapi_resource&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;helloworld&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; type &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Microsoft.App/containerApps@2022-03-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;helloworld&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;parent_id&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;location&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.location
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;body&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; jsonencode&lt;span style="color:#ff7b72;font-weight:bold"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;properties&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;managedEnvironmentId&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azapi_resource.env.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;configuration&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;ingress&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;allowInsecure&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;external&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;targetPort&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;traffic&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;label&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;latestRevision&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;weight&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;template&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;containers&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;helloworld&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;image&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;mcr.microsoft.com/azuredocs/containerapps-helloworld:latest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;resources&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;cpu&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; 0.5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;memory&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;1.0Gi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;revisionSuffix&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; random_string.aca.result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;scale&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;minReplicas&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;maxReplicas&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;rules&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;http-rule&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;http&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;metadata&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;concurrentRequests&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;100&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# this tells azapi to pull out properties and stuff into the output attribute for the object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;response_export_values&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;properties.configuration.ingress.fqdn&amp;#34;&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm_subscription&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm_client_config&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azapi_resource&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;amg&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; type &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Microsoft.Dashboard/grafana@2022-08-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;amg-&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;${&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;local&lt;/span&gt;.resource_name&lt;span style="color:#a5d6ff"&gt;}&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;parent_id&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;location&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azurerm_resource_group.aca.location
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; identity &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; type &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;SystemAssigned&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;body&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; jsonencode&lt;span style="color:#ff7b72;font-weight:bold"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;properties&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;apiKey&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;autoGeneratedDomainNameLabelScope&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;TenantReuse&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;deterministicOutboundIP&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;publicNetworkAccess&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;zoneRedundancy&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;sku&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Standard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# this tells azapi to pull out properties and stuff into the output attribute for the object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;response_export_values&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;identity.principalId&amp;#34;&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm_role_assignment&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;amg_reader&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;scope&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; data.azurerm_subscription.aca.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;role_definition_name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Monitoring Reader&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;principal_id&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; jsondecode&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;azapi_resource.amg.output&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;.identity.principalId
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;azurerm_role_assignment&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;amg_admin&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;scope&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; azapi_resource.amg.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;role_definition_name&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;Grafana Admin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;principal_id&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; data.azurerm_client_config.aca.object_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;output &lt;span style="color:#a5d6ff"&gt;&amp;#34;helloworld_ingress_url&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#79c0ff"&gt;value&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; format&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;%s%s&amp;#34;&lt;/span&gt;, &lt;span style="color:#a5d6ff"&gt;&amp;#34;https://&amp;#34;&lt;/span&gt;, jsondecode&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;azapi_resource.helloworld.output&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;.properties.configuration.ingress.fqdn&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# optional to automate the dashboard import process&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;resource &lt;span style="color:#a5d6ff"&gt;&amp;#34;null_resource&amp;#34;&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#34;aca&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; provisioner &lt;span style="color:#a5d6ff"&gt;&amp;#34;local-exec&amp;#34;&lt;/span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; command &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;lt;&amp;lt;-EOT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; az config set extension.use_dynamic_install=yes_without_prompt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; az grafana dashboard import -g ${azurerm_resource_group.aca.name} -n ${azapi_resource.amg.name} --definition 16592
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; EOT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="resource-references"&gt;Resource References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet"&gt;random_pet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/integer"&gt;random_integer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string"&gt;random_string&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group"&gt;azurerm_resource_group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/log_analytics_workspace"&gt;azurerm_log_analytics_workspace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/data-sources/subscription"&gt;azurerm_subscription&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/role_assignment"&gt;azurerm_role_assignment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.terraform.io/language/resources/provisioners/local-exec"&gt;local-exec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/azure/templates/microsoft.app/2022-03-01/managedenvironments?tabs=bicep&amp;amp;pivots=deployment-language-terraform"&gt;azapi_resource (Microsoft.App/managedEnvironments)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com//azure/templates/microsoft.app/2022-03-01/containerapps?tabs=bicep&amp;amp;pivots=deployment-language-terraform"&gt;azapi_resource (Microsoft.App/containerApps)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com//azure/templates/microsoft.dashboard/grafana?pivots=deployment-language-terraform"&gt;azapi_resource (Microsoft.Dashboard/grafana)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource"&gt;null_resource&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Securely connect to your Azure Linux Virtual Machine with Tailscale SSH</title><link>https://paulyu.dev/article/securely-connect-to-you-azure-linux-vm-using-tailscale/</link><pubDate>Fri, 12 Aug 2022 17:03:14 -0700</pubDate><guid>https://paulyu.dev/article/securely-connect-to-you-azure-linux-vm-using-tailscale/</guid><description>&lt;p&gt;Being on the Cloud Advocate team at Microsoft, we&amp;rsquo;re always looking to empower every developer to achieve more on Azure. One way of doing this is by bringing you hands-on content to deliver end-to-end scenarios using cloud-native and open source technologies.&lt;/p&gt;
&lt;p&gt;My colleague on the Cloud Native team, &lt;a href="https://twitter.com/as_w"&gt;Aaron Wislang&lt;/a&gt; has been cooking up a bunch of labs in our &lt;a href="https://aka.ms/oss-labs"&gt;Azure Open Source Labs&lt;/a&gt; repo and one area we&amp;rsquo;ve been collaborating on is within the Azure Linux VM space.&lt;/p&gt;</description></item><item><title>Exploring .NET WebAssembly with WASI</title><link>https://paulyu.dev/article/exploring-dotnet-wasm-with-wasi/</link><pubDate>Tue, 09 Aug 2022 20:10:43 -0700</pubDate><guid>https://paulyu.dev/article/exploring-dotnet-wasm-with-wasi/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;WebAssembly (Wasm) is something that the Cloud Native Advocacy team has been exploring. It has been around for a few years and has mostly been used within browser-based applications. There are many blog posts on what makes WebAssembly an ideal target for running applications (e.g., smaller footprint with &lt;em&gt;.wasm&lt;/em&gt; files compared to containers, code isolation, and sandboxing). My colleague &lt;a href="https://twitter.com/StevenMurawski"&gt;Steven Murawski&lt;/a&gt; wrote a blog series on getting started with hosting Wasm apps on an emerging PaaS platform called &lt;a href="https://github.com/deislabs/hippo"&gt;Hippo&lt;/a&gt; which is developed by folks at &lt;a href="https://twitter.com/fermyontech"&gt;Fermyon&lt;/a&gt;. In &lt;a href="https://dev.to/smurawski/getting-started-with-hippo-a-webassembly-paas-part-1-5470"&gt;Part 1&lt;/a&gt; of the series, he introduces topics and define some of the acronyms like &amp;ldquo;Wagi&amp;rdquo; and &amp;ldquo;WASI&amp;rdquo;. He also introduced a runtime called &lt;a href="https://wasmtime.dev/"&gt;Wasmtime&lt;/a&gt; which implements the WebAssembly System Interface (WASI) standard. This article will walk you through how Steven and I went about getting a .NET console app running as a Wasm app on the Wasmtime runtime in a &lt;a href="https://code.visualstudio.com/docs/remote/create-dev-container"&gt;Dev Container&lt;/a&gt;. The .NET console app produced in this article has also been contributed as a &lt;code&gt;csharp&lt;/code&gt; template in the &lt;a href="https://github.com/deislabs/yo-wasm"&gt;yo-wasm&lt;/a&gt; repo which is also maintained by Fermyon; so you can quickly test it out for yourself later.&lt;/p&gt;</description></item><item><title>Extending Visual Studio Code Dev Container Features</title><link>https://paulyu.dev/article/extending-vscode-devcontainer-features/</link><pubDate>Wed, 27 Jul 2022 11:32:10 -0700</pubDate><guid>https://paulyu.dev/article/extending-vscode-devcontainer-features/</guid><description>&lt;blockquote&gt;
&lt;p&gt;UPDATE: The &lt;a href="https://github.com/microsoft/dev-container-features-template"&gt;dev-container-features-template&lt;/a&gt; repo referenced in this post has been archived. Please see my new post &lt;a href="https://paulyu.dev/article/revisiting-devcontainer-features"&gt;here&lt;/a&gt; or visit &lt;a href="https://containers.dev"&gt;containers.dev&lt;/a&gt; for the latest on this topic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Have you ever wanted to try an Azure CLI extension without having to install the extension yourself on your local machine? VSCode Dev Containers may be a good option.&lt;/p&gt;
&lt;h2 id="what-is-a-dev-container"&gt;What is a Dev Container?&lt;/h2&gt;
&lt;p&gt;Visual Studio Code has an extension called &lt;a href="https://code.visualstudio.com/docs/remote/containers"&gt;Remote - Containers&lt;/a&gt;. This extension lets you use a Docker container as a development environment and is the technology that powers &lt;a href="https://docs.github.com/en/codespaces/overview"&gt;GitHub Codespaces&lt;/a&gt;. If you don&amp;rsquo;t have the option to use Codespaces, the remote container technology also allows you to open build/open the container within your local environment as long as you have &lt;a href="https://www.docker.com/products/docker-desktop/"&gt;Docker Desktop&lt;/a&gt;,or &lt;a href="https://rancherdesktop.io/"&gt;Rancher Desktop&lt;/a&gt; (with &lt;code&gt;dockerd&lt;/code&gt; as the container runtime since &lt;code&gt;containerd&lt;/code&gt; will not work with remote containers), or &lt;a href="https://docs.docker.com/engine/install/#server"&gt;Docker Engine&lt;/a&gt; running on your local machine.&lt;/p&gt;</description></item><item><title>Azure AD B2C logouts and redirection URLs</title><link>https://paulyu.dev/article/azure-ad-b2c-logouts-and-redirection-urls/</link><pubDate>Sat, 18 Jun 2022 13:34:22 -0700</pubDate><guid>https://paulyu.dev/article/azure-ad-b2c-logouts-and-redirection-urls/</guid><description>&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been helping a client build a customer-facing NodeJS web application which leveraged Azure AD B2C as its identity provider. Things were going well with the development and Azure AD B2C served them really well. It&amp;rsquo;s cost-effective and gives them all the controls and security features they&amp;rsquo;ve come to expect with Azure AD (the non-B2C version). As any responsible company, they run penetration tests on the application prior to releasing to production and they identified one item that can pose as a security threat.&lt;/p&gt;</description></item><item><title>Run Terraform With Azure Pipelines</title><link>https://paulyu.dev/article/run-terraform-with-azure-pipelines/</link><pubDate>Fri, 25 Feb 2022 17:56:18 -0700</pubDate><guid>https://paulyu.dev/article/run-terraform-with-azure-pipelines/</guid><description>&lt;p&gt;This repo will walk you through an approach to provisioning Azure resources using Terraform code stored in a Git repo and leverage Azure Pipelines (YAML-based) to deploy to &lt;strong&gt;dev&lt;/strong&gt;, &lt;strong&gt;test&lt;/strong&gt;, and &lt;strong&gt;prod&lt;/strong&gt; environments (all in different subscriptions) with approval gates in front of &lt;strong&gt;test&lt;/strong&gt; and &lt;strong&gt;prod&lt;/strong&gt; environments.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;h3 id="azure-subscription"&gt;Azure Subscription&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;If you don&amp;rsquo;t have Azure, go sign up for a &lt;a href="https://azure.com/free"&gt;free account&lt;/a&gt; and come back.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="azure-devops"&gt;Azure DevOps&lt;/h3&gt;
&lt;p&gt;If you do not already have an Azure DevOps organization, follow &lt;a href="https://docs.microsoft.com/azure/devops/organizations/accounts/create-organization?view=azure-devops"&gt;these instructions&lt;/a&gt; to create one.&lt;/p&gt;</description></item><item><title>Run Your Pipelines in Azure Container Instance</title><link>https://paulyu.dev/article/run-your-pipelines-in-azure-container-instance/</link><pubDate>Fri, 16 Jul 2021 17:46:10 -0700</pubDate><guid>https://paulyu.dev/article/run-your-pipelines-in-azure-container-instance/</guid><description>&lt;h3 id="background"&gt;Background&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft-hosted Azure Pipeline agent run in the public space; therefore, they can only deploy to environments that are publicly accessible.&lt;/li&gt;
&lt;li&gt;Some organizations may need to deploy to target environments that are only accessible within private space (e.g., inside a Azure Virtual Network).&lt;/li&gt;
&lt;li&gt;When the target environment is not publicly accessible, deploying self-hosted pipelines agents are a common solution.&lt;/li&gt;
&lt;li&gt;Organizations can self-host Azure Pipeline agents on &lt;a href="https://docs.microsoft.com/azure/devops/pipelines/agents/v2-linux?view=azure-devops"&gt;Linux&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/azure/devops/pipelines/agents/v2-osx?view=azure-devops"&gt;macOS&lt;/a&gt;, or &lt;a href="https://docs.microsoft.com/azure/devops/pipelines/agents/v2-windows?view=azure-devops"&gt;Windows&lt;/a&gt; (physical or virtual machines) or &lt;a href="https://docs.microsoft.com/azure/devops/pipelines/agents/scale-set-agents?view=azure-devops"&gt;Azure Virtual Machine Scale Sets&lt;/a&gt;; however, this may introduce unwanted overhead in having to patch and maintain these machines.&lt;/li&gt;
&lt;li&gt;The alternative is to run an agent in a Docker container and host it in Azure Container Instance which can run inside of the organization&amp;rsquo;s virtual network and we&amp;rsquo;ll explore this option for the rest of this guide.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="architecture"&gt;Architecture&lt;/h3&gt;
&lt;p&gt;
&lt;a href="https://paulyudev.blob.core.windows.net/articles/2021/run-your-pipelines-in-aci/architecture.png" data-dimbox data-dimbox-caption="ACI-Pipelines-Architecture"&gt;
&lt;img alt="ACI-Pipelines-Architecture" src="https://paulyudev.blob.core.windows.net/articles/2021/run-your-pipelines-in-aci/architecture.png"/&gt;
&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Validating Azure AD B2C Tokens</title><link>https://paulyu.dev/article/validating-azure-ad-b2c-tokens/</link><pubDate>Mon, 31 May 2021 23:01:10 -0700</pubDate><guid>https://paulyu.dev/article/validating-azure-ad-b2c-tokens/</guid><description>&lt;p&gt;I recently ran into an issue where I needed to help a customer validate an Azure AD B2C JWT access token. We tend to take JWT tokens for granted and sometimes forget that they should be validated by the application. I thought this was going to be pretty straight-forward to solve since Azure AD B2C is effectively Azure AD under the hood. I was wrong.&lt;/p&gt;
&lt;p&gt;I initially thought browsing to the OIDC metadata endpoint would reveal the info I needed to validate the signature of the JWT but finding the endpoint was my first challenge.&lt;/p&gt;</description></item><item><title>Getting Started With Terraform on Azure</title><link>https://paulyu.dev/article/getting-started-with-terraform-on-azure/</link><pubDate>Sat, 24 Apr 2021 17:40:17 -0700</pubDate><guid>https://paulyu.dev/article/getting-started-with-terraform-on-azure/</guid><description>&lt;p&gt;Check out the official &lt;strong&gt;Get Started - Azure&lt;/strong&gt; tutorial &lt;a href="https://learn.hashicorp.com/collections/terraform/azure-get-started"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="terraform-basics"&gt;Terraform basics&lt;/h2&gt;
&lt;h3 id="download-and-install"&gt;Download and Install&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Download terraform from &lt;a href="https://www.terraform.io/downloads.html"&gt;https://www.terraform.io/downloads.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extract the executable and add the folder to your PATH variable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open a shell and type &lt;code&gt;terraform version&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The basic commands we&amp;rsquo;ll use are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform plan&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I advise you to use the &lt;code&gt;terraform fmt&lt;/code&gt; command often to ensure your scripts well formatted according to HashiCorp&amp;rsquo;s &lt;a href="https://www.terraform.io/docs/configuration/style.html"&gt;style conventions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="folder-structure"&gt;Folder structure&lt;/h3&gt;
&lt;p&gt;Terrafrom executes on the files within a folder that are named with the &lt;code&gt;.tf&lt;/code&gt; extension. Here is what a typical folder structure looks like:&lt;/p&gt;</description></item></channel></rss>