<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Infinite Horizon Blog by Roozbeh]]></title><description><![CDATA[Cutting-edge insights, trends, and strategies in Cloud, DevOps, SRE and Platform Engineering for modern tech leaders.]]></description><link>https://www.roozbeh.net</link><image><url>https://substackcdn.com/image/fetch/$s_!-ttq!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9ce2c85-3450-450d-a4c6-989a8d6fa3d8_162x162.png</url><title>Infinite Horizon Blog by Roozbeh</title><link>https://www.roozbeh.net</link></image><generator>Substack</generator><lastBuildDate>Wed, 06 May 2026 10:40:19 GMT</lastBuildDate><atom:link href="https://www.roozbeh.net/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Roozbeh Shafiee]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[roozbeh@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[roozbeh@substack.com]]></itunes:email><itunes:name><![CDATA[Roozbeh Shafiee]]></itunes:name></itunes:owner><itunes:author><![CDATA[Roozbeh Shafiee]]></itunes:author><googleplay:owner><![CDATA[roozbeh@substack.com]]></googleplay:owner><googleplay:email><![CDATA[roozbeh@substack.com]]></googleplay:email><googleplay:author><![CDATA[Roozbeh Shafiee]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[OpenTofu and Terraform Naming Conventions]]></title><description><![CDATA[In the previous blog post, I wrote about the principles and best practices of IaC design.]]></description><link>https://www.roozbeh.net/p/opentofu-and-terraform-naming-conventions</link><guid isPermaLink="false">https://www.roozbeh.net/p/opentofu-and-terraform-naming-conventions</guid><dc:creator><![CDATA[Roozbeh Shafiee]]></dc:creator><pubDate>Sat, 28 Dec 2024 15:18:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xQd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3xQd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3xQd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3xQd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3xQd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3xQd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3xQd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1552202,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3xQd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3xQd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3xQd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3xQd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F662bbff1-23b6-48e6-9e60-62ac312a750e_1792x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the previous blog post, I wrote about the principles and best practices of IaC design. To complete the topic of standardization, it is important to consider a standardized codebase. This helps you collaborate more effectively with your teammates in maintaining Terraform modules within your organization and supports development teams in doing so as well. In this post, I&#8217;m going to share my experiences with naming conventions for writing a standard block of OpenTofu and Terraform code. Some of these conventions are useful for creating a standard Terraform file, while others are necessary due to restrictions in providers&#8217; APIs, such as those from AWS and Azure.</p><h3>General Conventions</h3><ul><li><p>Always use <code>_</code> (underscore) instead of <code>&#8212;</code> (dash)</p><pre><code>resource "aws_db_instance" "dev_db" {
  ...
  name = "backend_db_instance"
  ...
}</code></pre></li><li><p>Only use lowercase letters and numbers</p><pre><code>resource "aws_key_pair" "ops" {
  key_name   = "roozbeh_key_1"
  public_key = "ssh-rsa ..."
}</code></pre></li></ul><h3>Resource and Data Source Conventions</h3><ul><li><p>Do not repeat resource type in resource name (not partially, nor completely)</p><pre><code>resource "aws_route_table" "public" {
  vpc_id = aws_vpc.example.id
  ...
}</code></pre></li><li><p>Resource name should be named <code>this</code> if there is no more descriptive and general name available</p><pre><code>resource "aws_nat_gateway" "this" {
  allocation_id = aws_eip.nat.id
  subnet_id     = aws_subnet.example.id
  ...
}</code></pre></li><li><p>Always use singular nouns for names</p><pre><code>resource "aws_eip" "loadbalancer" {
  instance = aws_instance.web.id
  vpc      = true
}</code></pre></li><li><p>Use <code>-</code> inside arguments values and in places where value will be exposed to a human (eg, inside DNS name of RDS instance or Route 53 record)</p><pre><code>resource "aws_route53_record" "www" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = "www.example-domain.com"
  type    = "A"
  ttl     = "300"
  records = [aws_eip.lb.public_ip]
}</code></pre></li><li><p>Include <code>count</code> an argument inside resource blocks as the first argument at the top and separated by a newline after it</p><pre><code>resource "aws_instance" "web" {
  count = "5"
  ...
}</code></pre></li><li><p>Include <code>tags</code> the argument, if supported by resources as the last real argument, followed by <code>depends_on</code> and <code>lifecycle</code>, if necessary. All of these should be separated by a single empty line:</p><pre><code>resource "aws_nat_gateway" "this" {
  count         = "1"

  ...

  tags = {
    Name = "..."
  }

  depends_on = ["aws_internet_gateway.this"]

  lifecycle {
    create_before_destroy = true
  }
}</code></pre></li><li><p>When using conditions in <code>count</code> argument use a boolean value if it makes sense, otherwise, use <code>length</code> or other interpolation:</p><pre><code>count = "${length(var.public_subnets) &gt; 0 ? 1 : 0}"</code></pre></li><li><p>To make inverted conditions don&#8217;t introduce another variable unless necessary, use <code>1 - boolean value</code> instead:</p><pre><code>count = "${1 - var.create_public_subnets}"</code></pre></li></ul><h3>Variable Conventions</h3><ul><li><p>Don&#8217;t reinvent the wheel in resource modules &#8212; use the same variable names, description, and default as defined in the &#8220;Argument Reference&#8221; section for the resource you are working on.</p></li></ul><ul><li><p>Use <code>type = "list"</code> declaration if there is <code>default = []</code>:</p><pre><code>variable "availability_zone_names" {
  type    = list(string)
  default = [
    "eu-central-1a"
    "eu-central-1b"
    "eu-central-1c"
  ]
}</code></pre></li><li><p>Use <code>type = "map"</code> declaration if there is <code>default = {}</code> :</p><pre><code>variable "images" {
  type = "map"

  default = {
    eu-central-1 = "image-1234"
    eu-west-1    = "image-4567"
  }
}</code></pre></li><li><p>Use the plural form in the name of variables of type <code>list</code> and <code>map</code> :</p><pre><code>variable "users" {
  type    = "list"
  ...
}

variable "images" {
  type = "map"
  ...
}</code></pre></li><li><p>When defining variables order the keys: <code>description</code> , <code>type</code>, <code>default</code> . Always include <code>description</code> for all variables even if you think it is obvious.</p><pre><code>variable "key" {
  description = "description"
  type        = "string"
  default     = "value"
}</code></pre></li></ul><h3>Outputs</h3><p>A name for the outputs is important to make them consistent and understandable outside of its scope (when the user is using a module it should be obvious what type and attribute of the value are returned).</p><ul><li><p>The general recommendation for output names is that they should be descriptive of the value they contain and less free-form than you would normally want.</p></li><li><p>Good structure for names of output looks like <code>{name}_{type}_{attribute}</code> , where:<br>1. <code>{name}</code> is a resource or data source name without a provider prefix. <code>{name}</code> for <code>aws_subnet</code> is <code>subnet</code>, for<code>aws_vpc</code> it is <code>vpc</code>.<br>2. <code>{type}</code> is a type of resource source.<br>3. <code>{attribute}</code> is an attribute returned by the output</p></li><li><p>If the output is returning a value with interpolation functions and multiple resources, <code>{name}</code> and <code>{type}</code> there should be as generic as possible (<code>this</code> is often the most generic and should be preferred).</p></li><li><p>If the returned value is a list it should have a plural name.</p></li><li><p>Always include <code>description</code> for all outputs even if you think it is obvious.</p></li></ul><h2>Conclusion</h2><p>This approach improves collaboration between you and your teammates, ensuring that everyone is able to work together more efficiently when maintaining and updating Terraform modules across your organization. By establishing a standardized process, it also provides better consistency and clarity, which not only streamlines the workflow within your immediate team but also enables development teams throughout the organization to follow best practices, reduce errors, and achieve better integrations during the development and deployment of infrastructure as code.</p>]]></content:encoded></item><item><title><![CDATA[IaC Design Principles]]></title><description><![CDATA[There are several principles in designing an Infrastructure as Code (IaC) that DevOps and Cloud Engineering teams should follow from day zero or should be considered for refactoring an existing setup.]]></description><link>https://www.roozbeh.net/p/iac-design-principles</link><guid isPermaLink="false">https://www.roozbeh.net/p/iac-design-principles</guid><dc:creator><![CDATA[Roozbeh Shafiee]]></dc:creator><pubDate>Sat, 28 Dec 2024 14:54:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qkjr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qkjr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qkjr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!qkjr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!qkjr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!qkjr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qkjr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3253034,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qkjr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!qkjr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!qkjr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!qkjr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed8a1773-bd3c-47d6-bcee-019f88f7ceb5_1792x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are several principles in designing an Infrastructure as Code (IaC) that DevOps and Cloud Engineering teams should follow from day zero or should be considered for refactoring an existing setup. IaC is not just well-structured code in HCL formatted files and sequential commands (init, plan, apply, etc); it also requires a broad design and, like any other system must have a scalable and extensible architecture.</p><p>This blog post is the conclusion of my experiences since 2016 when I started working with Terraform. In the following, eleven principles and best practices of an IaC design are explained briefly although each one would require a separate post or series of posts to cover in detail.</p><h3>GitOps</h3><p>That&#8217;s a &#8220;Must-Have&#8221;! Transparency between developers for any changes through pull requests, using Git tags, and setting up a pipeline for automated planning and applying via GitOps is essential. In the following, all Git-related principles will be explained. Therefore, it&#8217;s important to incorporate GitOps into all aspects of IaC design.</p><h3>DRY</h3><p>Don&#8217;t Repeat Yourself! In an IaC codebase, there is often shared or common code across modules, outputs, environments, stacks, regions, etc. As the setup grows, the code tends to be repeated making maintenance increasingly difficult over time. To simplify your IaC structure, consider integrating Terraform or OpenTofu with a thin wrapper like Terragrunt, or include/call reusable code from parent directories in Pulumi. This approach keeps the codebase simpler, shorter, and easier to maintain. So, avoid designing with pure Terraform or OpenTofu.</p><h3>Isolation</h3><p>Assign a separate repository for each team. By isolating each team&#8217;s resources, this approach reduces pull request traffic and simplifies managing change requests. Besides that, issues with the plan/apply pipeline or broken codebase in one repository won&#8217;t affect other teams. Also, maintaining the CODEOWNERS file and assigning reviewers becomes much easier.</p><h3>Directory Structure</h3><p>Organizing resource templates simplifies your daily tasks. One of the operations with IaC is managing existing code by adding, updating, or deleting resources. It&#8217;s important to find them easily, especially when facing with a large environment. So, it&#8217;s more convenient to follow a hierarchy and group template files based on provider, environment, stack, or any other structure that meets your needs.</p><h3>Modularization</h3><p>Instead of repeating yourself by writing raw Terraform &#8220;resource&#8221; blocks, create modules based on developers&#8217; use cases, call them with Terragrunt, and reuse them across multiple stacks and environments. This way, any changes to the modules will automatically be reflected in all the resources across stacks and environments, making it easier to enforce DevOps standards and policies consistently through the modules.</p><h3>Versioning</h3><p>It&#8217;s important to keep the modules in a separate Git repository, apart from the teams&#8217; repositories. This allows you to manage module versioning using Git tags and protects existing resources in the teams&#8217; repositories from new or breaking changes. Resources within stacks can then be migrated to the newer version when they are ready or once they are compatible with the updated parameters.</p><h3>Remote State</h3><p>Keeping state files in remote storage solutions like S3 is a common practice. Storing them remotely allows you to use the versioning feature, enabling you to revert to previous versions in case of state file corruption. This approach is also essential when your entire IaC configuration is managed in Git and you rely on pipelines to plan and apply changes. Also, remote storage is much safer than storing state files locally, providing better security and reliability.</p><h3>Encrypted Secrets</h3><p>DO NOT store credentials in plain text within templates. Secrets should always be stored in a secure service like AWS Secrets Manager (or similar services from other providers) or HashiCorp Vault. These secrets can then be fetched using &#8220;data source&#8221; blocks in modules and passed as input variables in your IaC repositories and stacks. This ensures that secrets remain safe and are never stored in plain text, even in state files. Additionally, this approach supports secret rotation and can be integrated into Kubernetes deployments, enabling secrets to be shared securely between your IaC and containerized workloads.</p><h3>Auto-Tagging</h3><p>An auto-tagging mechanism is highly beneficial, allowing each resource managed by IaC to be tagged based on the directory structure and hierarchy. Tags can include the Git repository name, environment, stack, resource type, resource name, and an additional tag like &#8220;IaC = true.&#8221; This approach simplifies tag tracking to determine where the IaC code resides, where the resource originated from, and whether it was created by IaC. Moreover, this tagging strategy helps the FinOps team in tracking the costs of specific environments, teams, or stacks using the provider Cost Explorer or third-party tools like Looker.</p><h3>Import-as-Code</h3><p>The import block was recently introduced by OpenTofu and Terraform. At first glance, it may seem a bit static, but when combined with the <strong>locals</strong> block in modules and a map of strings as an input variable, it can significantly simplify the process for DevOps teams. This approach enables the implementation of an import-as-code mechanism, allowing resources to be imported by simply defining the corresponding templates. As a result, there&#8217;s no need for the tedious use of terraform import commands, making it much easier to import manually created resources&#8212;especially when providing DevOps services in a self-service model to developers.</p><h3>Policy-as-Code</h3><p>With Policy-as-Code, DevOps teams can more easily define and enforce policies, standards, and best practices across development teams. Policies such as blocking all network protocols and ports to the internet through security groups, preventing IAM FullAccess, or restricting the creation of expensive EC2 instance types, among others, can be controlled and managed using tools like Open Policy Agent and HashiCorp Sentinel. These tools can be integrated at the module level, providing significant benefits in terms of security enforcement, performance optimization, and cost control.</p><h3>Pipeline</h3><p>After implementing all principles, especially the Git-related ones, a pipeline becomes essential to achieve full automation. The process starts when you make a change to your IaC templates, create a pull request, and request a code review from a teammate. Like modern software development workflows using CI/CD, the pipeline should then roll out your infrastructure changes to the target environment. This can be accomplished using various solutions, such as an open-source tool like Atlantis, integrating with an existing CI/CD tool like Jenkins, or leveraging cloud-based platforms like Terraform Cloud or Pulumi Cloud. The pipeline continuously monitors the Git repositories via webhooks, triggers a plan, and waits for your approval to apply the changes.</p><h3>Documentation</h3><p>Last, but not least, it&#8217;s crucial to document every aspect of your IaC for the benefit of other teammates in DevOps. As the design becomes complex and requires periodic maintenance, clear documentation will be essential. Additionally, providing detailed documentation for modules, explaining how to onboard new resources into IaC, and outlining the required and optional input parameters and variables is invaluable. This is especially helpful when your DevOps workflows are designed for a self-service model, enabling developers to easily understand and use the infrastructure.</p><h2>Conclusion:</h2><p>This summarizes everything I&#8217;ve learned about designing an IaC system over the years. Each point mentioned in this blog post deserves a dedicated article for a more detailed explanation, and I plan to write about them in the future.</p><p>As new features are introduced by tools like HashiCorp, OpenTofu, Pulumi, and others, IaC may become even more complex. As a result, IaC is evolving into a specialized field within DevOps, making it crucial to continuously learn and stay up to date with market trends.</p>]]></content:encoded></item><item><title><![CDATA[Tracking and Resolving IaC Drifts]]></title><description><![CDATA[By initiating deployment and provisioning of cloud infrastructure resources using an IaC tool, three entities to be built upon the development and apply.]]></description><link>https://www.roozbeh.net/p/tracking-and-resolving-iac-drifts</link><guid isPermaLink="false">https://www.roozbeh.net/p/tracking-and-resolving-iac-drifts</guid><dc:creator><![CDATA[Roozbeh Shafiee]]></dc:creator><pubDate>Sat, 28 Dec 2024 14:49:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!H4TI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H4TI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H4TI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!H4TI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!H4TI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!H4TI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H4TI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png" width="728" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/faf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:2697771,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!H4TI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!H4TI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!H4TI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!H4TI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaf91bc0-b372-47ad-9e89-55fc834b6361_1792x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By initiating deployment and provisioning of cloud infrastructure resources using an IaC tool, three entities to be built upon the development and apply. I call them sources of truth that they should be in sync to keep the IaC setup properly. Nowadays IaC solutions like OpenTofu, Terraform, and Pulumi follow this structure and approach. These sources are:</p><ul><li><p><strong>Upstream Resources:</strong> The resources that are created by IaC tools on Cloud providers, such as EC2 instances, RDS databases, VPC networks, and so on.</p></li></ul><ul><li><p><strong>State File:</strong> A file that stores the state of upstream resources in JSON format. it&#8217;s a reference used by the IaC tool to what has been created on the cloud and stores the state, IDs, links, etc.</p></li></ul><ul><li><p><strong>Template:</strong> A file developed by a human and depends on the IaC tool, in various formats like HCL, Python, Golang, etc. This file defines, the desired state of each resource on the cloud. States like EC2 instance types, S3 bucket name, RDS username, and many other parameters for each resource type.</p></li></ul><p>These three sources form the foundation of an Infrastructure as Code setup and understanding each component is crucial for successfully managing your IaC.</p><p>Pushing components out of sync is unavoidable and can occur for various reasons, such as quick response to a service outage or incident by modifying infrastructure/upstream resources or human errors. These events cause IaC to become desynchronized state and understanding how these changes affect your setup is crucial for maintaining your IaC system.</p><p>Let&#8217;s dive into each source of truth and explore what to expect when any of them is out of sync state. We will investigate each source of truth through three events: Creation, Modification, and Deletion.</p><h3>Upstream Resource:</h3><p>This situation occurs during an incident or application outage, and quick actions and manual changes on infrastructure resources are necessary to resolve the issue. Also, It is especially common when someone is unfamiliar with IaC and prefers to make direct manual modifications.</p><ul><li><p>Deleting and recreating a resource can trigger creation by the IaC apply process. The apply process might fail if the resource is referenced in the state file by its name as its ID (like an S3 bucket)</p></li></ul><ul><li><p>Modifying a resource triggers an update during the IaC plan/apply process due to re-align sources of truth. This situation is usually referred to as &#8220;Drift&#8221; when the actual state of the resource diverges from the desired state defined in the state file and the template.</p></li></ul><ul><li><p>Removing a resource can trigger recreation during the IaC plan/apply process, as the IaC tool will attempt to restore it to match the desired configuration defined in the template.</p></li></ul><h3>State File:</h3><p>Changes in state files are rare, especially when stored in remote backends like cloud object storage (S3). However, they can occur during manual maintenance tasks, such as modifying or moving states between multiple state files.</p><ul><li><p>Creating a state can trigger deletion during the IaC plan/apply process if resources with the same ID already exist upstream. This occurs because the state file prioritizes the template as the primary source of truth and attempts to synchronize upstream resources with the desired state defined in the template.</p></li></ul><ul><li><p>Modifying the state file triggers change during the plan/apply process. However, if the template and upstream resources remain unchanged, no actual changes will occur in the infrastructure; the modification will only affect the state file.</p></li></ul><ul><li><p>Removing a state triggers creation during the plan/apply process, and the IaC tool attempts to synchronize the resource with the template, which serves as the primary source of truth. Additionally, the apply process might fail if the resource exists upstream and is identified by its name as ID ( like S3 bucket)</p></li></ul><h3>Template File:</h3><p>Finally, any changes made to the template file directly reflect your defined and desired configuration. Creation in the template results in resource creation, modifications trigger changes, and removals result in upstream resource termination. This process is the standard procedure for managing your infrastructure by IaC.</p><h2>Conclusion:</h2><p>In IaC changes and misalignments are unavoidable, often requiring manual adjustments to restore synchronization. However, it&#8217;s best to make changes to upstream resources using the template files. This way, you can minimize manual changes to the state files, helping to maintain consistency and prevent problems. Understanding the effects of changes on each component is crucial for analyzing the situation and making informed decisions on infrastructure stability.</p>]]></content:encoded></item><item><title><![CDATA[7 Podcasts I Listen to Every Week]]></title><description><![CDATA[These days, the lockdown situation is a good opportunity to grow your skills by learning new technologies in your spare time or follow the community by reading articles or listening to podcasts.]]></description><link>https://www.roozbeh.net/p/7-podcasts-you-must-follow-as-a-devops-sre-or-cloud-engineer-d1a31b4b8ce0</link><guid isPermaLink="false">https://www.roozbeh.net/p/7-podcasts-you-must-follow-as-a-devops-sre-or-cloud-engineer-d1a31b4b8ce0</guid><dc:creator><![CDATA[Roozbeh Shafiee]]></dc:creator><pubDate>Sun, 10 May 2020 15:32:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e6de6a8e-5cf5-43c0-a60a-1f5511897580_960x540.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jn30!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jn30!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jn30!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jn30!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jn30!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jn30!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/deb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jn30!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jn30!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jn30!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jn30!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb623db-2069-4db9-b88a-1b697126077b_960x540.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>These days, the lockdown situation is a good opportunity to grow your skills by learning new technologies in your spare time or follow the community by reading articles or listening to podcasts. Specially for multi-thread brains, when you are working in a noisy environment at home, listening to podcasts in parallel, can help you to focus on your work,&nbsp;better.</p><p>Although you may know some or all of them it&#8217;s a good idea to list them here for people who want to be a hero in related technologies. In the following, I&#8217;m going to introduce 7 podcasts to follow for every single DevOps, SRE, or Cloud engineer and all are available on Spotify, Apple Podcasts, and Google Podcasts.</p><h3>Command Line&nbsp;Heroes</h3><p>This series of podcasts is produced by Red Hat every week and 3 seasons are published up to this time. The stories of this podcast are about the people transforming technology from the command line.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8ad5dff299e9c86cd6126fea8f&quot;,&quot;title&quot;:&quot;Command Line Heroes&quot;,&quot;subtitle&quot;:&quot;Red Hat&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/4Jgtgr4mHXNDyLldHkfEMz&quot;,&quot;belowTheFold&quot;:false,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/4Jgtgr4mHXNDyLldHkfEMz" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" data-component-name="Spotify2ToDOM"></iframe><h3>Kubernetes Podcast From&nbsp;Google</h3><p>A weekly podcast focused on what&#8217;s happening in the Kubernetes community covering Kubernetes, cloud-native applications, and other developments in the Kubernetes community. Co-hosts are Adam Glick and Craig&nbsp;Box.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8ab1be3dba74bcd9a1e77591a1&quot;,&quot;title&quot;:&quot;Kubernetes Podcast from Google&quot;,&quot;subtitle&quot;:&quot;Abdel Sghiouar, Kaslin Fields&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/0AsnxlMtXRUEeZkIO0ScpJ&quot;,&quot;belowTheFold&quot;:false,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/0AsnxlMtXRUEeZkIO0ScpJ" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" data-component-name="Spotify2ToDOM"></iframe><h3>Google Cloud Platform&nbsp;Podcasts</h3><p>The Google Cloud Platform Podcast, coming to you every week. Discussing everything on Google Cloud Platform from App Engine to Big Query. This is an official podcast by&nbsp;Google.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8a78011304be456238d3aa994b&quot;,&quot;title&quot;:&quot;Google Cloud Platform Podcast&quot;,&quot;subtitle&quot;:&quot;Google Cloud Platform&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/2R4g405hZJRSlJjYZWIYxr&quot;,&quot;belowTheFold&quot;:true,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/2R4g405hZJRSlJjYZWIYxr" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" loading="lazy" data-component-name="Spotify2ToDOM"></iframe><p></p><h3>AWS Podcast</h3><p>The AWS Podcast is the definitive cloud platform podcast for developers, dev ops, and cloud professionals seeking the latest news and trends in storage, security, infrastructure, serverless, and more. Join Simon Elisha and Jeff Barr for regular updates, deep dives, and interviews. Whether you&#8217;re building machine learning and AI models, open-source projects, or hybrid cloud solutions, the AWS Podcast has something for&nbsp;you.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8a49f81331af04ec3614a5a741&quot;,&quot;title&quot;:&quot;AWS Podcast&quot;,&quot;subtitle&quot;:&quot;Amazon Web Services&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/363iMcjThX5KNpfSHPRAjj&quot;,&quot;belowTheFold&quot;:true,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/363iMcjThX5KNpfSHPRAjj" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" loading="lazy" data-component-name="Spotify2ToDOM"></iframe><h3>The Cloudcast</h3><p>The Cloudcast is the industry&#8217;s leading, independent Cloud Computing podcast. Since 2011, co-hosts Aaron Delp &amp; Brian Gracely have interviewed technology and business leaders who are shaping the future of computing. Topics are mostly about Cloud Computing, Open Source, AWS, Azure, GCP, Serverless, DevOps, Big Data, ML, AI, Security, Kubernetes, AppDev, SaaS, PaaS, CaaS, IoT, and many&nbsp;more.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8af72187235f0798a0e8825a5e&quot;,&quot;title&quot;:&quot;The Cloudcast&quot;,&quot;subtitle&quot;:&quot;Massive Studios&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/2lMNZTPmS57TUZAMdJGuiM&quot;,&quot;belowTheFold&quot;:true,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/2lMNZTPmS57TUZAMdJGuiM" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" loading="lazy" data-component-name="Spotify2ToDOM"></iframe><h3>The Real Python Podcast</h3><p>A weekly Python podcast hosted by Christopher Bailey with interviews, coding tips, and conversation with guests from the Python community. The show covers a wide range of topics including Python programming best practices, career tips, and related software development topics. Listen to that every Friday morning to hear what's new in the world of Python programming and become a more effective Pythonista.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8abfec0ecec1c2c60f30fd4cec&quot;,&quot;title&quot;:&quot;The Real Python Podcast&quot;,&quot;subtitle&quot;:&quot;Real Python&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/41Av6Rq81LfOT3Volz7W9D&quot;,&quot;belowTheFold&quot;:true,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/41Av6Rq81LfOT3Volz7W9D" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" loading="lazy" data-component-name="Spotify2ToDOM"></iframe><h3>Go Time</h3><p>A diverse panel and special guests discuss cloud infrastructure, distributed systems, microservices, Kubernetes, Docker, and also Go! Panelists include Mat Ryer, Ashley McNamara, Johnny Boursiquot, Carmen Andoh, Jaana B. Dogan (JBD), Mark Bates, and Jon Calhoun. This show records LIVE every Tuesday at 3 pm US&nbsp;Eastern.</p><iframe class="spotify-wrap podcast" data-attrs="{&quot;image&quot;:&quot;https://i.scdn.co/image/ab6765630000ba8aa8435a03f60750c2228fbc09&quot;,&quot;title&quot;:&quot;Go Time: Golang, Software Engineering&quot;,&quot;subtitle&quot;:&quot;Changelog Media&quot;,&quot;description&quot;:&quot;Podcast&quot;,&quot;url&quot;:&quot;https://open.spotify.com/show/2cKdcxETn7jDp7uJCwqmSE&quot;,&quot;belowTheFold&quot;:true,&quot;noScroll&quot;:false}" src="https://open.spotify.com/embed/show/2cKdcxETn7jDp7uJCwqmSE" frameborder="0" gesture="media" allowfullscreen="true" allow="encrypted-media" loading="lazy" data-component-name="Spotify2ToDOM"></iframe>]]></content:encoded></item><item><title><![CDATA[Hello World!]]></title><description><![CDATA[As the first official blog post, I would keep it simple and short.]]></description><link>https://www.roozbeh.net/p/hello-world-1f34e4353b6a</link><guid isPermaLink="false">https://www.roozbeh.net/p/hello-world-1f34e4353b6a</guid><dc:creator><![CDATA[Roozbeh Shafiee]]></dc:creator><pubDate>Fri, 08 May 2020 15:27:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/24686dd6-1c5f-4ef1-99eb-9eefcfe93736_880x440.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V_7D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V_7D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 424w, https://substackcdn.com/image/fetch/$s_!V_7D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 848w, https://substackcdn.com/image/fetch/$s_!V_7D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!V_7D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V_7D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!V_7D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 424w, https://substackcdn.com/image/fetch/$s_!V_7D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 848w, https://substackcdn.com/image/fetch/$s_!V_7D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!V_7D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c7d5e3b-99d7-4647-b9cb-35269b3a0e32_880x440.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>As the first official blog post, I would keep it simple and short. This is post-0. But before we get started, it&#8217;s necessary to introduce myself briefly to whom it may&nbsp;concern.</p><p>Several years ago for more than 10 years, I was a blogger mostly at System Engineering topics. As I moved to Germany 4 years ago and my career slowly switched to development and operation, like the thing we call that DevOps these days, I decided to back to blogging for sharing my experiences and knowledge that I daily&nbsp;gain.</p><p>The previous blog archive is available but as the world of software engineering is rapidly changing every day, I think so it&#8217;s not worth restoring and continue that anymore. So that&#8217;s why I start this&nbsp;blog.</p><p>I will try to keep it update every weekend either on Saturday or Sunday and like before, mostly at tech topics. For sure nobody&#8217;s perfect but I try to be&nbsp;nobody!</p><p>My professional social network links are accessible on sidebar in left. If you are interested in my thoughts, posts. tweets and generally my activities, follow&nbsp;me!</p>]]></content:encoded></item></channel></rss>