Sorry

This feed does not validate.

In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://blog.scottlowe.org/feed.xml

  1. <?xml version="1.0" encoding="utf-8" standalone="yes"?>
  2. <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  3.  <channel>
  4.    <title>Scott&#39;s Weblog </title>
  5.    <link>https://blog.scottlowe.org/</link>
  6.    <language>en-us</language>
  7.    <author>Scott Lowe</author>
  8.    <rights>(C) 2024</rights>
  9.    <updated>2024-05-17 09:00:00 -0600 MDT</updated>
  10.  
  11.    
  12.      <item>
  13.        <title>Technology Short Take 177</title>
  14.        <link>https://blog.scottlowe.org/2024/05/17/technology-short-take-177/</link>
  15.        <pubDate>Fri, 17 May 2024 09:00:00 MDT</pubDate>
  16.        <author>Scott Lowe</author>
  17.        <guid>https://blog.scottlowe.org/2024/05/17/technology-short-take-177/</guid>
  18.        <description>&lt;p&gt;Welcome to Technology Short Take #177! Wow, is it the middle of May already? The year seems to be flying by&amp;mdash;much in the same way that all these technical articles keep flying by my Inbox, occasionally getting caught and included here! In this Technology Short Take, I have links on things ranging from physical network designs to running retro operating systems as virtual machines. Surely there will be something useful in here for you!&lt;/p&gt;
  19. &lt;h2 id=&#34;networking&#34;&gt;Networking&lt;/h2&gt;
  20. &lt;ul&gt;
  21. &lt;li&gt;Blogger Evert has a two part series (&lt;a href=&#34;https://www.amcom.io/posts/managing-nsx-alb-with-terraform-part-1/&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;https://www.amcom.io/posts/managing-nsx-alb-with-terraform-part-2&#34;&gt;here&lt;/a&gt;) on managing NSX ALBs with Terraform.&lt;/li&gt;
  22. &lt;li&gt;Ivan launches a series of blog posts exploring routing protocol designs that can be used to implement EVPN-with-VXLAN L2VPNs in a leaf-and-spine fabric. The first one is &lt;a href=&#34;https://blog.ipspace.net/2024/04/evpn-designs-vxlan-leaf-spine-fabric.html&#34;&gt;here&lt;/a&gt;. What&amp;rsquo;s really cool is that Ivan also includes a &lt;code&gt;netlab&lt;/code&gt; topology readers can use to create a lab and see how it works.&lt;/li&gt;
  23. &lt;li&gt;Eduard Tolosa discusses &lt;a href=&#34;https://blog.nspawn.org/posts/wireless-adapters-on-systemd-nspawn-containers/&#34;&gt;binding wireless network adapters to &lt;code&gt;systemd-nspawn&lt;/code&gt; containers&lt;/a&gt;.&lt;/li&gt;
  24. &lt;li&gt;Ioannis Theodoridis has a three-part series on how he and his team used tools like Nautobot, Nornir, and Python to help with some extensive network migrations. Check out the series (&lt;a href=&#34;https://www.mythryll.com/?p=1976&#34;&gt;part 1&lt;/a&gt;, &lt;a href=&#34;https://www.mythryll.com/?p=2237&#34;&gt;part 2&lt;/a&gt;, and &lt;a href=&#34;https://www.mythryll.com/?p=2238&#34;&gt;part 3&lt;/a&gt;); I think you&amp;rsquo;ll find some useful information in there.&lt;/li&gt;
  25. &lt;/ul&gt;
  26. &lt;h2 id=&#34;servershardware&#34;&gt;Servers/Hardware&lt;/h2&gt;
  27. &lt;ul&gt;
  28. &lt;li&gt;While in many respects Apple&amp;rsquo;s M series CPUs are amazing, all is not perfect: security researchers have discovered a flaw that would allow attackers to steal cryptographic keys. More details are available in &lt;a href=&#34;https://www.zetter-zeroday.com/apple-chips/&#34;&gt;this Zero Day article&lt;/a&gt;.&lt;/li&gt;
  29. &lt;/ul&gt;
  30. &lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;
  31. &lt;ul&gt;
  32. &lt;li&gt;Rory McCune explores &lt;a href=&#34;https://raesene.github.io/blog/2024/03/24/Using-Tailscale-for-persistence/&#34;&gt;using Tailscale for getting persistence&lt;/a&gt; in a compromised Kubernetes cluster.&lt;/li&gt;
  33. &lt;li&gt;The Cisco Talos team is warning of &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/cisco-warns-of-large-scale-brute-force-attacks-against-vpn-services/&#34;&gt;large-scale brute force attacks against VPN and SSH services&lt;/a&gt; on a variety of devices (including Cisco, CheckPoint, Fortinet, SonicWall, and Ubiquiti).&lt;/li&gt;
  34. &lt;/ul&gt;
  35. &lt;h2 id=&#34;cloud-computingcloud-management&#34;&gt;Cloud Computing/Cloud Management&lt;/h2&gt;
  36. &lt;ul&gt;
  37. &lt;li&gt;Open Policy Agent (OPA) is approaching their 1.0 release, and they&amp;rsquo;ve already started &lt;a href=&#34;https://blog.openpolicyagent.org/opa-1-0-is-coming-heres-what-you-need-to-know-c8fb0d258368&#34;&gt;discussing what users can do today to prepare for the big release&lt;/a&gt;. I must say I appreciate the OPA team&amp;rsquo;s efforts in making the transition to 1.0 as smooth and seamless as possible.&lt;/li&gt;
  38. &lt;li&gt;A colleague shared this article on &lt;a href=&#34;https://www.numeratorengineering.com/requests-are-all-you-need-cpu-limits-and-throttling-in-kubernetes/&#34;&gt;CPU limits and throttling in Kubernetes&lt;/a&gt;.&lt;/li&gt;
  39. &lt;li&gt;Anton Weiss of PerfectScale explores &lt;a href=&#34;https://www.perfectscale.io/blog/cgroups-and-memoryqos-w-bottlerocket&#34;&gt;memory QoS with EKS and Bottlerocket&lt;/a&gt;.&lt;/li&gt;
  40. &lt;li&gt;Brian Grant explores the question of &lt;a href=&#34;https://medium.com/@briankgrant/is-gitops-actually-useful-a1c851ba99d8&#34;&gt;whether GitOps is actually useful&lt;/a&gt;.&lt;/li&gt;
  41. &lt;li&gt;Via &lt;a href=&#34;https://www.docker.com/blog/pulumi-and-docker-build-cloud/&#34;&gt;this blog post on the Docker web site&lt;/a&gt;, Diana Esteves of Pulumi shares how to use the new Docker Build provider to automate image builds. It also looks like the Pulumi team has added &lt;a href=&#34;https://github.com/pulumi/examples/tree/master/dockerbuildcloud-ts&#34;&gt;a Docker Build example&lt;/a&gt; to their &amp;ldquo;examples&amp;rdquo; repository. C&amp;rsquo;mon, Pulumi team&amp;mdash;show us more than just TypeScript!&lt;/li&gt;
  42. &lt;/ul&gt;
  43. &lt;h2 id=&#34;operating-systemsapplications&#34;&gt;Operating Systems/Applications&lt;/h2&gt;
  44. &lt;ul&gt;
  45. &lt;li&gt;Julia Evans digs into &lt;a href=&#34;https://jvns.ca/blog/2024/03/22/the-current-branch-in-git/&#34;&gt;what &amp;ldquo;current branch&amp;rdquo; means in Git&lt;/a&gt;.&lt;/li&gt;
  46. &lt;li&gt;Nikhil shares &lt;a href=&#34;https://www.unsungnovelty.org/posts/01/2024/a-linux-distro-recommendation-framework-and-my-picks-for-2024/&#34;&gt;a framework for selecting a Linux distribution&lt;/a&gt;.&lt;/li&gt;
  47. &lt;li&gt;José Ignacio Amelivia Santiago takes readers on &lt;a href=&#34;https://namelivia.com/i-switched-to-a-framework-amd-13/&#34;&gt;a detailed walkthrough&lt;/a&gt; of setting up Arch Linux on a new Framework 13 AMD-based laptop.&lt;/li&gt;
  48. &lt;li&gt;Here&amp;rsquo;s &lt;a href=&#34;https://www.brendangregg.com/blog/2024-03-24/linux-crisis-tools.html&#34;&gt;a list of &amp;ldquo;crisis tools&amp;rdquo;&lt;/a&gt; recommended to install on your Linux servers &lt;em&gt;before&lt;/em&gt; you need them.&lt;/li&gt;
  49. &lt;li&gt;Only one word applies &lt;a href=&#34;https://thehftguy.com/2023/11/14/the-linux-kernel-has-been-accidentally-hardcoded-to-a-maximum-of-8-cores-for-nearly-20-years/&#34;&gt;here&lt;/a&gt;: oops.&lt;/li&gt;
  50. &lt;li&gt;I found &lt;a href=&#34;https://difftastic.wilfred.me.uk/&#34;&gt;this tool&lt;/a&gt; in the last couple of weeks, and it is so absolutely useful (to me, anyway).&lt;/li&gt;
  51. &lt;li&gt;Envoy Gateway has officially released version 1.0.0, marking GA for the project. More details are available in &lt;a href=&#34;https://gateway.envoyproxy.io/announcements/v1.0/&#34;&gt;this announcement&lt;/a&gt;.&lt;/li&gt;
  52. &lt;/ul&gt;
  53. &lt;h2 id=&#34;programmingdevelopment&#34;&gt;Programming/Development&lt;/h2&gt;
  54. &lt;ul&gt;
  55. &lt;li&gt;This is a fantastic article by Jeremiah Lee &lt;a href=&#34;https://www.jeremiahlee.com/posts/failed-squad-goals/&#34;&gt;about Spotify&amp;rsquo;s failed &amp;ldquo;squad model&amp;rdquo;&lt;/a&gt; and some of the key lessons folks can learn.&lt;/li&gt;
  56. &lt;/ul&gt;
  57. &lt;h2 id=&#34;storage&#34;&gt;Storage&lt;/h2&gt;
  58. &lt;ul&gt;
  59. &lt;li&gt;Steven Sklar explains &lt;a href=&#34;https://sklar.rocks/how-container-storage-interface-works/&#34;&gt;how CSI (Container Storage Interface) works&lt;/a&gt;.&lt;/li&gt;
  60. &lt;/ul&gt;
  61. &lt;h2 id=&#34;virtualization&#34;&gt;Virtualization&lt;/h2&gt;
  62. &lt;ul&gt;
  63. &lt;li&gt;Talk about a blast from the past! William Lam &lt;a href=&#34;https://williamlam.com/2024/03/pre-release-microsoft-os-2-2-0-on-esxi.html&#34;&gt;discusses&lt;/a&gt; running a prerelease version of OS/2 2.0&amp;mdash;an operating system I myself ran in the mid-1990s before switching to Windows NT&amp;mdash;as a virtual machine on VMware ESXi. For what it&amp;rsquo;s worth, I remain convinced that OS/2 version 2 was technologically superior to its Windows peers (including Windows NT). It&amp;rsquo;s another example of when the best technology doesn&amp;rsquo;t always win.&lt;/li&gt;
  64. &lt;/ul&gt;
  65. &lt;h2 id=&#34;careersoft-skills&#34;&gt;Career/Soft Skills&lt;/h2&gt;
  66. &lt;ul&gt;
  67. &lt;li&gt;If you&amp;rsquo;re looking for a list of skills that are valuable for a DevOps engineer/SRE/platform engineer to know, look no further than &lt;a href=&#34;https://nickjanetakis.com/blog/120-skills-i-use-in-an-sre-platform-devops-developer-position&#34;&gt;this comprehensive list from Nick Janetakis&lt;/a&gt;.&lt;/li&gt;
  68. &lt;/ul&gt;
  69. &lt;p&gt;OK, that&amp;rsquo;s all for this time around. Did you like this post, or another post on the site? Or maybe you have a question? Feel free to reach out! I always enjoy hearing from readers, so I invite you to find me &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, or in one of the various Slack communities I frequent. (You can drop me an e-mail, if you&amp;rsquo;d prefer&amp;mdash;my address isn&amp;rsquo;t too hard to find.) Thanks for reading!&lt;/p&gt;</description>
  70.      </item>
  71.    
  72.      <item>
  73.        <title>Tracking EC2 Instances used by EKS with AWS CLI</title>
  74.        <link>https://blog.scottlowe.org/2024/04/17/tracking-ec2-instances-used-by-eks-with-aws-cli/</link>
  75.        <pubDate>Wed, 17 Apr 2024 10:00:00 MDT</pubDate>
  76.        <author>Scott Lowe</author>
  77.        <guid>https://blog.scottlowe.org/2024/04/17/tracking-ec2-instances-used-by-eks-with-aws-cli/</guid>
  78.        <description>&lt;p&gt;As a sort of follow-up to my previous post on using the AWS CLI to track the specific Elastic Network Interfaces (ENIs) used by Amazon Elastic Kubernetes Service (EKS) cluster nodes, this post focuses on the EC2 instances themselves. I feel this is less of a &amp;ldquo;problem&amp;rdquo; than tracking ENIs, but I wanted to share this information nevertheless. In this post, I&amp;rsquo;ll show you which AWS CLI command to use to list all the EC2 instances associated with a particular EKS cluster.&lt;/p&gt;
  79. &lt;p&gt;If you read &lt;a href=&#34;https://blog.scottlowe.org/2024/04/15/tracking-enis-used-by-eks-with-aws-cli/&#34;&gt;the previous post on tracking ENIs used by EKS&lt;/a&gt;, you might think that you could use a very similar AWS CLI command (&lt;code&gt;aws ec2 describe-instances&lt;/code&gt; instead of &lt;code&gt;aws ec2 describe-network-interfaces&lt;/code&gt;) to track the EC2 instances in a cluster&amp;mdash;and you&amp;rsquo;d be &lt;em&gt;mostly correct.&lt;/em&gt; Like the ENIs, &lt;a href=&#34;https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html&#34;&gt;EKS&lt;/a&gt; does add a cluster-specific tag to all EC2 instances in the cluster. However, just to make life interesting, the tag used for EC2 instances is not the same as the tag used for ENIs. (If someone at AWS knows of a technical reason why these tags are different, I&amp;rsquo;d love to hear it.)&lt;/p&gt;
  80. &lt;p&gt;Instead of using the &lt;code&gt;cluster.k8s.amazonaws.com/name&lt;/code&gt; tag that is used on the ENIs, you&amp;rsquo;ll need to use the &lt;code&gt;aws:eks:cluster-name&lt;/code&gt; tag instead, like this:&lt;/p&gt;
  81. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aws ec2 describe-instances --filters Name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tag:aws:eks:cluster-name,&lt;span style=&#34;color:#ae81ff&#34;&gt;\
  82. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;Values&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;name-of-cluster&amp;gt;
  83. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just replace &lt;code&gt;&amp;lt;name-of-cluster&amp;gt;&lt;/code&gt; in the above command with the name of your EKS cluster, and you&amp;rsquo;re good to go. As I mentioned in the previous post, if you&amp;rsquo;re using an automation tool such as &lt;a href=&#34;https://www.pulumi.com/&#34;&gt;Pulumi&lt;/a&gt; or &lt;a href=&#34;https://www.terraform.io/&#34;&gt;Terraform&lt;/a&gt;, you may need to explicitly specify the name of the cluster in your code (or look it up after the cluster is created).&lt;/p&gt;
  84. &lt;p&gt;I hope this information is useful to folks. If you have questions (or corrections, in the event I have something incorrect here!), please feel free to reach out. You can find me &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, on &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;the Fediverse&lt;/a&gt;, or in a number of different Slack communities. Thanks for reading!&lt;/p&gt;</description>
  85.      </item>
  86.    
  87.      <item>
  88.        <title>Tracking ENIs used by EKS with AWS CLI</title>
  89.        <link>https://blog.scottlowe.org/2024/04/15/tracking-enis-used-by-eks-with-aws-cli/</link>
  90.        <pubDate>Mon, 15 Apr 2024 12:30:00 MDT</pubDate>
  91.        <author>Scott Lowe</author>
  92.        <guid>https://blog.scottlowe.org/2024/04/15/tracking-enis-used-by-eks-with-aws-cli/</guid>
  93.        <description>&lt;p&gt;I&amp;rsquo;ve recently been spinning up lots of Amazon Elastic Kubernetes Service (EKS) clusters (using Pulumi, of course) in order to test various Cilium configurations. Along the way, I&amp;rsquo;ve wanted to verify the association and configuration of Elastic Network Interfaces (ENIs) being used by the EKS cluster. In this post, I&amp;rsquo;ll share a couple of AWS CLI commands that will help you track the ENIs used by an EKS cluster.&lt;/p&gt;
  94. &lt;p&gt;When I first set out to find the easiest way to track the ENIs used by the nodes in an &lt;a href=&#34;https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html&#34;&gt;EKS&lt;/a&gt; cluster, I thought that AWS resource tags might be the key. I was right&amp;mdash;but not in the way I expected. In the &lt;a href=&#34;https://www.pulumi.com/&#34;&gt;Pulumi&lt;/a&gt; program (written in &lt;a href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;) that I use to create EKS clusters, I made sure to tag all the resources.&lt;/p&gt;
  95. &lt;p&gt;For example, when defining the EKS cluster itself I assigned tags:&lt;/p&gt;
  96. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;eksCluster&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eks&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewCluster&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eks-cluster&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;eks&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ClusterArgs&lt;/span&gt;{
  97. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:    &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s-test&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;regionNames&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;awsRegion&lt;/span&gt;]),
  98. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Some code omitted here for brevity
  99. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Tags&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringMap&lt;/span&gt;{
  100. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s-test&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;regionNames&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;awsRegion&lt;/span&gt;]),
  101. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ownerTag&lt;/span&gt;),
  102. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;team&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;teamTag&lt;/span&gt;),
  103. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;usage&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;usageTag&lt;/span&gt;),
  104. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;expiry&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2025-01-01&amp;#34;&lt;/span&gt;),
  105. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
  106. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
  107. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And I assigned tags again when defining the node group for the EKS cluster:&lt;/p&gt;
  108. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;eks&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewNodeGroup&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;node-group&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;eks&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NodeGroupArgs&lt;/span&gt;{
  109. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;ClusterName&lt;/span&gt;:   &lt;span style=&#34;color:#a6e22e&#34;&gt;eksCluster&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;,
  110. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Some code omitted here for brevity
  111. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Tags&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringMap&lt;/span&gt;{
  112. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s-nodegroup-01&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;regionNames&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;awsRegion&lt;/span&gt;]),
  113. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ownerTag&lt;/span&gt;),
  114. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;team&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;teamTag&lt;/span&gt;),
  115. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;usage&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;usageTag&lt;/span&gt;),
  116. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;expiry&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2025-01-01&amp;#34;&lt;/span&gt;),
  117. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
  118. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
  119. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I &lt;em&gt;thought&lt;/em&gt; that these tags would carry over to the ENIs attached to the EC2 instances in the node group. Assuming the value of &lt;code&gt;ownerTag&lt;/code&gt; was set to &amp;ldquo;slowe&amp;rdquo;, it would be possible to see all the ENIs with this command:&lt;/p&gt;
  120. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aws ec2 describe-network-interfaces --filters Name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tag:owner,Values&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;slowe
  121. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alas, these tags don&amp;rsquo;t carry over (not that I&amp;rsquo;ve observed, anyway). However, all is not lost! EKS creates its own tag you can use with the &lt;code&gt;describe-network-interfaces&lt;/code&gt; command:&lt;/p&gt;
  122. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aws ec2 describe-network-interfaces &lt;span style=&#34;color:#ae81ff&#34;&gt;\
  123. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--filters Name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tag:cluster.k8s.amazonaws.com/name,Values&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;cluster-name
  124. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;cluster.k8s.amazonaws.com/name&lt;/code&gt; tag is automatically added to ENIs created for use by EKS; you just need to supply the correct value (to replace &lt;code&gt;cluster-name&lt;/code&gt; in the above command). If you&amp;rsquo;re using an automation tool like Pulumi or Terraform, you&amp;rsquo;ll want to be sure you know what the EKS cluster name is; you can assign it, as I did in the code above, or you can look it up.&lt;/p&gt;
  125. &lt;p&gt;While I didn&amp;rsquo;t share anything amazingly unique or earth-shattering here, I do hope that this post is helpful to folks. Feel free to find me on various social media platforms&amp;mdash;such as &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt; or &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;&amp;mdash;if you have questions or comments about this post. Constructive feedback is always welcome!&lt;/p&gt;</description>
  126.      </item>
  127.    
  128.      <item>
  129.        <title>Technology Short Take 176</title>
  130.        <link>https://blog.scottlowe.org/2024/03/15/technology-short-take-176/</link>
  131.        <pubDate>Fri, 15 Mar 2024 09:00:00 MDT</pubDate>
  132.        <author>Scott Lowe</author>
  133.        <guid>https://blog.scottlowe.org/2024/03/15/technology-short-take-176/</guid>
  134.        <description>&lt;p&gt;Welcome to Technology Short Take #176! This Tech Short Take is a bit heavy on security-related links, but there&amp;rsquo;s still some additional content in a number of other areas, so you should be able to find something useful&amp;mdash;or at least interesting&amp;mdash;in here. Thanks for reading!&lt;/p&gt;
  135. &lt;h2 id=&#34;networking&#34;&gt;Networking&lt;/h2&gt;
  136. &lt;ul&gt;
  137. &lt;li&gt;Lee Briggs (formerly of Pulumi, now with Tailscale) shows &lt;a href=&#34;https://leebriggs.co.uk/blog/2024/02/26/cheap-kubernetes-loadbalancers&#34;&gt;how to use the Tailscale Operator to create &amp;ldquo;free&amp;rdquo; Kubernetes load balancers&lt;/a&gt; (&amp;ldquo;free&amp;rdquo; as in no additional charge above and beyond what it would normally cost to operate a Kubernetes cluster).&lt;/li&gt;
  138. &lt;li&gt;Ivan Pepelnjak dives deep on &lt;a href=&#34;https://blog.ipspace.net/2024/02/dhcp-relaying-linux-host.html&#34;&gt;DHCP relaying on a Linux host&lt;/a&gt;.&lt;/li&gt;
  139. &lt;li&gt;I also enjoyed Ivan&amp;rsquo;s &lt;a href=&#34;https://blog.ipspace.net/2024/02/undo-network-automation.html&#34;&gt;realistic take&lt;/a&gt; on rollbacks in a network automation environment. (TL;DR: It&amp;rsquo;s not as easy as it might seem.)&lt;/li&gt;
  140. &lt;/ul&gt;
  141. &lt;h2 id=&#34;servershardware&#34;&gt;Servers/Hardware&lt;/h2&gt;
  142. &lt;ul&gt;
  143. &lt;li&gt;Menno Finlay-Smits shares information on &lt;a href=&#34;https://menno.io/posts/intel-nuc-fan-noise/&#34;&gt;reducing fan noise on Intel NUCs&lt;/a&gt;.&lt;/li&gt;
  144. &lt;li&gt;Rob McBryde shares his story of &lt;a href=&#34;https://robmcbryde.com/reviving-a-2012-macbook-pro-with-linux/&#34;&gt;reviving a 2012 MacBook Pro with Linux&lt;/a&gt;.&lt;/li&gt;
  145. &lt;li&gt;Kevin Houston &lt;a href=&#34;https://bladesmadesimple.com/2024/02/first-look-at-ciscos-amd-blade-server/&#34;&gt;previews the first AMD-powered Cisco UCS blade server&lt;/a&gt;.&lt;/li&gt;
  146. &lt;/ul&gt;
  147. &lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;
  148. &lt;ul&gt;
  149. &lt;li&gt;In early February a vulnerability was uncovered in a key component of the Linux boot process. The vulnerability affects virtually all Linux distributions and allows attackers to bypass the secure boot protections and insert a low-level bootkit. While the requirements for exploiting the vulnerability are not insurmountable, they do require a certain level of effort. More details available &lt;a href=&#34;https://arstechnica.com/security/2024/02/critical-vulnerability-affecting-most-linux-distros-allows-for-bootkits/&#34;&gt;via Ars Technica&lt;/a&gt; and &lt;a href=&#34;https://www.zdnet.com/article/shim-vulnerability-exposes-most-linux-systems-to-attack/&#34;&gt;via ZDnet&lt;/a&gt;.&lt;/li&gt;
  150. &lt;li&gt;Nick Frichette shares &lt;a href=&#34;https://hackingthe.cloud/aws/avoiding-detection/guardduty-tor-client/&#34;&gt;how to bypass GuardDuty Tor client findings&lt;/a&gt; (basically, how to connect to Tor without GuardDuty detecting it).&lt;/li&gt;
  151. &lt;li&gt;The Sysdig Threat Research Team uncovered the malicious use of a network mapping tool called SSH-Snake. Read more about it &lt;a href=&#34;https://sysdig.com/blog/ssh-snake/&#34;&gt;in this post&lt;/a&gt;.&lt;/li&gt;
  152. &lt;li&gt;VMware is patching a set of severe &amp;ldquo;sandbox escape&amp;rdquo; bugs. Two of the vulnerabilities are rated a 9.3 out of 10, and even VMware&amp;rsquo;s flagship ESXi hypervisor is affected. More details are &lt;a href=&#34;https://arstechnica.com/security/2024/03/vmware-issues-patches-for-critical-sandbox-escape-vulnerabilities/&#34;&gt;available from Ars Technica&lt;/a&gt;.&lt;/li&gt;
  153. &lt;li&gt;Think Linux doesn&amp;rsquo;t have malware? A &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/new-bifrost-malware-for-linux-mimics-vmware-domain-for-evasion/#google_vignette&#34;&gt;new Bifrost remote access trojan&lt;/a&gt; (RAT) for Linux employs a number of techniques to remain hidden, including using a &amp;ldquo;VMware-esque&amp;rdquo; domain name for command and control servers.&lt;/li&gt;
  154. &lt;li&gt;And &lt;a href=&#34;https://www.linuxsecurity.com/news/hackscracks/krustyloader-backdoor&#34;&gt;here&amp;rsquo;s another example&lt;/a&gt; of malware that is targeting Linux (along with Windows).&lt;/li&gt;
  155. &lt;li&gt;&lt;a href=&#34;https://techcrunch.com/2024/02/29/leaky-database-two-factor-codes/&#34;&gt;This&lt;/a&gt; would be why I hate it when companies force me to use SMS for two-factor authentication&amp;mdash;at least let me use a one-time passcode or something.&lt;/li&gt;
  156. &lt;/ul&gt;
  157. &lt;h2 id=&#34;cloud-computingcloud-management&#34;&gt;Cloud Computing/Cloud Management&lt;/h2&gt;
  158. &lt;ul&gt;
  159. &lt;li&gt;Mina Abadir shares some experiences around &lt;a href=&#34;https://www.flightcontrol.dev/blog/we-migrated-from-planetscale-to-aws-aurora-v2&#34;&gt;migrating from PlanetScale to Amazon Aurora&lt;/a&gt;.&lt;/li&gt;
  160. &lt;li&gt;Rory McCune &lt;a href=&#34;https://securitylabs.datadoghq.com/articles/kubernetes-security-fundamentals-part-3/&#34;&gt;explains Kubernetes authentication&lt;/a&gt;.&lt;/li&gt;
  161. &lt;li&gt;Falco has &lt;a href=&#34;https://sysdig.com/blog/falco-cncf-graduation/&#34;&gt;graduated within the CNCF&lt;/a&gt;.&lt;/li&gt;
  162. &lt;/ul&gt;
  163. &lt;h2 id=&#34;operating-systemsapplications&#34;&gt;Operating Systems/Applications&lt;/h2&gt;
  164. &lt;ul&gt;
  165. &lt;li&gt;Here&amp;rsquo;s one person&amp;rsquo;s take &lt;a href=&#34;https://www.tiraniddo.dev/2024/02/sudo-on-windows-quick-rundown.html&#34;&gt;on &lt;code&gt;sudo&lt;/code&gt; for Windows&lt;/a&gt;.&lt;/li&gt;
  166. &lt;li&gt;&lt;a href=&#34;https://monospacementor.com/2023/09/save-a-file-from-vim-with-root-permissions/&#34;&gt;This is a handy trick&lt;/a&gt;.&lt;/li&gt;
  167. &lt;li&gt;David Both has an article on &lt;a href=&#34;https://www.both.org/?p=3876&#34;&gt;using systemd journals for troubleshooting&lt;/a&gt;. It looks like this is part of a larger series on systemd.&lt;/li&gt;
  168. &lt;li&gt;Major Hayden talks about &lt;a href=&#34;https://major.io/p/caddy-porkbun&#34;&gt;connecting Caddy to Porkbun&lt;/a&gt; to help with automating TLS certificates.&lt;/li&gt;
  169. &lt;/ul&gt;
  170. &lt;h2 id=&#34;storage&#34;&gt;Storage&lt;/h2&gt;
  171. &lt;ul&gt;
  172. &lt;li&gt;Gergely Imreh &lt;a href=&#34;https://gergely.imreh.net/blog/2024/02/zfs-on-a-raspberry-pi/&#34;&gt;discusses ZFS on a Raspberry Pi&lt;/a&gt;.&lt;/li&gt;
  173. &lt;li&gt;Cal Paterson &lt;a href=&#34;https://calpaterson.com/s3.html&#34;&gt;explains why S3 is not a filesystem&lt;/a&gt;.&lt;/li&gt;
  174. &lt;/ul&gt;
  175. &lt;h2 id=&#34;virtualization&#34;&gt;Virtualization&lt;/h2&gt;
  176. &lt;ul&gt;
  177. &lt;li&gt;In the wake of Broadcom discontinuing VMware ESXi Free, Nutanix is hoping to fill the gap with Nutanix Community Edition. Vladan Seget &lt;a href=&#34;https://www.vladan.fr/nutanix-community-edition/&#34;&gt;provides some additional details in his blog post&lt;/a&gt;. Given that Nutanix Community Edition is based on the open source KVM hypervisor, this &lt;em&gt;could&lt;/em&gt; lead to greater KVM adoption among small businesses and virtualization hobbyists who formerly would have used VMware&amp;rsquo;s solution.&lt;/li&gt;
  178. &lt;li&gt;Staf Wagemakers (I think I have the name right) describes &lt;a href=&#34;https://stafwag.github.io/blog/blog/2024/02/25/run-opentbsd-as-a-vm-on-pi/&#34;&gt;running OpenBSD as a UEFI virtual machine on a Raspberry Pi&lt;/a&gt;.&lt;/li&gt;
  179. &lt;li&gt;I stumbled across a pair of articles by Greg Gant on the use of QEMU to run older versions of Mac OS (including pre-Mac OS X versions): there&amp;rsquo;s &lt;a href=&#34;https://blog.greggant.com/posts/2021/01/13/install-powerpc-macos-osx-on-apple-silicon-m1-and-x86-intel.html&#34;&gt;the original piece&lt;/a&gt;, and then &lt;a href=&#34;https://blog.greggant.com/posts/2021/12/18/ppc-qemu-mac-os-9-with-sound-on-apple-silicon-intel-mac.html&#34;&gt;an updated piece&lt;/a&gt;.&lt;/li&gt;
  180. &lt;/ul&gt;
  181. &lt;h2 id=&#34;careersoft-skills&#34;&gt;Career/Soft Skills&lt;/h2&gt;
  182. &lt;ul&gt;
  183. &lt;li&gt;Robb Owen shares &lt;a href=&#34;https://robbowen.digital/wrote-about/abandoned-side-projects/&#34;&gt;why it&amp;rsquo;s OK to abandon your side project&lt;/a&gt;.&lt;/li&gt;
  184. &lt;li&gt;&lt;a href=&#34;https://ntietz.com/blog/work-on-tasks-not-stories/&#34;&gt;This distinction between stories and tasks&lt;/a&gt; is probably applicable even outside agile development environments and practices, especially when it boils down to &amp;ldquo;you &lt;em&gt;must&lt;/em&gt; still think about what the user needs&amp;rdquo;. Good stuff!&lt;/li&gt;
  185. &lt;/ul&gt;
  186. &lt;p&gt;That&amp;rsquo;s all for now! I always love hearing from readers, so if you found something useful in this post&amp;mdash;or in any post&amp;mdash;don&amp;rsquo;t hesitate to reach out! You can reach me &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, or in a number of different Slack communities. You&amp;rsquo;re also welcome to drop me an e-mail; my address is here on the site (it&amp;rsquo;s not hard to find). Enjoy!&lt;/p&gt;</description>
  187.      </item>
  188.    
  189.      <item>
  190.        <title>Linting your Markdown Files</title>
  191.        <link>https://blog.scottlowe.org/2024/03/01/linting-your-markdown-files/</link>
  192.        <pubDate>Fri, 01 Mar 2024 10:00:00 -0600</pubDate>
  193.        <author>Scott Lowe</author>
  194.        <guid>https://blog.scottlowe.org/2024/03/01/linting-your-markdown-files/</guid>
  195.        <description>&lt;p&gt;It&amp;rsquo;s no secret I&amp;rsquo;m a fan of Markdown. The earliest mention of Markdown on this site is all the way back in 2011, and it was only a couple years after that when I migrated this site from WordPress to Markdown. Back then, the site was generated from Markdown using Jekyll (via GitHub Pages); today it is generated from Markdown sources using Hugo. One thing I&amp;rsquo;ve not done, though, is perform linting (checking for errors or potential errors) of the Markdown source files. That&amp;rsquo;s all about to change! In this post, I&amp;rsquo;ll share with you how I started linting my Markdown files.&lt;/p&gt;
  196. &lt;p&gt;To handle the linting, there are (at least) a couple different options:&lt;/p&gt;
  197. &lt;ol&gt;
  198. &lt;li&gt;markdownlint-cli (&lt;a href=&#34;https://github.com/igorshubovych/markdownlint-cli&#34;&gt;GitHub repository&lt;/a&gt;)&lt;/li&gt;
  199. &lt;li&gt;markdownlint-cli2 (&lt;a href=&#34;https://github.com/DavidAnson/markdownlint-cli2&#34;&gt;GitHub repository&lt;/a&gt;)&lt;/li&gt;
  200. &lt;/ol&gt;
  201. &lt;p&gt;Both of these use the same &lt;a href=&#34;https://github.com/DavidAnson/markdownlint&#34;&gt;&lt;code&gt;markdownlint&lt;/code&gt; library&lt;/a&gt; under the hood. They&amp;rsquo;re both available as both a CLI tool or as a &lt;a href=&#34;https://www.docker.com/&#34;&gt;Docker&lt;/a&gt; container; &lt;code&gt;markdownlint-cli2&lt;/code&gt; is also available as a &lt;a href=&#34;https://github.com/actions&#34;&gt;GitHub Action&lt;/a&gt;. In both cases, the CLI tool is installed via &lt;code&gt;npm install&lt;/code&gt; (typically globally with &lt;code&gt;--global&lt;/code&gt; or &lt;code&gt;-g&lt;/code&gt;). The key difference between the two is that &lt;code&gt;markdownlint-cli2&lt;/code&gt; is configuration-driven, whereas &lt;code&gt;markdownlint-cli&lt;/code&gt; offers the ability to use either a configuration file or command-line flags. I decided to use &lt;code&gt;markdownlint-cli&lt;/code&gt;, as the ability to use command-line flags makes it a tad easier to get started.&lt;/p&gt;
  202. &lt;p&gt;I performed initial testing with the Docker container, which you would tend to invoke like this:&lt;/p&gt;
  203. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker container run --rm -v &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PWD&lt;span style=&#34;color:#e6db74&#34;&gt;:/workdir&amp;#34;&lt;/span&gt; ghcr.io/igorshubovych/markdownlint-cli:latest &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path/to/*.md&amp;#34;&lt;/span&gt;
  204. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, I later switched to the CLI tool for better cross-platform portability (yes, I know that macOS can run Docker containers via Docker Desktop, but you still have to pay the tax of running a Linux VM in the background). The CLI tool is invoked in much the same way:&lt;/p&gt;
  205. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;markdownlint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path/to/*.md&amp;#34;&lt;/span&gt;
  206. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the default configuration, &lt;code&gt;markdownlint-cli&lt;/code&gt; flagged a &lt;em&gt;lot&lt;/em&gt; of violations in the over 2,200 blog posts on the site. After fine-tuning the configuration by disabling a few rules (more details on the rules is found &lt;a href=&#34;https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md&#34;&gt;here&lt;/a&gt;), there were still a lot of violations&amp;mdash;but not nearly as many. Notably, I disabled MD013 (&amp;ldquo;line-length&amp;rdquo;) and MD052 (&amp;ldquo;reference-links-images&amp;rdquo;); the former because I use soft line-wraps in my Markdown paragraphs and the latter because I use Hugo&amp;rsquo;s &lt;code&gt;relref&lt;/code&gt; shortcode for cross-referencing other posts.&lt;/p&gt;
  207. &lt;p&gt;Initially it was a bit unclear to me how to use the &lt;code&gt;.markdownlint.jsonc&lt;/code&gt; configuration file to disable some of the rules. (This was probably just me being dense, if I&amp;rsquo;m honest.) For example, a configuration for MD052 might look like this:&lt;/p&gt;
  208. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Rule details : https://github.com/DavidAnson/markdownlint/blob/v0.33.0/doc/md052.md
  209. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;reference-links-images&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; {
  210. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;shortcut_syntax&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
  211. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;,&lt;/span&gt;
  212. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To disable this rule, it needs to look like this:&lt;/p&gt;
  213. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Rule details : https://github.com/DavidAnson/markdownlint/blob/v0.33.0/doc/md052.md
  214. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;reference-links-images&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;,&lt;/span&gt;
  215. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In retrospect, setting the top-level entry to &lt;code&gt;false&lt;/code&gt; is obvious now, but when I first started looking at the configuration file I was expecting a property like &lt;code&gt;disabled: true&lt;/code&gt; or similar.&lt;/p&gt;
  216. &lt;p&gt;Even with a few rules disabled, there were still quite a few violations, which I fixed manually over the course of a couple weeks, until I was finally able to run &lt;code&gt;markdownlint&lt;/code&gt; over the entire list of ~2,230 Markdown posts without any violations. Yay!&lt;/p&gt;
  217. &lt;p&gt;The next step was to automate the process of running the Markdown lint checks&amp;mdash;but that&amp;rsquo;s a topic for a separate post!&lt;/p&gt;
  218. &lt;h2 id=&#34;additional-resources&#34;&gt;Additional Resources&lt;/h2&gt;
  219. &lt;p&gt;While researching what was involved in linting Markdown files, I found &lt;a href=&#34;https://emmer.dev/blog/linting-markdown-files-with-markdownlint/&#34;&gt;this post&lt;/a&gt; to be helpful in getting started with &lt;code&gt;markdownlint&lt;/code&gt;. The GitHub repositories (&lt;a href=&#34;https://github.com/igorshubovych/markdownlint-cli&#34;&gt;here&lt;/a&gt;, &lt;a href=&#34;https://github.com/DavidAnson/markdownlint-cli2&#34;&gt;here&lt;/a&gt;, and &lt;a href=&#34;https://github.com/DavidAnson/markdownlint&#34;&gt;here&lt;/a&gt;) were, of course, also very helpful (especially the &lt;a href=&#34;https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md&#34;&gt;rule descriptions&lt;/a&gt;).&lt;/p&gt;
  220. &lt;p&gt;I hope this post is useful to some folks out there. Please feel free to reach out to &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;me on Twitter&lt;/a&gt; or &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt; if you have comments, questions, or feedback (on this post or any post on my site). Thanks for reading!&lt;/p&gt;</description>
  221.      </item>
  222.    
  223.      <item>
  224.        <title>Technology Short Take 175</title>
  225.        <link>https://blog.scottlowe.org/2024/02/23/technology-short-take-175/</link>
  226.        <pubDate>Fri, 23 Feb 2024 10:00:00 -0600</pubDate>
  227.        <author>Scott Lowe</author>
  228.        <guid>https://blog.scottlowe.org/2024/02/23/technology-short-take-175/</guid>
  229.        <description>&lt;p&gt;Welcome to Technology Short Take #175! Here&amp;rsquo;s your weekend reading&amp;mdash;a collection of links and articles from around the internet on a variety of data center- and cloud-related topics. I hope you find something useful here!&lt;/p&gt;
  230. &lt;h2 id=&#34;networking&#34;&gt;Networking&lt;/h2&gt;
  231. &lt;ul&gt;
  232. &lt;li&gt;The good folks over at Packet Pushers have compiled &lt;a href=&#34;https://packetpushers.net/blog/open-source-networking-projects/&#34;&gt;a list of open source networking projects&lt;/a&gt;.&lt;/li&gt;
  233. &lt;/ul&gt;
  234. &lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;
  235. &lt;ul&gt;
  236. &lt;li&gt;I attended a local meetup here in the Denver metro area a short while ago and was introduced to &lt;a href=&#34;https://github.com/getsops/sops&#34;&gt;&lt;code&gt;sops&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
  237. &lt;li&gt;AMD processors have been discovered to have multiple security flaws; more details available &lt;a href=&#34;https://securityonline.info/high-alert-amd-processors-hit-by-multiple-security-flaws/&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
  238. &lt;li&gt;The Linux kernel project has become a CVE Numbering Authority (CNA); Greg Kroah-Hartman wrote &lt;a href=&#34;http://www.kroah.com/log/blog/2024/02/13/linux-is-a-cna/&#34;&gt;a blog post that discusses this in more depth&lt;/a&gt;.&lt;/li&gt;
  239. &lt;/ul&gt;
  240. &lt;h2 id=&#34;cloud-computingcloud-management&#34;&gt;Cloud Computing/Cloud Management&lt;/h2&gt;
  241. &lt;ul&gt;
  242. &lt;li&gt;Josh Biggley shows &lt;a href=&#34;https://cribl.io/blog/taming-tetragon-with-cribl-cloud/&#34;&gt;how to deploy Tetragon with Cribl Edge&lt;/a&gt;. The blog post is a bit heavy on the Cribl marketing, but I suppose that is to be expected (it&amp;rsquo;s &lt;em&gt;extremely&lt;/em&gt; common with most vendor blogs).&lt;/li&gt;
  243. &lt;li&gt;Jack Lindamood&amp;rsquo;s list of &lt;a href=&#34;https://cep.dev/posts/every-infrastructure-decision-i-endorse-or-regret-after-4-years-running-infrastructure-at-a-startup/&#34;&gt;infrastructure decisions he endorses or regrets&lt;/a&gt; provides some valuable insight into his personal experience with a variety of technologies and processes. Well worth reading, in my opinion. (Hat tip to Simon Wardley for sharing this on Twitter.)&lt;/li&gt;
  244. &lt;li&gt;Ivan Yurochko of PerfectScale discusses &lt;a href=&#34;https://www.perfectscale.io/blog/aws-s3-throttling&#34;&gt;how to manage S3 throttling&lt;/a&gt;.&lt;/li&gt;
  245. &lt;li&gt;&lt;a href=&#34;https://codeengineered.com/blog/2024/retro-cncf-toc/&#34;&gt;This post&lt;/a&gt; is an interesting look &amp;ldquo;inside&amp;rdquo; the CNCF Technical Oversight Committee (TOC), with a view on some of the challenges facing the CNCF and its related projects.&lt;/li&gt;
  246. &lt;li&gt;Tyler Treat argues that it&amp;rsquo;s possible&amp;mdash;preferable, perhaps&amp;mdash;to do &lt;a href=&#34;https://blog.realkinetic.com/cloud-without-kubernetes-d0487a4ab345&#34;&gt;cloud without Kubernetes&lt;/a&gt;.&lt;/li&gt;
  247. &lt;li&gt;Rory McCune reviews his &lt;a href=&#34;https://raesene.github.io/blog/2024/02/17/a-final-kubernetes-censys/&#34;&gt;final Kubernetes census&lt;/a&gt;.&lt;/li&gt;
  248. &lt;li&gt;The Open Constructs Foundation &lt;a href=&#34;https://www.open-constructs.org/&#34;&gt;recently launched&lt;/a&gt; a &amp;ldquo;community-driven CDK construct library initiative,&amp;rdquo; which seeks to provide a way for the CDK community to build and share CDK constructs.&lt;/li&gt;
  249. &lt;li&gt;Michael Levan insists that &lt;a href=&#34;https://dev.to/thenjdevopsguy/cloud-native-is-in-shambles-1klf&#34;&gt;cloud-native is in shambles&lt;/a&gt;. I think the article title is a bit click-baity, but the key point in the article&amp;mdash;focusing on the expected outcome&amp;mdash;is spot on.&lt;/li&gt;
  250. &lt;li&gt;Tony Norlin discusses &lt;a href=&#34;https://medium.com/@norlin.t/kubernetes-on-freebsd-with-linux-worker-nodes-and-cilium-a87c50daef03&#34;&gt;running Kubernetes with Cilium on FreeBSD&lt;/a&gt;.&lt;/li&gt;
  251. &lt;li&gt;This is an older post (but still useful, I think, given the review of the code that implements the functionality) on &lt;a href=&#34;https://medium.com/michaelbi-22303/deep-dive-into-kubernetes-simple-leader-election-3712a8be3a99&#34;&gt;Kubernetes leader election&lt;/a&gt;.&lt;/li&gt;
  252. &lt;/ul&gt;
  253. &lt;h2 id=&#34;operating-systemsapplications&#34;&gt;Operating Systems/Applications&lt;/h2&gt;
  254. &lt;ul&gt;
  255. &lt;li&gt;Google has open sourced Magicka, an AI-powered file type identification library. More details are available in &lt;a href=&#34;https://opensource.googleblog.com/2024/02/magika-ai-powered-fast-and-efficient-file-type-identification.html&#34;&gt;this blog post&lt;/a&gt;.&lt;/li&gt;
  256. &lt;li&gt;Andy Ibanez has &lt;a href=&#34;https://www.andyibanez.com/posts/rclone-basics-encryption/&#34;&gt;a pretty thorough tutorial for &lt;code&gt;rclone&lt;/code&gt;&lt;/a&gt; (which, if you aren&amp;rsquo;t aware, is an extraordinarily useful utility).&lt;/li&gt;
  257. &lt;/ul&gt;
  258. &lt;h2 id=&#34;programmingdevelopment&#34;&gt;Programming/Development&lt;/h2&gt;
  259. &lt;ul&gt;
  260. &lt;li&gt;Although it gets a bit deep into Rego, &lt;a href=&#34;https://snyk.io/blog/automatic-source-locations-rego/&#34;&gt;this article&lt;/a&gt; by Jasper Van der Jeugt of Snyk explains how automatic source code location for violations&amp;mdash;pinpointing the file, line, and column where policy violations occur.&lt;/li&gt;
  261. &lt;li&gt;Josh Collinsworth weighs in regarding LLMs and generative AI in &lt;a href=&#34;https://joshcollinsworth.com/blog/copilot&#34;&gt;his essay regarding GitHub Copilot&lt;/a&gt;. The experiences Josh describes with Copilot are not unique to Copilot; I&amp;rsquo;ve experienced the same with other LLM-based generative AI tools. The key takeaway (for me) is that generative AI doesn&amp;rsquo;t make things &lt;em&gt;more&lt;/em&gt; accessible; it&amp;rsquo;s actually the opposite, because you need to know enough to know whether or not the generative AI tool is actually accurate or not.&lt;/li&gt;
  262. &lt;/ul&gt;
  263. &lt;h2 id=&#34;virtualization&#34;&gt;Virtualization&lt;/h2&gt;
  264. &lt;ul&gt;
  265. &lt;li&gt;While certainly not unique to virtualization, I think it&amp;rsquo;s fair to say that virtualization has had a pretty significant impact on home labs. Sean Massey takes a moment to provide &lt;a href=&#34;https://thevirtualhorizon.com/2024/02/16/the-home-lab-update-2024/&#34;&gt;an update on his latest home lab update&lt;/a&gt;.&lt;/li&gt;
  266. &lt;/ul&gt;
  267. &lt;p&gt;That&amp;rsquo;s all I have for you this time around. I love to hear from readers, so if you have feedback on this post (or any post!) on my site, please feel free to reach out. You can find &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;me on Twitter&lt;/a&gt;, &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, or in a number of different Slack communities. My e-mail address is also on this site and isn&amp;rsquo;t too hard to find&amp;hellip;feel free to drop me a line!&lt;/p&gt;</description>
  268.      </item>
  269.    
  270.      <item>
  271.        <title>Technology Short Take 174</title>
  272.        <link>https://blog.scottlowe.org/2024/02/09/technology-short-take-174/</link>
  273.        <pubDate>Fri, 09 Feb 2024 11:30:00 -0600</pubDate>
  274.        <author>Scott Lowe</author>
  275.        <guid>https://blog.scottlowe.org/2024/02/09/technology-short-take-174/</guid>
  276.        <description>&lt;p&gt;Welcome to Technology Short Take #174! For your reading pleasure, I&amp;rsquo;ve collected links on topics ranging from Kubernetes Gateway API to recent AWS attack techniques to some geeky Linux and Git topics. There&amp;rsquo;s something here for most everyone, I&amp;rsquo;d say! But enough of my rambling, let&amp;rsquo;s get on to the good stuff. Enjoy!&lt;/p&gt;
  277. &lt;h2 id=&#34;networking&#34;&gt;Networking&lt;/h2&gt;
  278. &lt;ul&gt;
  279. &lt;li&gt;I want to be Ivan Pepelnjak when I grow up. Why? Read &lt;a href=&#34;https://blog.ipspace.net/2024/01/vmware-nsx-availability-zones.html&#34;&gt;this article&lt;/a&gt; on his response to someone wanting to use NSX to create availability zones.&lt;/li&gt;
  280. &lt;li&gt;Nico Vibert has &lt;a href=&#34;https://isovalent.com/blog/post/tutorial-redirect-rewrite-and-mirror-http-requests-with-cilium-gateway-api/&#34;&gt;a tutorial&lt;/a&gt; that takes readers through using Cilium&amp;rsquo;s Gateway API functionality to do L7 traffic management (HTTP redirects, HTTP rewrites, and HTTP mirroring).&lt;/li&gt;
  281. &lt;/ul&gt;
  282. &lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;
  283. &lt;ul&gt;
  284. &lt;li&gt;Nick Frichette &lt;a href=&#34;https://hackingthe.cloud/aws/exploitation/Misconfigured_Resource-Based_Policies/misconfigured_iam_role_trust_policy_wildcard_principal/&#34;&gt;discusses&lt;/a&gt; what he calls &amp;ldquo;one of the more egregious mistakes&amp;rdquo; that can be made in an AWS environment.&lt;/li&gt;
  285. &lt;li&gt;Cybernews is covering what is being called &lt;a href=&#34;https://cybernews.com/security/billions-passwords-credentials-leaked-mother-of-all-breaches/&#34;&gt;the &amp;ldquo;mother of all breaches.&amp;rdquo;&lt;/a&gt; The amount of data rumored to be included&amp;mdash;26 &lt;em&gt;billion&lt;/em&gt; records&amp;mdash;is almost impossible to comprehend.&lt;/li&gt;
  286. &lt;li&gt;Martin McCloskey and Christophe Tafani-Dereeper of Datadog Security Labs share &lt;a href=&#34;https://securitylabs.datadoghq.com/articles/tales-from-the-cloud-trenches-ecs-crypto-mining/&#34;&gt;some information on recent attack techniques&lt;/a&gt; they&amp;rsquo;ve observed.&lt;/li&gt;
  287. &lt;li&gt;Lee Holmes shines a light on the &lt;a href=&#34;https://www.leeholmes.com/security-risks-of-postman/&#34;&gt;security risks of Postman&lt;/a&gt;, although the risks really could apply to just about &lt;em&gt;any&lt;/em&gt; cloud-connected application. (And via this article I learned of &lt;a href=&#34;https://github.com/ArchGPT/insomnium&#34;&gt;a fork of Kong&amp;rsquo;s Insomnia API client&lt;/a&gt; that is local-only and privacy-focused. Neat.)&lt;/li&gt;
  288. &lt;li&gt;Snyk shatres some details on some &lt;a href=&#34;https://snyk.io/blog/leaky-vessels-docker-runc-container-breakout-vulnerabilities/&#34;&gt;Docker and &lt;code&gt;runc&lt;/code&gt; container breakout vulnerabilities&lt;/a&gt;.&lt;/li&gt;
  289. &lt;/ul&gt;
  290. &lt;h2 id=&#34;cloud-computingcloud-management&#34;&gt;Cloud Computing/Cloud Management&lt;/h2&gt;
  291. &lt;ul&gt;
  292. &lt;li&gt;Darryl Ruggles walks readers through &lt;a href=&#34;https://darryl-ruggles.cloud/serverless-data-processor-using-aws-lambda-step-functions-and-fargate-on-ecs-with-rust&#34;&gt;building a serverless data processor&lt;/a&gt;. The architecture incorporates AWS Lambda, AWS Step Functions, and Fargate on ECS (with some Rust thrown in there too).&lt;/li&gt;
  293. &lt;li&gt;Eleni Grosdouli explains &lt;a href=&#34;https://medium.com/@eleni.grosdouli/argocd-deployment-on-rke2-with-cilium-gateway-api-ab1769cc28a3&#34;&gt;how to use ArgoCD with Gateway API in Cilium&lt;/a&gt;. (Note that the focus here is less about Cilium itself, and more about Gateway API and ArgoCD.)&lt;/li&gt;
  294. &lt;li&gt;Here&amp;rsquo;s &lt;a href=&#34;https://observability-360.com/docs/ViewDocument?id=cilium-aks-getting-started&#34;&gt;another look at installing Cilium&lt;/a&gt;, this time with a focus on AKS and using a Windows client.&lt;/li&gt;
  295. &lt;/ul&gt;
  296. &lt;h2 id=&#34;operating-systemsapplications&#34;&gt;Operating Systems/Applications&lt;/h2&gt;
  297. &lt;ul&gt;
  298. &lt;li&gt;&lt;a href=&#34;https://containertoolbx.org/&#34;&gt;Toolbx&lt;/a&gt; now supports additional distributions; namely, Arch and Ubuntu. Read more details &lt;a href=&#34;https://debarshiray.wordpress.com/2024/01/20/toolbx-now-offers-built-in-support-for-arch-linux-and-ubuntu/&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
  299. &lt;li&gt;While reading about Toolbx (as a result of the previous bullet), I found out about Distrobox (&lt;a href=&#34;https://distrobox.it/&#34;&gt;project website&lt;/a&gt;, &lt;a href=&#34;https://github.com/89luca89/distrobox/&#34;&gt;GitHub repository&lt;/a&gt;). I plan to try this project out myself, so don&amp;rsquo;t be surprised if you see some Distrobox-related articles appearing on the site in the near future.&lt;/li&gt;
  300. &lt;li&gt;Joshua Byrd shares some information on &lt;a href=&#34;https://josh.is-cool.dev/running-a-mastodon-instance-entirely-free-forever/&#34;&gt;running your own Mastodon instance forever, for free&lt;/a&gt;.&lt;/li&gt;
  301. &lt;li&gt;Eduard Tolosa talks about &lt;a href=&#34;https://www.edu4rdshl.dev/posts/my-move-to-wayland-it-s-finally-ready/&#34;&gt;his move to Wayland&lt;/a&gt;.&lt;/li&gt;
  302. &lt;li&gt;Luc van Donkersgoed talks about &lt;a href=&#34;https://lucvandonkersgoed.com/2023/12/11/retrieval-augmented-generation-rag-simply-explained/&#34;&gt;retrieval-augmented generation (RAG) and LLMs&lt;/a&gt;.&lt;/li&gt;
  303. &lt;li&gt;Here&amp;rsquo;s an article on &lt;a href=&#34;https://dev.to/github/how-i-bulk-closed-1000-github-issues-with-github-actions-d3b&#34;&gt;using GitHub Actions to bulk close a bunch of issues&lt;/a&gt;.&lt;/li&gt;
  304. &lt;li&gt;Hopefully you won&amp;rsquo;t ever run into this particular issue, but if you do&amp;hellip;here&amp;rsquo;s some information on &lt;a href=&#34;https://underlap.org/recovering-from-a-pacman-crash-on-arch-linux&#34;&gt;recovering from a &lt;code&gt;pacman&lt;/code&gt; crash on Arch Linux&lt;/a&gt;.&lt;/li&gt;
  305. &lt;li&gt;Julia Evans helps with &lt;a href=&#34;https://jvns.ca/blog/2024/02/01/dealing-with-diverged-git-branches/&#34;&gt;fixing diverged Git branches&lt;/a&gt;.&lt;/li&gt;
  306. &lt;li&gt;Robert Jensen &lt;a href=&#34;https://www.robert-jensen.dk/posts/2024-fixing-cilium-with-kind/&#34;&gt;shines a light&lt;/a&gt; on an issue running Cilium on KinD; the issue turns out to be a problem in Docker Desktop for Mac, and switching to Colima &lt;a href=&#34;https://github.com/cilium/cilium/issues/30278&#34;&gt;fixes the issue&lt;/a&gt;. Interesting&amp;mdash;I am very curious to know the underlying details of why using Colima works.&lt;/li&gt;
  307. &lt;/ul&gt;
  308. &lt;h2 id=&#34;programmingdevelopment&#34;&gt;Programming/Development&lt;/h2&gt;
  309. &lt;ul&gt;
  310. &lt;li&gt;&lt;a href=&#34;https://pkl-lang.org/blog/introducing-pkl.html&#34;&gt;This blog post&lt;/a&gt; announces the release of Pkl (pronounced &amp;ldquo;pickle&amp;rdquo;), described as a new &amp;ldquo;programming language for producing configuration&amp;rdquo;. Unless I&amp;rsquo;m reading this wrong, this sounds like quite an overlap with &lt;a href=&#34;https://cuelang.org/&#34;&gt;CUE&lt;/a&gt;. Or am I way wrong here?&lt;/li&gt;
  311. &lt;li&gt;Milas Bowman &lt;a href=&#34;https://www.docker.com/blog/scaling-docker-compose-up/&#34;&gt;examines some new features in Docker Compose&lt;/a&gt; specifically targeted at improving the development experience.&lt;/li&gt;
  312. &lt;/ul&gt;
  313. &lt;h2 id=&#34;careersoft-skills&#34;&gt;Career/Soft Skills&lt;/h2&gt;
  314. &lt;ul&gt;
  315. &lt;li&gt;I think this article &lt;a href=&#34;https://jmetz.com/2024/02/of-scheiss-and-men/&#34;&gt;speaks for itself&lt;/a&gt;.&lt;/li&gt;
  316. &lt;/ul&gt;
  317. &lt;p&gt;That&amp;rsquo;s all I have for you this time around, but check back in 2-3 weeks for the next Technology Short Take. Until then, feel free to share this article on your favorite social media platform, and I invite you to contact me if you have any feedback about this or any article on my site. You can find me &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, or in a number of different Slack communities. Heck, if you try hard enough you can find my e-mail address on this site and drop me a message that way!&lt;/p&gt;</description>
  318.      </item>
  319.    
  320.      <item>
  321.        <title>Using NAT Instances on AWS with Pulumi</title>
  322.        <link>https://blog.scottlowe.org/2024/02/05/using-nat-instances-on-aws-with-pulumi/</link>
  323.        <pubDate>Mon, 05 Feb 2024 09:30:00 -0600</pubDate>
  324.        <author>Scott Lowe</author>
  325.        <guid>https://blog.scottlowe.org/2024/02/05/using-nat-instances-on-aws-with-pulumi/</guid>
  326.        <description>&lt;p&gt;For folks using AWS in their day-to-day jobs, it comes as no secret that AWS&amp;rsquo; Managed NAT Gateway&amp;mdash;responsible for providing outbound Internet connectivity to otherwise private subnets&amp;mdash;is an expensive proposition. While the primary concern for large organizations is the data processing fee, the concern for smaller organizations or folks like me who run a cloud-based lab instead of a hardware-based home lab is the per-hour cost. In this post, I&amp;rsquo;ll show you how to use Pulumi to use a NAT instance for outbound Internet connectivity instead of a Managed NAT Gateway.&lt;/p&gt;
  327. &lt;p&gt;For a bit more about why Managed NAT Gateways aren&amp;rsquo;t ideal for larger organizations, I&amp;rsquo;d recommend &lt;a href=&#34;https://www.lastweekinaws.com/blog/the-aws-managed-nat-gateway-is-unpleasant-and-not-recommended/&#34;&gt;this article by Corey Quinn&lt;/a&gt;. For smaller organizations or cloud-based labs, data processing fees probably aren&amp;rsquo;t the main concern (although I could be wrong); it would be the ~$32/mo per Managed NAT Gateway. Since many tools configure a Managed NAT Gateway per availability zone, now you&amp;rsquo;re talking more like $96/mo&amp;mdash;and you haven&amp;rsquo;t even spun up any real workloads yet! Running your own NAT instance can dramatically reduce but not eliminate this expense.&lt;/p&gt;
  328. &lt;p&gt;Now that I&amp;rsquo;ve established &lt;em&gt;why&lt;/em&gt; running a NAT instance can be beneficial, let&amp;rsquo;s review what you&amp;rsquo;ll need to have installed in order to follow along with (or use) what I&amp;rsquo;ll show you in this post:&lt;/p&gt;
  329. &lt;ol&gt;
  330. &lt;li&gt;I&amp;rsquo;m automating the entire process with &lt;a href=&#34;https://www.pulumi.com/&#34;&gt;Pulumi&lt;/a&gt;, so you&amp;rsquo;ll want to have the Pulumi CLI installed. (Installation instructions are &lt;a href=&#34;https://www.pulumi.com/install/&#34;&gt;here&lt;/a&gt;.)&lt;/li&gt;
  331. &lt;li&gt;I write my Pulumi using &lt;a href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;, so you&amp;rsquo;d need Go installed. (Installation instructions are &lt;a href=&#34;https://go.dev/doc/install/&#34;&gt;here&lt;/a&gt;.)&lt;/li&gt;
  332. &lt;li&gt;A typical EC2 AMI isn&amp;rsquo;t pre-configured for NAT, so you&amp;rsquo;ll need &lt;em&gt;either&lt;/em&gt; a configuration mechanism for setting that up (like &lt;a href=&#34;https://www.ansible.com/&#34;&gt;Ansible&lt;/a&gt; and an associated playbook) &lt;em&gt;or&lt;/em&gt; a preconfigured AMI. I chose to go the latter route and am using the excellent fck-nat AMI (check out &lt;a href=&#34;https://fck-nat.dev/stable/&#34;&gt;the website&lt;/a&gt; and the associated &lt;a href=&#34;https://github.com/AndrewGuenther/fck-nat&#34;&gt;GitHub repository&lt;/a&gt;).&lt;/li&gt;
  333. &lt;/ol&gt;
  334. &lt;p&gt;I&amp;rsquo;ll walk through select pieces of the code below to explain what&amp;rsquo;s being provisioned or configured. For your reference, the full code is found in &lt;a href=&#34;https://github.com/scottslowe/learning-tools&#34;&gt;my GitHub &amp;ldquo;learning-tools&amp;rdquo; repository&lt;/a&gt;, in the &lt;code&gt;aws/nat-instance-pulumi&lt;/code&gt; folder.&lt;/p&gt;
  335. &lt;h2 id=&#34;setting-up-the-vpc-and-subnets&#34;&gt;Setting up the VPC and Subnets&lt;/h2&gt;
  336. &lt;p&gt;All the Pulumi code for setting up the VPC and subnets is separated into a file named &lt;code&gt;vpc.go&lt;/code&gt;, and is invoked from &lt;code&gt;main.go&lt;/code&gt; through a function named &lt;code&gt;buildInfrastructure&lt;/code&gt;. At a high-level, the &lt;code&gt;buildInfrastructure&lt;/code&gt; function does the following things:&lt;/p&gt;
  337. &lt;ul&gt;
  338. &lt;li&gt;It gets the number of availability zones (AZs) and the names of the zones, and stores that information for later use.&lt;/li&gt;
  339. &lt;li&gt;It builds a VPC with a preconfigured CIDR block. (In most of my Pulumi programs I make this a configuration value, but in this particular case it&amp;rsquo;s hard-coded. There&amp;rsquo;s no reason for that other than my own lack of time.)&lt;/li&gt;
  340. &lt;li&gt;It creates a public subnet in each of the AZs.&lt;/li&gt;
  341. &lt;li&gt;It handles the routing configuration for the public subnets (creates an Internet Gateway, creates a route table, creates an outbound route via the gateway, and links the public subnets to the route table).&lt;/li&gt;
  342. &lt;li&gt;It creates a private subnet in each of the AZs.&lt;/li&gt;
  343. &lt;li&gt;It creates a route table for the private subnets and links the private subnets to the route table, but &lt;em&gt;does not create a route.&lt;/em&gt;&lt;/li&gt;
  344. &lt;/ul&gt;
  345. &lt;p&gt;All said, that&amp;rsquo;s about 150 lines of code. You might wonder why I didn&amp;rsquo;t use Pulumi&amp;rsquo;s AWSX (Crosswalk for AWS) component for a VPC, which allows users to do &lt;em&gt;almost&lt;/em&gt; the same thing in about 10 lines of code. That would be an excellent question! Currently, the AWSX VPC component &lt;a href=&#34;https://github.com/pulumi/pulumi-awsx/pull/885&#34;&gt;doesn&amp;rsquo;t currently expose the route table IDs&lt;/a&gt;, which are needed so that I can add a route of my own creation. The AWSX VPC component is outstanding otherwise; if you can use it for your use case, I generally recommend it.&lt;/p&gt;
  346. &lt;h2 id=&#34;setting-up-the-nat-infrastructure&#34;&gt;Setting up the NAT Infrastructure&lt;/h2&gt;
  347. &lt;p&gt;Now the program moves on to creating the necessary NAT infrastructure. This code is split into a separate file named &lt;code&gt;nat.go&lt;/code&gt; and invoked from &lt;code&gt;main.go&lt;/code&gt; via the &lt;code&gt;buildNat&lt;/code&gt; function.&lt;/p&gt;
  348. &lt;p&gt;This code is reasonably straightforward:&lt;/p&gt;
  349. &lt;ul&gt;
  350. &lt;li&gt;It creates a security group to allow traffic to move through the NAT instance.&lt;/li&gt;
  351. &lt;li&gt;It dynamically looks up the AMI ID for the fck-nat instance.&lt;/li&gt;
  352. &lt;li&gt;It launches an EC2 instance (a &amp;ldquo;tg4.nano&amp;rdquo; is sufficient to handle Gbps-level traffic) using the fck-nat AMI.&lt;/li&gt;
  353. &lt;li&gt;Once the EC2 instance is launched, it adds a route to the private subnet route table that directs outbound traffic for the private subnets through the EC2 instance. (We couldn&amp;rsquo;t do that earlier because we needed the interface ID associated with the EC2 instance.)&lt;/li&gt;
  354. &lt;/ul&gt;
  355. &lt;h2 id=&#34;finishing-the-final-touches&#34;&gt;Finishing the Final Touches&lt;/h2&gt;
  356. &lt;p&gt;For your own architecture implementation, you could stop there, but my code continues on so that there&amp;rsquo;s a way to test that the NAT instance is working as expected. All of this code is found in &lt;code&gt;main.go&lt;/code&gt;.&lt;/p&gt;
  357. &lt;p&gt;Before &lt;code&gt;main.go&lt;/code&gt; invokes the &lt;code&gt;buildInfrastructure&lt;/code&gt; and &lt;code&gt;buildNat&lt;/code&gt; functions, it first creates an SSH key and an associated AWS key pair. It passes the key pair name to the &lt;code&gt;buildNat&lt;/code&gt; function so that the fck-nat instance is configured with the SSH key. This allows you to SSH into the NAT instance with the user &amp;ldquo;ec2-user&amp;rdquo; and the associated private key (which you can get from Pulumi using &lt;code&gt;pulumi stack output&lt;/code&gt;).&lt;/p&gt;
  358. &lt;p&gt;After invoking &lt;code&gt;buildInfrastructure&lt;/code&gt; and &lt;code&gt;buildNat&lt;/code&gt;, the Pulumi program goes on to create an EC2 instance (based on a dynamically-obtained AMI ID) in one of the private subnets and a security group to allow SSH traffic to that instance. This allows you to test that the fck-nat instance is both a) working properly as an SSH bastion host, and b) working properly as a NAT instance.&lt;/p&gt;
  359. &lt;p&gt;Congratulations! You have now reduced your NAT costs to about 1/10th the cost of a Managed NAT Gateway.&lt;/p&gt;
  360. &lt;h2 id=&#34;caveats&#34;&gt;Caveats&lt;/h2&gt;
  361. &lt;p&gt;This code isn&amp;rsquo;t necessarily intended for commercial production use, as there are a number of caveats with the architecture it creates:&lt;/p&gt;
  362. &lt;ul&gt;
  363. &lt;li&gt;There is only a single NAT instance for all AZs. If that AZ fails, then outbound traffic from all private subnets in other AZs is also down.&lt;/li&gt;
  364. &lt;li&gt;There is only a single NAT instance. If the NAT instance fails, then&amp;hellip;well, you get the idea.&lt;/li&gt;
  365. &lt;/ul&gt;
  366. &lt;p&gt;The fck-nat AMI has some functionality to help address some of these caveats, so I encourage you to review &lt;a href=&#34;https://fck-nat.dev/stable/&#34;&gt;the website&lt;/a&gt; for more information. I&amp;rsquo;ll leave updating this code to support these features as an exercise for the reader. (Feel free to submit one or more PRs if you are so inclined.)&lt;/p&gt;
  367. &lt;h2 id=&#34;additional-resources&#34;&gt;Additional Resources&lt;/h2&gt;
  368. &lt;p&gt;To get access to the full Pulumi program, see &lt;a href=&#34;https://github.com/scottslowe/learning-tools&#34;&gt;my GitHub &amp;ldquo;learning-tools&amp;rdquo; repository&lt;/a&gt; in the &lt;code&gt;aws/nat-instance-pulumi&lt;/code&gt; folder. If you have questions about the code or about Pulumi, feel free to join &lt;a href=&#34;https://slack.pulumi.com/&#34;&gt;the Pulumi Community Slack&lt;/a&gt;, where I and other Pulumi enthusiasts and experts hang out. You&amp;rsquo;re also welcome to find me online; I am available &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, and in various other Slack communities. I&amp;rsquo;d be more than happy to hear from readers with questions or feedback on this or any article on my site. Thanks for reading!&lt;/p&gt;</description>
  369.      </item>
  370.    
  371.      <item>
  372.        <title>Using SSH with the Pulumi Docker Provider</title>
  373.        <link>https://blog.scottlowe.org/2024/01/22/using-ssh-with-the-pulumi-docker-provider/</link>
  374.        <pubDate>Mon, 22 Jan 2024 08:30:00 -0600</pubDate>
  375.        <author>Scott Lowe</author>
  376.        <guid>https://blog.scottlowe.org/2024/01/22/using-ssh-with-the-pulumi-docker-provider/</guid>
  377.        <description>&lt;p&gt;In August 2023, Pulumi released a version of the Docker provider that supported SSH-based connections to a Docker daemon. I&amp;rsquo;ve written about using SSH with Docker before (see &lt;a href=&#34;https://blog.scottlowe.org/2019/08/01/accessing-docker-daemon-via-ssh-bastion-host/&#34;&gt;here&lt;/a&gt;), and I sometimes use AWS-based &amp;ldquo;Docker build hosts&amp;rdquo; with my M-series Macs to make it easier/simpler (and sometimes faster) to build x86_64-based Docker images. Naturally, I&amp;rsquo;m using an SSH connection in those cases. Until this past weekend, however, I hadn&amp;rsquo;t really made the time to look deeper into how to use SSH with the Pulumi Docker provider. In this post, I&amp;rsquo;ll share some details that (unfortunately) haven&amp;rsquo;t yet made it into the documentation about using SSH with the Pulumi Docker provider.&lt;/p&gt;
  378. &lt;p&gt;First, let&amp;rsquo;s talk about some prerequisites to making this work.&lt;/p&gt;
  379. &lt;ol&gt;
  380. &lt;li&gt;You&amp;rsquo;ll need &lt;a href=&#34;https://www.docker.com/&#34;&gt;Docker&lt;/a&gt; installed locally. I fairly certain this is &lt;em&gt;only&lt;/em&gt; the &lt;code&gt;docker&lt;/code&gt; CLI (much in the same way the Pulumi Kubernetes provider requires &lt;code&gt;kubectl&lt;/code&gt; to be installed locally), but I haven&amp;rsquo;t verified this for certain yet. I tested this from a Linux system running Docker 24.0.7; I think the earliest version that is supported is 18.09.&lt;/li&gt;
  381. &lt;li&gt;You&amp;rsquo;ll need Docker installed on the remote SSH host (obviously). I used &lt;a href=&#34;https://flatcar.org/&#34;&gt;Flatcar Container Linux&lt;/a&gt; (stable channel) on &lt;a href=&#34;https://aws.amazon.com/&#34;&gt;AWS&lt;/a&gt;.&lt;/li&gt;
  382. &lt;li&gt;You&amp;rsquo;ll need &lt;a href=&#34;https://www.pulumi.com/&#34;&gt;Pulumi&lt;/a&gt; installed locally. I tested with a pretty recent version of the &lt;code&gt;pulumi&lt;/code&gt; CLI (v3.101.1).&lt;/li&gt;
  383. &lt;li&gt;I tested this with the latest version of the Docker provider as of this writing (v4.5.1), using &lt;a href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt; 1.21 as the programming language.&lt;/li&gt;
  384. &lt;/ol&gt;
  385. &lt;p&gt;You may already be aware that there are a couple of ways to use Pulumi providers when writing Pulumi infrastructure as code programs:&lt;/p&gt;
  386. &lt;ul&gt;
  387. &lt;li&gt;There&amp;rsquo;s the &lt;em&gt;default&lt;/em&gt; provider. The default provider uses what I would call &amp;ldquo;ambient&amp;rdquo; configuration&amp;mdash;for example, the default AWS provider uses whatever AWS credentials/profile are available (or are specified in the stack configuration), and the default Docker provider uses whatever is specified by the &lt;code&gt;DOCKER_HOST&lt;/code&gt; environment variable.&lt;/li&gt;
  388. &lt;li&gt;There&amp;rsquo;s also &lt;em&gt;explicit&lt;/em&gt; providers. Explicit providers are declared programmatically in your Pulumi program, and you can pass configuration details to the provider when it&amp;rsquo;s declared. You could, for example, declare a couple of explicit AWS providers so that you could provision resources in different accounts or in different regions (from within the same program).&lt;/li&gt;
  389. &lt;/ul&gt;
  390. &lt;p&gt;More details on providers can be found &lt;a href=&#34;https://www.pulumi.com/docs/concepts/resources/providers/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
  391. &lt;p&gt;With regard to the Pulumi Docker provider, this means the following:&lt;/p&gt;
  392. &lt;ul&gt;
  393. &lt;li&gt;If you want to use the Docker provider against a Docker daemon that is preexisting, then you can use the default provider and supply configuration &lt;em&gt;either&lt;/em&gt; through the &lt;code&gt;DOCKER_HOST&lt;/code&gt; environment variable &lt;em&gt;or&lt;/em&gt; via stack configuration (&lt;code&gt;pulumi config set docker:host &amp;lt;ssh-url&amp;gt;&lt;/code&gt;). (Note that, as of the time of this writing, the Docker provider does not support Docker contexts.)&lt;/li&gt;
  394. &lt;li&gt;If you want to use the Docker provider with a resource being provisioned in the same stack or if you&amp;mdash;for whatever reason&amp;mdash;need to programmatically assign the Docker daemon endpoint in your program, then you need to use an explicit provider, and configure that explicit provider to use SSH.&lt;/li&gt;
  395. &lt;/ul&gt;
  396. &lt;p&gt;Using and configuring the default provider is reasonably straightforward, so in this article I&amp;rsquo;ll focus on the explicit provider; specifically, on the use of an explicit provider to make SSH-based connections to a Docker daemon.&lt;/p&gt;
  397. &lt;p&gt;Declaring a basic explicit provider is not terribly complex:&lt;/p&gt;
  398. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;remoteDocker&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewProvider&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;remote-docker&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ProviderArgs&lt;/span&gt;{})
  399. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To make the explicit provider actually work in this use case (i.e., connect over SSH to a remote Docker daemon), the configuration is a bit more complex:&lt;/p&gt;
  400. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;remoteDocker&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewProvider&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;remote-docker&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ProviderArgs&lt;/span&gt;{
  401. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Host&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh://&amp;lt;username&amp;gt;@%s&amp;#34;&lt;/span&gt;, &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ip&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;address&lt;/span&gt;&amp;gt;),
  402. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;SshOpts&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringArray&lt;/span&gt;{
  403. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-i&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/path/to/private/key&amp;#34;&lt;/span&gt;),
  404. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-o&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;StrictHostKeyChecking=no&amp;#34;&lt;/span&gt;),
  405. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-o&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UserKnownHostsFile=/dev/null&amp;#34;&lt;/span&gt;),
  406. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
  407. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
  408. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;d need to substitute appropriate values for &lt;code&gt;username&lt;/code&gt; (on Flatcar you&amp;rsquo;d likely use &amp;ldquo;core&amp;rdquo;), &lt;code&gt;ip-address&lt;/code&gt;, and &lt;code&gt;/path/to/private/key&lt;/code&gt;. Since I&amp;rsquo;m discussing using the Docker provider with a resource provisioned in the same stack, &lt;code&gt;ip-address&lt;/code&gt; is most likely going to be a reference to the public IP address of an EC2 instance&amp;mdash;such as &lt;code&gt;flatcarInstance.publicIp&lt;/code&gt;. That&amp;rsquo;s also why the code above uses &lt;code&gt;pulumi.Sprintf&lt;/code&gt;, which is capable of dealing with Outputs in Pulumi code.&lt;/p&gt;
  409. &lt;p&gt;The syntax of the &lt;code&gt;SshOpts&lt;/code&gt; section isn&amp;rsquo;t currently defined in the docs; fortunately, I found a clue &lt;a href=&#34;https://github.com/pulumi/pulumi-docker/blob/014b3fa8b3d9369d4108e71006cf8d429c19bc13/examples/test-ssh-conn/ts/index.ts#L26-L33&#34;&gt;here&lt;/a&gt; that led to the Go code you see above. Given that this is using a resource that was provisioned in the same stack, the only way to make it work is to disable strict host key checking.&lt;/p&gt;
  410. &lt;p&gt;There&amp;rsquo;s one final complication. EC2 instances&amp;mdash;or their equivalents on Azure or Google Cloud&amp;mdash;take a small amount of time to boot up and become ready. The Docker provider needs to check the connection, and if it attempts that before the remote host is ready it will throw an error.&lt;/p&gt;
  411. &lt;p&gt;&amp;ldquo;No problem!&amp;rdquo; you say. &amp;ldquo;Just throw a &lt;code&gt;sleep&lt;/code&gt; in there.&amp;rdquo;&lt;/p&gt;
  412. &lt;p&gt;Well&amp;hellip;Pulumi doesn&amp;rsquo;t necessarily execute your Go code in the way you might normally expect, so this won&amp;rsquo;t work. What we need to do is create a &lt;em&gt;resource&lt;/em&gt; that the Pulumi engine can add to the dependency graph that will insert a delay before creating the Docker provider. Fortunately, there is &lt;a href=&#34;https://www.pulumi.com/registry/packages/time/&#34;&gt;a Time provider&lt;/a&gt; that provides &lt;a href=&#34;https://www.pulumi.com/registry/packages/time/api-docs/sleep/&#34;&gt;a Sleep resource&lt;/a&gt; to accomplish exactly what we need. To create the necessary dependencies and insert the delay in the right place, we make the Sleep resource dependent on the EC2 instance and the Docker provider dependent on the Sleep resource.&lt;/p&gt;
  413. &lt;p&gt;Including the EC2 instance, the Sleep resource, and the Docker provider, the code now looks like this (I&amp;rsquo;ve omitted error checking code for simplicity):&lt;/p&gt;
  414. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Launch an instance using Flatcar Linux AMI
  415. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;flatcarInstance&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ec2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewInstance&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flatcar-instance&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ec2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;InstanceArgs&lt;/span&gt;{
  416. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Ami&lt;/span&gt;:                      &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;flatcarAmi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt;),
  417. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;InstanceType&lt;/span&gt;:             &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;instanceType&lt;/span&gt;),
  418. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;AssociatePublicIpAddress&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Bool&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;),
  419. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;KeyName&lt;/span&gt;:                  &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringPtr&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;userSuppliedKeyPair&lt;/span&gt;),
  420. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;SubnetId&lt;/span&gt;:                 &lt;span style=&#34;color:#a6e22e&#34;&gt;dockerVpc&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PublicSubnetIds&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Index&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Int&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)),
  421. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;VpcSecurityGroupIds&lt;/span&gt;:      &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringArray&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;dockerSg&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ID&lt;/span&gt;()},
  422. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Tags&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringMap&lt;/span&gt;{
  423. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flatcar-instance&amp;#34;&lt;/span&gt;),
  424. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
  425. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
  426. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
  427. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Sleep for 20 seconds to allow instance to boot
  428. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;instanceBootDelay&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;time&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewSleep&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;instance-boot-delay&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;time&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;SleepArgs&lt;/span&gt;{
  429. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;CreateDuration&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;20s&amp;#34;&lt;/span&gt;),
  430. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}, &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DependsOn&lt;/span&gt;([]&lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Resource&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;flatcarInstance&lt;/span&gt;}))
  431. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
  432. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Create a new Docker provider
  433. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;remoteDocker&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewProvider&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;remote-docker&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ProviderArgs&lt;/span&gt;{
  434. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Host&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh://core@%s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;flatcarInstance&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PublicIp&lt;/span&gt;),
  435. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;SshOpts&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StringArray&lt;/span&gt;{
  436. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-i&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;userSuppliedPrivateKeyFile&lt;/span&gt;),
  437. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-o&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;StrictHostKeyChecking=no&amp;#34;&lt;/span&gt;),
  438. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-o&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UserKnownHostsFile=/dev/null&amp;#34;&lt;/span&gt;),
  439. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
  440. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}, &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DependsOn&lt;/span&gt;([]&lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Resource&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;instanceBootDelay&lt;/span&gt;}))
  441. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Following this code, you could then have the remote Docker daemon pull an image and deploy a container from that image:&lt;/p&gt;
  442. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Pull down a container image on the remote host
  443. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nginxImage&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewRemoteImage&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nginx-image&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;RemoteImageArgs&lt;/span&gt;{
  444. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nginx:1.17.4-alpine&amp;#34;&lt;/span&gt;),
  445. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}, &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Provider&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;remoteDocker&lt;/span&gt;))
  446. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
  447. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Launch a container on the remote host
  448. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewContainer&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nginx-container&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;docker&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ContainerArgs&lt;/span&gt;{
  449. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Image&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;nginxImage&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ImageId&lt;/span&gt;,
  450. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}, &lt;span style=&#34;color:#a6e22e&#34;&gt;pulumi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Provider&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;remoteDocker&lt;/span&gt;))
  451. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Neat, right? (And useful!) In one Pulumi stack, you can provision the EC2 instance, create a Docker provider to communicate with that instance, and deploy containers on that instance&amp;mdash;all in the programming language of your choice.&lt;/p&gt;
  452. &lt;p&gt;If you&amp;rsquo;d like to see the full Pulumi program, you can find it in the &lt;code&gt;docker/docker-ssh-pulumi&lt;/code&gt; folder of &lt;a href=&#34;https://github.com/scottslowe/learning-tools/&#34;&gt;my GitHub &amp;ldquo;learning-tools&amp;rdquo; repository&lt;/a&gt;. The code is useful in that it illustrates the correct syntax for a number of useful constructs when using Pulumi with Go:&lt;/p&gt;
  453. &lt;ul&gt;
  454. &lt;li&gt;Creating a dependency between resources&lt;/li&gt;
  455. &lt;li&gt;Referencing an explicit provider for a resource&lt;/li&gt;
  456. &lt;li&gt;Configuring the SSH options for the Docker provider&lt;/li&gt;
  457. &lt;li&gt;Looking up the AMI for an instance (not shown above, but it is in the full code on GitHub)&lt;/li&gt;
  458. &lt;/ul&gt;
  459. &lt;p&gt;I hope this proves useful to someone. If you have questions, you are welcome to open an issue on &lt;a href=&#34;https://github.com/scottslowe/learning-tools/&#34;&gt;my &amp;ldquo;learning-tools&amp;rdquo; GitHub repository&lt;/a&gt;, or you can reach out to me directly. You can contact &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;me on Twitter&lt;/a&gt;, &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, or via Slack (I&amp;rsquo;m active in a number of different Slack communities). I&amp;rsquo;d love to hear from you, hear any feedback you might have, or try to answer questions about this article or any of my articles. Thanks for reading!&lt;/p&gt;</description>
  460.      </item>
  461.    
  462.      <item>
  463.        <title>Technology Short Take 173</title>
  464.        <link>https://blog.scottlowe.org/2024/01/19/technology-short-take-173/</link>
  465.        <pubDate>Fri, 19 Jan 2024 09:00:00 -0600</pubDate>
  466.        <author>Scott Lowe</author>
  467.        <guid>https://blog.scottlowe.org/2024/01/19/technology-short-take-173/</guid>
  468.        <description>&lt;p&gt;Welcome to Technology Short Take #173! After a lull in links to share last time around, it looks like things have rebounded and folks are in full swing writing new content for me to share with you. I think I have a decent round-up of links for you; hopefully you can find something useful here. Enjoy!&lt;/p&gt;
  469. &lt;h2 id=&#34;networking&#34;&gt;Networking&lt;/h2&gt;
  470. &lt;ul&gt;
  471. &lt;li&gt;This article on &lt;a href=&#34;https://www.nikitakazakov.com/wireguard-vpn-in-docker&#34;&gt;running WireGuard in Docker&lt;/a&gt; may prove useful if that&amp;rsquo;s an approach I decide to adopt for my AWS lab infrastructure.&lt;/li&gt;
  472. &lt;li&gt;Natalie Marek &lt;a href=&#34;https://dev.to/aws-builders/lets-talk-about-aws-vpc-endpoints-2bj&#34;&gt;educates readers on VPC endpoints&lt;/a&gt;.&lt;/li&gt;
  473. &lt;li&gt;Russ White &lt;a href=&#34;https://rule11.tech/making-networking-cool-again-2/&#34;&gt;laments some of the issues&lt;/a&gt; facing network engineering.&lt;/li&gt;
  474. &lt;/ul&gt;
  475. &lt;h2 id=&#34;servershardware&#34;&gt;Servers/Hardware&lt;/h2&gt;
  476. &lt;ul&gt;
  477. &lt;li&gt;Alex Ellis provides some details on his workflow for &lt;a href=&#34;https://blog.alexellis.io/booting-the-raspberry-pi-5-from-nvme/&#34;&gt;booting Raspberry Pi 5 from NVMe&lt;/a&gt;.&lt;/li&gt;
  478. &lt;li&gt;Tom Hummel &lt;a href=&#34;https://tomhummel.com/posts/homelab-2023/&#34;&gt;finds himself veering back&lt;/a&gt; into a hardware-based home lab (instead of a cloud-based lab).&lt;/li&gt;
  479. &lt;/ul&gt;
  480. &lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;
  481. &lt;ul&gt;
  482. &lt;li&gt;Rory McCune shares some information about &lt;a href=&#34;https://raesene.github.io/blog/2024/01/06/when-is-admin-not-admin/&#34;&gt;a change in &lt;code&gt;kubeadm&lt;/code&gt; version 1.29 pertaining to administrative credentials&lt;/a&gt;.&lt;/li&gt;
  483. &lt;li&gt;Quintessence Anx of SPIRL shares some guidance on &lt;a href=&#34;https://www.spirl.com/blog/how-to-construct-spiffe-ids/&#34;&gt;how to construct SPIFFE IDs&lt;/a&gt;.&lt;/li&gt;
  484. &lt;li&gt;A set of vulnerabilities in the open source reference implementation of the UEFI specification has been uncovered. The flaws, referred to as PixieFail, specifically affect the PXE network boot process. BleepingComputer has &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/pixiefail-flaws-impact-pxe-network-boot-in-enterprise-systems/&#34;&gt;more details&lt;/a&gt;.&lt;/li&gt;
  485. &lt;/ul&gt;
  486. &lt;h2 id=&#34;cloud-computingcloud-management&#34;&gt;Cloud Computing/Cloud Management&lt;/h2&gt;
  487. &lt;ul&gt;
  488. &lt;li&gt;Dean has published information on &lt;a href=&#34;https://veducate.co.uk/migrate-red-hat-openshiftsdn-ovn-kubernetes-cilium/&#34;&gt;migrating your Red Hat OpenShift clusters to Cilium&lt;/a&gt; (from one of the &amp;ldquo;default&amp;rdquo; networking solutions).&lt;/li&gt;
  489. &lt;li&gt;I think I&amp;rsquo;ve linked to Ricardo Sueiras&amp;rsquo; &amp;ldquo;AWS open source newsletter&amp;rdquo; before; it&amp;rsquo;s such a useful resource. In &lt;a href=&#34;https://community.aws/content/2arO7cYup4ShOVguSMZfHt9WgJa/aws-open-source-newsletter-184&#34;&gt;edition 184&lt;/a&gt;, Ricardo shares some links to some useful posts on EKS; the one on using Istio with EKS to improve the user experience caught my eye. (Check out the newsletter to get the link to the Istio article.)&lt;/li&gt;
  490. &lt;li&gt;Ian McKay &lt;a href=&#34;https://onecloudplease.com/blog/https-endpoints-and-more-tricks-with-aws-step-functions&#34;&gt;digs into the details&lt;/a&gt; of the recently-announced support for HTTPS Endpoints in AWS Step Functions.&lt;/li&gt;
  491. &lt;li&gt;Matt Gowie of MasterPoint &lt;a href=&#34;https://masterpoint.io/updates/terraform-null-label/&#34;&gt;explains &lt;code&gt;terraform-null-label&lt;/code&gt;&lt;/a&gt; and its use in providing more consistent naming and tagging of cloud resources.&lt;/li&gt;
  492. &lt;/ul&gt;
  493. &lt;h2 id=&#34;operating-systemsapplications&#34;&gt;Operating Systems/Applications&lt;/h2&gt;
  494. &lt;ul&gt;
  495. &lt;li&gt;Julia Evans has &lt;a href=&#34;https://jvns.ca/blog/2024/01/05/do-we-think-of-git-commits-as-diffs--snapshots--or-histories/&#34;&gt;a lovely article on Git commits&lt;/a&gt; that is well worth reading. Further, Julia&amp;rsquo;s article links over to this substantial article on &lt;a href=&#34;https://codewords.recurse.com/issues/three/unpacking-git-packfiles&#34;&gt;Git packfiles&lt;/a&gt; by Aditya Mukerjee. Julia has a bunch of other Git-related articles published recently; if you&amp;rsquo;d like to better understand Git, they&amp;rsquo;re a good resource.&lt;/li&gt;
  496. &lt;li&gt;Kyle Galbraith talks about &lt;a href=&#34;https://depot.dev/blog/faster-builds-with-docker-caching&#34;&gt;using the Docker build cache&lt;/a&gt;.&lt;/li&gt;
  497. &lt;li&gt;Samuel Karp &lt;a href=&#34;https://samuel.karp.dev/blog/2024/01/deprecation-warnings-in-containerd-getting-ready-for-2.0/&#34;&gt;discusses some deprecation warnings&lt;/a&gt; in containerd while on the road to version 2.0.&lt;/li&gt;
  498. &lt;li&gt;Jacob Gillespie &lt;a href=&#34;https://depot.dev/blog/building-container-layers-from-scratch&#34;&gt;decodes some of the basics of OCI container image layers&lt;/a&gt;.&lt;/li&gt;
  499. &lt;li&gt;Vivek Gite aka nixCraft explains &lt;a href=&#34;https://www.cyberciti.biz/faq/find-check-tls-ssl-certificate-expiry-date-from-linux-unix/&#34;&gt;how to check the expiration date of a TLS/SSL certificate from the command line&lt;/a&gt;.&lt;/li&gt;
  500. &lt;li&gt;&lt;a href=&#34;https://klog.jotaen.net/&#34;&gt;This looks interesting&lt;/a&gt;.&lt;/li&gt;
  501. &lt;li&gt;While doing some research on GPG keys, I came across &lt;a href=&#34;https://jasonaowen.net/blog/2021/Jan/04/monitoring-gpg-key-expiration/&#34;&gt;this tool for monitoring GPG key expiration&lt;/a&gt;.&lt;/li&gt;
  502. &lt;/ul&gt;
  503. &lt;h2 id=&#34;programmingdevelopment&#34;&gt;Programming/Development&lt;/h2&gt;
  504. &lt;ul&gt;
  505. &lt;li&gt;Jamie Tanna explains &lt;a href=&#34;https://www.jvt.me/posts/2024/01/09/go-json-nullable/&#34;&gt;how to represent&lt;/a&gt; a JSON field in Go that could be absent, &lt;code&gt;null&lt;/code&gt;, or have a value.&lt;/li&gt;
  506. &lt;/ul&gt;
  507. &lt;h2 id=&#34;virtualization&#34;&gt;Virtualization&lt;/h2&gt;
  508. &lt;ul&gt;
  509. &lt;li&gt;Eric Sloof relates his experience &lt;a href=&#34;https://www.ntpro.nl/blog/archives/3752-Setting-Up-ESXi-ARM-on-the-Raspberry-Pi-5.html&#34;&gt;setting up ESXi ARM on a Raspberry Pi 5&lt;/a&gt;.&lt;/li&gt;
  510. &lt;li&gt;William Lam has &lt;a href=&#34;https://williamlam.com/2024/01/experimenting-with-esxi-cpu-affinity-and-intel-hybrid-cpu-cores.html&#34;&gt;published the results&lt;/a&gt; of some experiments with ESXi CPU affinity and Intel Hybrid CPU cores.&lt;/li&gt;
  511. &lt;/ul&gt;
  512. &lt;h2 id=&#34;careersoft-skills&#34;&gt;Career/Soft Skills&lt;/h2&gt;
  513. &lt;ul&gt;
  514. &lt;li&gt;Anyone thinking of getting &lt;a href=&#34;https://github.blog/2024-01-08-github-certifications-are-generally-available/&#34;&gt;a GitHub certification&lt;/a&gt;?&lt;/li&gt;
  515. &lt;/ul&gt;
  516. &lt;p&gt;It&amp;rsquo;s time to wrap up now; as always, I&amp;rsquo;d love to hear from readers about what you find useful (or not useful!) about the Technology Short Takes&amp;mdash;or any of the posts on my site. Feel free to reach out to me via social media; you can find &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;me on Twitter&lt;/a&gt; as well as &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;. I also tend to frequent a few different Slack communities, so you&amp;rsquo;re welcome to DM me there. Finally, if you&amp;rsquo;d like to drop me an e-mail, my address isn&amp;rsquo;t too hard to find. Thanks for reading!&lt;/p&gt;</description>
  517.      </item>
  518.    
  519.      <item>
  520.        <title>Technology Short Take 172</title>
  521.        <link>https://blog.scottlowe.org/2024/01/05/technology-short-take-172/</link>
  522.        <pubDate>Fri, 05 Jan 2024 08:30:00 -0600</pubDate>
  523.        <author>Scott Lowe</author>
  524.        <guid>https://blog.scottlowe.org/2024/01/05/technology-short-take-172/</guid>
  525.        <description>&lt;p&gt;Welcome to Technology Short Take #172, the first Technology Short Take of 2024! This one is &lt;em&gt;really&lt;/em&gt; short, which I&amp;rsquo;m assuming reflects a lack of blogging activity over the 2023 holiday season. Nevertheless, I have managed to scrape together a few links to share with readers. As usual, I hope you find something useful. Enjoy!&lt;/p&gt;
  526. &lt;h2 id=&#34;networking&#34;&gt;Networking&lt;/h2&gt;
  527. &lt;ul&gt;
  528. &lt;li&gt;Via &lt;a href=&#34;https://blog.ipspace.net/2024/01/public-cloud-labs.html&#34;&gt;this blog post&lt;/a&gt;, I learned that Ivan Pepelnjak has &lt;a href=&#34;https://github.com/ipspace/pubcloud&#34;&gt;a GitHub repository of hands-on examples&lt;/a&gt; for learning public cloud networking (including both AWS and Azure). Ivan&amp;rsquo;s materials are always excellent, so if you&amp;rsquo;re looking for resources to help with expanding your networking skills into the public cloud, this should be on the short list. (I plan to submit a PR soon to add Pulumi examples, which the repository is currently missing.)&lt;/li&gt;
  529. &lt;/ul&gt;
  530. &lt;h2 id=&#34;cloud-computingcloud-management&#34;&gt;Cloud Computing/Cloud Management&lt;/h2&gt;
  531. &lt;ul&gt;
  532. &lt;li&gt;Jonathan Major shares his experience &lt;a href=&#34;https://www.linkedin.com/pulse/working-pulumi-google-cloud-apis-jonathan-major-wi3zf&#34;&gt;using Pulumi with Google Cloud APIs&lt;/a&gt;. I think there are some code snippets in Jonathan&amp;rsquo;s article, but my instance of Firefox wouldn&amp;rsquo;t render the code snippets (instead only showing empty black boxes).&lt;/li&gt;
  533. &lt;li&gt;Nisar Ahmad &lt;a href=&#34;https://dzone.com/articles/terraform-vs-pulumi-which-is-better-for-your-iac-r&#34;&gt;explores&lt;/a&gt; whether Terraform or Pulumi is better for your use case.&lt;/li&gt;
  534. &lt;/ul&gt;
  535. &lt;h2 id=&#34;operating-systemsapplications&#34;&gt;Operating Systems/Applications&lt;/h2&gt;
  536. &lt;ul&gt;
  537. &lt;li&gt;Nick Janetakis shares another tip for &lt;a href=&#34;https://nickjanetakis.com/blog/docker-tip-96-see-how-long-a-container-ran-for&#34;&gt;determining how long a Docker container was running&lt;/a&gt;. He uses &lt;code&gt;grep&lt;/code&gt; against the output of &lt;code&gt;docker inspect&lt;/code&gt;, but I&amp;rsquo;m wondering if there&amp;rsquo;s a similar way of doing it using &lt;code&gt;jq&lt;/code&gt;.&lt;/li&gt;
  538. &lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/8-top-docker-tips-tricks-for-2024/&#34;&gt;Here&lt;/a&gt; is a list of eight Docker tips and tricks that you might find useful.&lt;/li&gt;
  539. &lt;/ul&gt;
  540. &lt;h2 id=&#34;programmingdevelopment&#34;&gt;Programming/Development&lt;/h2&gt;
  541. &lt;ul&gt;
  542. &lt;li&gt;&lt;a href=&#34;https://threedots.tech/post/making-games-in-go/&#34;&gt;This post&lt;/a&gt; explores the idea of writing games as a way of &amp;ldquo;reclaiming&amp;rdquo; the hobby of writing code (as a means for avoiding/preventing burnout).&lt;/li&gt;
  543. &lt;li&gt;I enjoyed reading &lt;a href=&#34;https://blog.liblab.com/pragmatic-engineers-philosophy-first-part/&#34;&gt;this first post on the pragmatic engineer&amp;rsquo;s philosophy&lt;/a&gt;. Although this article references additional posts, it doesn&amp;rsquo;t appear that any more posts on this topic have been published (yet).&lt;/li&gt;
  544. &lt;/ul&gt;
  545. &lt;h2 id=&#34;virtualization&#34;&gt;Virtualization&lt;/h2&gt;
  546. &lt;ul&gt;
  547. &lt;li&gt;William Lam shares a &lt;a href=&#34;https://williamlam.com/2024/01/quick-tip-new-method-to-mark-hdd-to-ssd-in-esxi-7-x-and-8-x-using-esxcli.html&#34;&gt;new method for marking a hard drive as an SSD&lt;/a&gt; in both ESXi 7.x and ESXi 8.x. As William mentions in the article, this can be useful when using nested ESXi or when the storage isn&amp;rsquo;t properly recognized.&lt;/li&gt;
  548. &lt;/ul&gt;
  549. &lt;h2 id=&#34;careersoft-skills&#34;&gt;Career/Soft Skills&lt;/h2&gt;
  550. &lt;ul&gt;
  551. &lt;li&gt;Yan Cui digs into the challenges around &lt;a href=&#34;https://theburningmonk.com/2019/11/how-to-break-the-senior-engineer-career-ceiling/&#34;&gt;breaking through the &amp;ldquo;senior engineer&amp;rdquo; career ceiling&lt;/a&gt;.&lt;/li&gt;
  552. &lt;li&gt;While reading the article in the previous bullet, I was pointed to this article on &lt;a href=&#34;https://charity.wtf/2019/09/08/reasons-not-to-be-a-manager/&#34;&gt;why someone wouldn&amp;rsquo;t want to be a manager&lt;/a&gt;. If, however, you&amp;rsquo;ve decided to become a manager anyway, then &lt;a href=&#34;https://thenewstack.io/help-im-a-leader-now/&#34;&gt;this article&lt;/a&gt; might be helpful to you.&lt;/li&gt;
  553. &lt;/ul&gt;
  554. &lt;p&gt;That&amp;rsquo;s all for this time around&amp;mdash;short, sweet, and to the point! I always love to hear feedback from readers, so feel free to find me online and reach out. I&amp;rsquo;m &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, and you can typically find me in a few different Slack communities (including the &lt;a href=&#34;https://slack.pulumi.com/&#34;&gt;Pulumi community Slack&lt;/a&gt;). Thanks for reading!&lt;/p&gt;</description>
  555.      </item>
  556.    
  557.      <item>
  558.        <title>Selectively Replacing Resources with Pulumi</title>
  559.        <link>https://blog.scottlowe.org/2024/01/03/selectively-replacing-resources-with-pulumi/</link>
  560.        <pubDate>Wed, 03 Jan 2024 11:00:00 -0600</pubDate>
  561.        <author>Scott Lowe</author>
  562.        <guid>https://blog.scottlowe.org/2024/01/03/selectively-replacing-resources-with-pulumi/</guid>
  563.        <description>&lt;p&gt;Because &lt;a href=&#34;https://www.pulumi.com/&#34;&gt;Pulumi&lt;/a&gt; operates declaratively, you can write a Pulumi program that you can safely run (via &lt;code&gt;pulumi up&lt;/code&gt;) multiple times. If no changes are needed&amp;mdash;meaning that the current state of the infrastructure matches what you&amp;rsquo;ve defined in your Pulumi program&amp;mdash;then nothing happens. If only one resource needs to be updated, then it will update only that one resource (and any dependencies, if there are any). There may be times, however, when you want to &lt;em&gt;force&lt;/em&gt; the replacement of specific resources. In this post, I&amp;rsquo;ll show you how to target specific resources for replacement when using Pulumi.&lt;/p&gt;
  564. &lt;p&gt;Here&amp;rsquo;s an example: I use Pulumi to manage my &lt;a href=&#34;https://aws.amazon.com/&#34;&gt;AWS&lt;/a&gt;-based lab resources, including &lt;a href=&#34;https://blog.scottlowe.org/2015/11/21/using-ssh-bastion-host/&#34;&gt;SSH bastion hosts&lt;/a&gt;. However, because my code uses a dynamic AMI lookup, I&amp;rsquo;ve instructed Pulumi to ignore changes in the AMI ID for the bastion hosts (by appending &lt;code&gt;pulumi.IgnoreChanges([]string{&amp;quot;ami&amp;quot;})&lt;/code&gt; as a resource option). This gives me the control over when the bastion hosts get replaced, instead of Pulumi wanting to replace them every time the AMI ID changes.&lt;/p&gt;
  565. &lt;p&gt;With this in place, then, how do I tell Pulumi that I&amp;rsquo;m ready to replace the bastion hosts? Tearing down the entire stack isn&amp;rsquo;t an option. Fortunately, the &lt;code&gt;pulumi&lt;/code&gt; CLI has a command-line flag that enables users to selectively destroy resources. The command looks like this:&lt;/p&gt;
  566. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pulumi destroy --target &amp;lt;urn&amp;gt;
  567. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will destroy &lt;em&gt;only&lt;/em&gt; the specified URNs (you can specify multiple &lt;code&gt;--target &amp;lt;urn&amp;gt;&lt;/code&gt; flags). On the next run of &lt;code&gt;pulumi up&lt;/code&gt;, Pulumi will note that the resources are missing, and recreate them&amp;mdash;in this case, using the latest AMI ID.&lt;/p&gt;
  568. &lt;p&gt;So how does one get the URNs for the resources? The &lt;code&gt;pulumi stack export&lt;/code&gt; command outputs JSON, and you can use tools like &lt;code&gt;gron&lt;/code&gt; and &lt;code&gt;jq&lt;/code&gt; to find and parse out the specific URNs you need. For example, to find EC2 instances in the stack, you could start like this:&lt;/p&gt;
  569. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pulumi stack export | gron - | grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ec2/instance:Instance&amp;#39;&lt;/span&gt;
  570. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will return some &amp;ldquo;flattened&amp;rdquo; JSON that will provide the specific path in the JSON output for any EC2 instances. You could then combine that with &lt;code&gt;jq&lt;/code&gt; to parse/extract the URN, like this:&lt;/p&gt;
  571. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pulumi stack export | jq &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.deployment.resources[21].urn&amp;#39;&lt;/span&gt;
  572. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Obviously, you&amp;rsquo;d need to change the &lt;code&gt;resources[21]&lt;/code&gt; to match whatever resources were returned by the earlier command with &lt;code&gt;gron&lt;/code&gt;.)&lt;/p&gt;
  573. &lt;p&gt;Once you&amp;rsquo;re armed with the appropriate URNs, you can pass them to the &lt;code&gt;pulumi destroy --target &amp;lt;urn&amp;gt;&lt;/code&gt; command to destroy the specific resources.&lt;/p&gt;
  574. &lt;p&gt;I will say that this all seems pretty obvious in retrospect, but I hope this information is useful to someone nevertheless. If you have any questions, feel free to find me online and I&amp;rsquo;ll do my best to answer them. I&amp;rsquo;m active &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, on &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;the Fediverse&lt;/a&gt;, and in various Slack communities (especially &lt;a href=&#34;https://slack.pulumi.com&#34;&gt;the Pulumi Community Slack&lt;/a&gt;).&lt;/p&gt;</description>
  575.      </item>
  576.    
  577.      <item>
  578.        <title>Dynamically Enabling the Azure CLI with Direnv</title>
  579.        <link>https://blog.scottlowe.org/2023/12/18/dynamically-enabling-azure-cli-with-direnv/</link>
  580.        <pubDate>Mon, 18 Dec 2023 08:30:00 -0600</pubDate>
  581.        <author>Scott Lowe</author>
  582.        <guid>https://blog.scottlowe.org/2023/12/18/dynamically-enabling-azure-cli-with-direnv/</guid>
  583.        <description>&lt;p&gt;I&amp;rsquo;m a big fan of &lt;a href=&#34;https://direnv.net/&#34;&gt;&lt;code&gt;direnv&lt;/code&gt;&lt;/a&gt;, the tool that lets you load and unload environment variables depending on the current directory. It&amp;rsquo;s so very useful! Not too terribly long ago, I wanted to find a way to &amp;ldquo;dynamically activate&amp;rdquo; the &lt;a href=&#34;https://learn.microsoft.com/en-us/cli/azure/&#34;&gt;Azure CLI&lt;/a&gt; using &lt;code&gt;direnv&lt;/code&gt;. Basically, I wanted to be able to have the Azure CLI disabled (no configuration information) unless I was in a directory where I needed or wanted it to be active, and be able to make it active using &lt;code&gt;direnv&lt;/code&gt;. I finally found a way to make it work, and in this blog post I&amp;rsquo;ll share how you can do this, too.&lt;/p&gt;
  584. &lt;p&gt;First, you&amp;rsquo;ll need both &lt;code&gt;direnv&lt;/code&gt; and the Azure CLI installed (obviously). I&amp;rsquo;ll leave this as an exercise for the readers, but I&amp;rsquo;ll mention that if you want to use Azure CLI in a Python virtual environment you might find &lt;a href=&#34;https://erick.navarro.io/blog/activate-python-virtualenv-automatically-with-direnv/&#34;&gt;this article&lt;/a&gt; really helpful.&lt;/p&gt;
  585. &lt;p&gt;Next, you&amp;rsquo;ll want to create a couple of directories. I chose to &amp;ldquo;hide&amp;rdquo; these directories in a &lt;code&gt;.config&lt;/code&gt; directory in my home directory. This directory is very commonly found (and used) on many Linux systems, but doesn&amp;rsquo;t typically exist on a macOS system. You can use this command to create the necessary directories:&lt;/p&gt;
  586. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.config/azure&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;,-fake&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
  587. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-p&lt;/code&gt; tells &lt;code&gt;mkdir&lt;/code&gt; to create the directory tree structure as needed, and the use of curly braces here means you&amp;rsquo;ll end up with both an &lt;code&gt;azure&lt;/code&gt; directory and an &lt;code&gt;azure-fake&lt;/code&gt; directory. One of these will be the &amp;ldquo;real&amp;rdquo; directory where a valid Azure CLI configuration is stored; the other is a &amp;ldquo;fake&amp;rdquo; directory that will remain empty. The names aren&amp;rsquo;t terribly important, but keep track of what names you use as you&amp;rsquo;ll need them shortly.&lt;/p&gt;
  588. &lt;p&gt;Third, you&amp;rsquo;ll configure your shell startup file(s) to point to the fake directory (&lt;code&gt;azure-fake&lt;/code&gt;, in my case). This is generally the same for both Bash and Zsh, and involves adding a line to your &lt;code&gt;~/.bashrc&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt;:&lt;/p&gt;
  589. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export AZURE_CONFIG_DIR&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.config/azure-fake&amp;#34;&lt;/span&gt;
  590. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this environment variable in place, the Azure CLI will be inactive, unable to function because it has no configuration.&lt;/p&gt;
  591. &lt;p&gt;The next step depends on whether you&amp;rsquo;ve ever configured or used the Azure CLI previously, or if this is a completely fresh installation:&lt;/p&gt;
  592. &lt;ul&gt;
  593. &lt;li&gt;If the &lt;em&gt;former&lt;/em&gt; (you&amp;rsquo;ve configured or used the Azure CLI previously), then copy everything from the current Azure configuration directory&amp;mdash;which defaults to &lt;code&gt;~/.azure&lt;/code&gt; on macOS and Linux, if I&amp;rsquo;m not mistaken&amp;mdash;to the new directory you created earlier. &lt;strong&gt;Don&amp;rsquo;t copy it to the fake directory specified in the environment variable above!&lt;/strong&gt; Once you&amp;rsquo;ve copied it, remove the old &lt;code&gt;~/.azure&lt;/code&gt; directory.&lt;/li&gt;
  594. &lt;li&gt;If the &lt;em&gt;latter&lt;/em&gt; (this is a fresh installation), no additional steps are needed (yet).&lt;/li&gt;
  595. &lt;/ul&gt;
  596. &lt;p&gt;The final step is to activate the Azure CLI where and when needed. This is done by setting the &lt;code&gt;AZURE_CONFIG_DIR&lt;/code&gt; environment variable to point to the &amp;ldquo;real&amp;rdquo; directory you created earlier (in my case, it was &lt;code&gt;~/.config/azure&lt;/code&gt;). Since we&amp;rsquo;re talking about using &lt;code&gt;direnv&lt;/code&gt;, then put this into an &lt;code&gt;.envrc&lt;/code&gt; file in the directory where you want or need the Azure CLI to be active:&lt;/p&gt;
  597. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export AZURE_CONFIG_DIR&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.config/azure&amp;#34;&lt;/span&gt;
  598. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;d already configured or used the Azure CLI, then when you are in a directory where &lt;code&gt;.envrc&lt;/code&gt; contains this line the Azure CLI will pick up the configuration you copied over earlier and should just work (depending on your credentials and such you might need to do an &lt;code&gt;az login&lt;/code&gt;). If this is a completely fresh installation of the Azure CLI, then you&amp;rsquo;ll definitely need to do an &lt;code&gt;az login&lt;/code&gt;, and then you should be good to go.&lt;/p&gt;
  599. &lt;p&gt;When you change out of a directory where &lt;code&gt;.envrc&lt;/code&gt; has been configured to activate the Azure CLI, then the default value for &lt;code&gt;AZURE_CONFIG_DIR&lt;/code&gt; kicks in&amp;mdash;taken from your shell&amp;rsquo;s startup file&amp;mdash;and the Azure CLI will be inactive again because it has no configuration. (It&amp;rsquo;s important to remember &lt;strong&gt;NOT&lt;/strong&gt; to run &lt;code&gt;az login&lt;/code&gt; when the fake directory is active.)&lt;/p&gt;
  600. &lt;p&gt;And that&amp;rsquo;s it! The essence of this trick is pointing the &lt;code&gt;AZURE_CONFIG_DIR&lt;/code&gt; to an empty directory with a non-existent Azure CLI configuration by default, then selectively pointing to a valid Azure CLI configuration using &lt;code&gt;direnv&lt;/code&gt; and an &lt;code&gt;.envrc&lt;/code&gt; file.&lt;/p&gt;
  601. &lt;p&gt;I hope you find this useful. If you have any feedback for me, I&amp;rsquo;m active &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, and I frequent a number of different Slack communities. I&amp;rsquo;d love to hear from you!&lt;/p&gt;</description>
  602.      </item>
  603.    
  604.      <item>
  605.        <title>Conditional Git Configuration</title>
  606.        <link>https://blog.scottlowe.org/2023/12/15/conditional-git-configuration/</link>
  607.        <pubDate>Fri, 15 Dec 2023 14:00:00 -0600</pubDate>
  608.        <author>Scott Lowe</author>
  609.        <guid>https://blog.scottlowe.org/2023/12/15/conditional-git-configuration/</guid>
  610.        <description>&lt;p&gt;Building on the earlier article on &lt;a href=&#34;https://blog.scottlowe.org/2023/12/11/automatically-transforming-git-urls/&#34;&gt;automatically transforming Git URLs&lt;/a&gt;, I&amp;rsquo;m back with another article on a (potentially powerful) feature of &lt;a href=&#34;https://www.git-scm.com&#34;&gt;Git&lt;/a&gt;&amp;mdash;the ability to conditionally include Git configuration files. This means you can configure Git to be configured (and behave) differently based on certain conditions, simply by including or not including Git configuration files. Let&amp;rsquo;s look at a pretty straightforward example taken from my own workflow.&lt;/p&gt;
  611. &lt;p&gt;Here&amp;rsquo;s a configuration stanza from my own system-wide Git configuration:&lt;/p&gt;
  612. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;includeIf&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gitdir:~/Work/Code/Repos/&amp;#34;&lt;/span&gt;]
  613. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt; = &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;~/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Work&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Code&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Repos&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;gitconfig&lt;/span&gt;
  614. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The key here is the &lt;code&gt;includeIf&lt;/code&gt; keyword. In this case, Git will include the referenced configuration file specified by &lt;code&gt;path&lt;/code&gt;, &lt;em&gt;if&lt;/em&gt; the location of the Git repository matches the path specification after &lt;code&gt;gitdir&lt;/code&gt;. Basically, what this means is that &lt;em&gt;all&lt;/em&gt; repositories under &lt;code&gt;~/Work/Code/Repos&lt;/code&gt; will trigger the inclusion of the additional configuration file.&lt;/p&gt;
  615. &lt;p&gt;Here&amp;rsquo;s the additional configuration file:&lt;/p&gt;
  616. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;]
  617. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;work-domain&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;com&lt;/span&gt;
  618. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;Scott&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Lowe&lt;/span&gt;
  619. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;commit&lt;/span&gt;]
  620. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpgsign&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
  621. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As long as I group all work-related repositories in the specified directory path, these values override the system-wide values. This means I can specify my work e-mail address as the e-mail address to be associated with commits to work-related repositories while all others use a different e-mail address. This configuration also allows me to disable GPG signing of commits for work-related repositories (i.e., repositories in the specified path), since I don&amp;rsquo;t have a GPG key associated with my work e-mail address.&lt;/p&gt;
  622. &lt;p&gt;Could you do this with per-repository configuration settings? &lt;em&gt;Absolutely.&lt;/em&gt; This configuration mechanism allows you to apply configuration settings to groups of repositories based on their filesystem location, instead of having to do the same thing on a per-repository basis.&lt;/p&gt;
  623. &lt;p&gt;I hope you find this information useful. Do feel free to hit me up&amp;mdash;&lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;, or in any of a variety of Slack communities&amp;mdash;if you have any questions or any feedback!&lt;/p&gt;</description>
  624.      </item>
  625.    
  626.      <item>
  627.        <title>Automatically Transforming Git URLs</title>
  628.        <link>https://blog.scottlowe.org/2023/12/11/automatically-transforming-git-urls/</link>
  629.        <pubDate>Mon, 11 Dec 2023 13:30:00 -0600</pubDate>
  630.        <author>Scott Lowe</author>
  631.        <guid>https://blog.scottlowe.org/2023/12/11/automatically-transforming-git-urls/</guid>
  632.        <description>&lt;p&gt;&lt;a href=&#34;https://www.git-scm.com/&#34;&gt;Git&lt;/a&gt; is one of those tools that lots of people use, but few people truly master. I&amp;rsquo;m still on my own journey of Git mastery, and still have so very far to go. However, I did take one small step forward recently with the discovery of the ability for Git to automatically rewrite remote URLs. In this post, I&amp;rsquo;ll show you how to configure Git to automatically transform the URLs of Git remotes.&lt;/p&gt;
  633. &lt;p&gt;The key here is the &lt;code&gt;url&lt;/code&gt; configuration stanza and the associated &lt;code&gt;insteadOf&lt;/code&gt; keyword. Added to your Git configuration&amp;mdash;either globally or on a per-repository basis&amp;mdash;these configuration options will tell Git to use a different URL every time it encounters the specified original URL.&lt;/p&gt;
  634. &lt;p&gt;Here&amp;rsquo;s an example:&lt;/p&gt;
  635. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;git@github.com:org/&amp;#34;&lt;/span&gt;]
  636. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;insteadOf&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/org/&amp;#34;&lt;/span&gt;
  637. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;git@github.com:org/&lt;/code&gt; is the &lt;em&gt;replacement&lt;/em&gt; URL; that is, the URL that you want Git to use. The URL specified by the &lt;code&gt;insteadOf&lt;/code&gt; keyword is the &lt;em&gt;original&lt;/em&gt; URL; that is, the URL you want Git to replace. As you can see in the example, it&amp;rsquo;s possible not only to transform HTTPS-based URLs to SSH URLs (or vice versa), but it&amp;rsquo;s possible to constrain this transformation to repositories belonging to a specific organization or user. Being able to constrain the transformation of URLs is extraordinarily handy; I use this functionality to use SSH URLs for my work-related repositories automatically without affecting other GitHub-based URLs.&lt;/p&gt;
  638. &lt;p&gt;With this configuration in place, I could do this:&lt;/p&gt;
  639. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/org/repository.git
  640. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But running &lt;code&gt;git remote -v&lt;/code&gt; in the newly-cloned repository would show this:&lt;/p&gt;
  641. &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;origin    git@github.com:org/repository.git &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;fetch&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
  642. &lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;origin    git@github.com:org/repository.git &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;push&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
  643. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Useful, wouldn&amp;rsquo;t you say?&lt;/p&gt;
  644. &lt;p&gt;Got any other nifty but perhaps not-so-well-known Git features? Hit me up and share your favorite! You can reach me via a few different Slack communities (&lt;a href=&#34;https://pulumi-community.slack.com/&#34;&gt;Pulumi&lt;/a&gt;, &lt;a href=&#34;https://kubernetes.slack.com/&#34;&gt;Kubernetes&lt;/a&gt;), &lt;a href=&#34;https://fosstodon.org/@scottslowe&#34;&gt;on the Fediverse&lt;/a&gt;, and &lt;a href=&#34;https://twitter.com/scott_lowe&#34;&gt;on Twitter&lt;/a&gt;. I&amp;rsquo;d love to hear from you!&lt;/p&gt;</description>
  645.      </item>
  646.    
  647.  </channel>
  648. </rss>
  649.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda