<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutorial on Dev &amp; Platform Engineering Hub</title><link>https://rhidayat.work/topics/tutorial/</link><description>Recent content in Tutorial on Dev &amp; Platform Engineering Hub</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Rachmat Hidayat</copyright><lastBuildDate>Sun, 09 Aug 2026 21:50:00 +0000</lastBuildDate><atom:link href="https://rhidayat.work/topics/tutorial/index.xml" rel="self" type="application/rss+xml"/><item><title>Kratix Ep 11: Full IDP Integration with Backstage</title><link>https://rhidayat.work/series/kratix/11-full-idp-integration-unified-dashboard/</link><pubDate>Sun, 09 Aug 2026 21:50:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/11-full-idp-integration-unified-dashboard/</guid><description>While kubectl is powerful, it is not a Developer Portal. In this episode, we integrate Kratix with Backstage, creating a unified Web UI where developers can browse the service catalog, request infrastructure, and monitor their applications without ever opening a terminal.</description></item><item><title>Kratix Ep 10: Observability and Operations</title><link>https://rhidayat.work/series/kratix/10-observability-and-operations/</link><pubDate>Sun, 09 Aug 2026 21:40:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/10-observability-and-operations/</guid><description>Operating a multi-cluster architecture introduces a massive observability challenge. If a Kratix Pipeline fails, the logs are in the Platform cluster. If the physical database fails, the logs are in the Worker cluster. In this episode, we build a centralized monitoring stack using Prometheus and Grafana.</description></item><item><title>Kratix Ep 9: Promise CI/CD with GitHub Actions</title><link>https://rhidayat.work/series/kratix/09-promise-cicd-github-gitlab/</link><pubDate>Sun, 09 Aug 2026 21:30:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/09-promise-cicd-github-gitlab/</guid><description>Platform Engineers write code too. When you build a complex Promise, you must compile the Pipeline container, lint the YAML, and safely deploy it to the Platform Cluster. In this episode, we build a robust GitHub Actions CI/CD pipeline to automate the lifecycle of Kratix Promises.</description></item><item><title>Kratix Ep 8: Developer Self-Service Workflow</title><link>https://rhidayat.work/series/kratix/08-developer-self-service-workflow/</link><pubDate>Sun, 09 Aug 2026 21:20:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/08-developer-self-service-workflow/</guid><description>We have spent 7 episodes architecting a massively scalable, secure backend. But if the Developer Experience (DX) is terrible, no one will use it. In this episode, we switch personas to the Application Developer and explore the day-to-day workflow of consuming a Kratix Platform.</description></item><item><title>Kratix Ep 7: Secrets Management with ESO and Vault</title><link>https://rhidayat.work/series/kratix/07-secrets-management-eso-vault/</link><pubDate>Sun, 09 Aug 2026 21:10:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/07-secrets-management-eso-vault/</guid><description>GitOps has one fatal flaw: You cannot commit secrets to a Git repository. When Kratix generates a Redis password during a Pipeline execution, how does it securely deliver that password to the Worker Cluster? In this episode, we solve the GitOps secrets problem using HashiCorp Vault and ESO.</description></item><item><title>Kratix Ep 6: FluxCD GitOps Integration</title><link>https://rhidayat.work/series/kratix/06-fluxcd-gitops-integration/</link><pubDate>Sun, 09 Aug 2026 21:00:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/06-fluxcd-gitops-integration/</guid><description>If your organization prefers Flux over ArgoCD, Kratix supports it natively without any modifications to the Platform Cluster. Because Kratix simply writes standard YAML to a Git repository, any GitOps controller can act as the delivery agent. In this episode, we configure FluxCD on the Worker Cluster.</description></item><item><title>Kratix Ep 5: ArgoCD GitOps Integration</title><link>https://rhidayat.work/series/kratix/05-argocd-gitops-integration/</link><pubDate>Sun, 09 Aug 2026 20:50:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/05-argocd-gitops-integration/</guid><description>In this episode, we learn HOW to execute the GitOps pull model in practice. We will configure ArgoCD on a Worker Cluster to continuously sync the Redis StatefulSet YAML generated by our Kratix Pipeline, ensuring you understand the mechanics of the State Store.</description></item><item><title>Kratix Ep 4: Core Concepts Deep Dive (How-To)</title><link>https://rhidayat.work/series/kratix/04-kratix-core-concepts-deep-dive/</link><pubDate>Sun, 09 Aug 2026 20:40:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/04-kratix-core-concepts-deep-dive/</guid><description>Enough theory. It&amp;rsquo;s time to look at the YAML. In this episode, we build the E-Commerce Redis Promise line-by-line. We will examine the API schema, the Pipeline configuration, and the Destination selectors that make multi-cluster deployment possible, ensuring you understand exactly how Kratix executes your logic.</description></item><item><title>Kratix Ep 3: Kratix GitOps vs Crossplane GitOps</title><link>https://rhidayat.work/series/kratix/03-kratix-gitops-vs-crossplane-gitops/</link><pubDate>Sun, 09 Aug 2026 20:30:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/03-kratix-gitops-vs-crossplane-gitops/</guid><description>Crossplane uses GitOps to provision AWS infrastructure. Kratix uses GitOps to orchestrate Promises. This frequently leads to severe architectural confusion for teams adopting Platform Engineering. In this episode, we define the exact boundary between the two tools and learn how they complement each other in a Production IDP.</description></item><item><title>Kratix Ep 2: Multi-Cluster Architecture &amp; IaC</title><link>https://rhidayat.work/series/kratix/02-multi-cluster-architecture-and-iac/</link><pubDate>Sun, 09 Aug 2026 20:20:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/02-multi-cluster-architecture-and-iac/</guid><description>In this episode, we deeply analyze the &amp;lsquo;Where&amp;rsquo; of the 5W1H framework. We will map out the Hub and Spoke topology, learn why Kratix intentionally isolates the Platform Cluster from the Worker Clusters for security, and explore how traditional Infrastructure-as-Code (like Terraform) executes inside this GitOps-driven model.</description></item><item><title>Crossplane Ep 15: Building an IDP with Backstage</title><link>https://rhidayat.work/series/crossplane/advanced/15-building-an-idp-with-backstage/</link><pubDate>Sun, 09 Aug 2026 19:40:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/15-building-an-idp-with-backstage/</guid><description>We have built the APIs, the translation engine, the GitOps pipeline, and the security webhooks. But developers still have to write YAML to request a database. In this final episode, we integrate Crossplane with Backstage to create the ultimate Internal Developer Portal (IDP).</description></item><item><title>Crossplane Ep 14: Custom Composition Webhooks</title><link>https://rhidayat.work/series/crossplane/advanced/14-custom-composition-webhooks/</link><pubDate>Sun, 09 Aug 2026 19:30:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/14-custom-composition-webhooks/</guid><description>OpenAPI schema validation (like &lt;code&gt;type: integer&lt;/code&gt;) is too basic for enterprise security. What if you need to enforce that a database&amp;rsquo;s storage size is an even number, or that the requested environment matches a specific regex? In this episode, we write a Kubernetes Validating Webhook in Go to intercept and inspect Crossplane Claims.</description></item><item><title>Crossplane Ep 13: Provider Families and Performance</title><link>https://rhidayat.work/series/crossplane/advanced/13-provider-family-and-performance/</link><pubDate>Sun, 09 Aug 2026 19:20:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/13-provider-family-and-performance/</guid><description>If you install the monolithic &lt;code&gt;provider-aws&lt;/code&gt; package into a small EKS cluster, your Kubernetes API server might crash. AWS has over 1,000 resources, meaning Crossplane will inject 1,000 CRDs and run a massive Go controller in memory. In this episode, we learn how to architect high-performance Crossplane clusters using Provider Families.</description></item><item><title>Crossplane Ep 12: GitOps with ArgoCD and Crossplane</title><link>https://rhidayat.work/series/crossplane/advanced/12-gitops-with-argocd-and-crossplane/</link><pubDate>Sun, 09 Aug 2026 19:10:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/12-gitops-with-argocd-and-crossplane/</guid><description>If you are running &lt;code&gt;kubectl apply -f my-database.yaml&lt;/code&gt; from your laptop, you are doing it wrong. In modern Platform Engineering, no human should ever talk directly to the Kubernetes API. In this episode, we configure ArgoCD to automatically deploy Crossplane XRs directly from a GitHub repository.</description></item><item><title>Crossplane Ep 11: Writing Composition Functions in Go</title><link>https://rhidayat.work/series/crossplane/advanced/11-writing-composition-functions-in-go/</link><pubDate>Sun, 09 Aug 2026 19:00:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/11-writing-composition-functions-in-go/</guid><description>In Episode 10, we learned that Composition Functions allow us to escape the limitations of YAML. In this episode, we will write a custom Go program that dynamically generates an array of AWS Subnets based on a single integer provided by the Application Developer.</description></item><item><title>Crossplane Ep 10: Introduction to Composition Functions</title><link>https://rhidayat.work/series/crossplane/intermediate/10-composition-functions-introduction/</link><pubDate>Sun, 09 Aug 2026 18:40:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/10-composition-functions-introduction/</guid><description>YAML is excellent for configuration, but terrible for programming. As your Platform scales, you will inevitably need &lt;code&gt;for&lt;/code&gt; loops, complex &lt;code&gt;if/else&lt;/code&gt; logic, and external API calls. In this final intermediate episode, we introduce Composition Functions—the architecture that allows you to write Crossplane logic in Turing-complete languages.</description></item><item><title>Crossplane Ep 9: Troubleshooting Sync Errors</title><link>https://rhidayat.work/series/crossplane/intermediate/09-troubleshooting-crossplane-sync-errors/</link><pubDate>Sun, 09 Aug 2026 18:30:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/09-troubleshooting-crossplane-sync-errors/</guid><description>When you run &lt;code&gt;terraform apply&lt;/code&gt;, you get immediate red text in your console if an AWS API call fails. Because Crossplane is an asynchronous control loop, &lt;code&gt;kubectl apply&lt;/code&gt; always succeeds immediately. When a database fails to boot 10 minutes later, how do you find the error? In this episode, we learn the Crossplane troubleshooting cascade.</description></item><item><title>Crossplane Ep 8: Managing Dependencies Between Resources</title><link>https://rhidayat.work/series/crossplane/intermediate/08-managing-dependencies-between-resources/</link><pubDate>Sun, 09 Aug 2026 18:20:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/08-managing-dependencies-between-resources/</guid><description>If a Composition provisions both an AWS VPC and a Subnet, the Subnet physically cannot be created until the VPC exists and returns an ID. In Terraform, you use implicit dependency mapping (e.g., &lt;code&gt;vpc_id = aws_vpc.main.id&lt;/code&gt;). In Crossplane, we manage this using Cross-Resource References and Selector matching.</description></item><item><title>Crossplane Ep 7: Environment Configs</title><link>https://rhidayat.work/series/crossplane/intermediate/07-environment-configs/</link><pubDate>Sun, 09 Aug 2026 18:10:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/07-environment-configs/</guid><description>If your company has three clusters (Development, Staging, and Production), you do not want to write three different Compositions for the same RDS database. In this episode, we learn how to use Crossplane EnvironmentConfigs to inject global context (like AWS Account IDs, VPC IDs, and Regions) dynamically into your Compositions.</description></item><item><title>Crossplane Ep 6: Patching and Transforms</title><link>https://rhidayat.work/series/crossplane/intermediate/06-patching-and-transforms/</link><pubDate>Sun, 09 Aug 2026 18:00:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/06-patching-and-transforms/</guid><description>In Episode 5, we hardcoded our RDS instance size to 20GB. If a developer asked for 50GB in their Claim, Crossplane ignored it. In this episode, we explore the Patcher, learning how to dynamically route data from the Composite Resource (XR) into the physical Managed Resources (MRs).</description></item><item><title>Crossplane Ep 5: Compositions</title><link>https://rhidayat.work/series/crossplane/fundamental/05-compositions/</link><pubDate>Sun, 09 Aug 2026 17:50:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/05-compositions/</guid><description>In Episode 4, we built an API (XRD) but it didn&amp;rsquo;t actually create any AWS infrastructure. In this final fundamental episode, we write a Composition. This is the &amp;rsquo;translation engine&amp;rsquo; that instructs Crossplane exactly which physical Managed Resources to create when a developer requests our custom API.</description></item><item><title>Crossplane Ep 4: Composite Resources (XR)</title><link>https://rhidayat.work/series/crossplane/fundamental/04-composite-resources-xr/</link><pubDate>Sun, 09 Aug 2026 17:40:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/04-composite-resources-xr/</guid><description>Managed Resources (MRs) are too low-level for application developers. In this episode, we learn how to define a Composite Resource Definition (XRD). This allows Platform Engineers to design a brand new, highly abstracted Custom Kubernetes API tailored exactly to their company&amp;rsquo;s needs.</description></item><item><title>Crossplane Ep 3: Managed Resources (MR)</title><link>https://rhidayat.work/series/crossplane/fundamental/03-managed-resources-mr/</link><pubDate>Sun, 09 Aug 2026 17:30:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/03-managed-resources-mr/</guid><description>A Managed Resource (MR) is the foundational building block of Crossplane. It is a 1-to-1 representation of a physical cloud object (like an S3 Bucket or an RDS Instance) stored as a Custom Resource in Kubernetes. In this episode, we provision our first AWS resource directly via kubectl.</description></item><item><title>Crossplane Ep 2: Providers and Credentials</title><link>https://rhidayat.work/series/crossplane/fundamental/02-providers-and-credentials/</link><pubDate>Sun, 09 Aug 2026 17:20:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/02-providers-and-credentials/</guid><description>Crossplane is useless on its own. To orchestrate AWS, Azure, or GCP, we must install Providers. In this episode, we install the official Upbound AWS Provider, configure Kubernetes Secrets to store our IAM credentials, and bind them to a ProviderConfig.</description></item><item><title>Crossplane Ep 1: The Kubernetes Native Control Plane</title><link>https://rhidayat.work/series/crossplane/fundamental/01-the-kubernetes-native-control-plane/</link><pubDate>Sun, 09 Aug 2026 17:10:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/01-the-kubernetes-native-control-plane/</guid><description>To understand Crossplane, you must first understand the Kubernetes Control Loop. In this episode, we explore the theoretical difference between CLI-driven IaC (Terraform) and Control Plane IaC (Crossplane). We will then install Crossplane into a local cluster using Helm.</description></item><item><title>Pulumi Ep 15: Multi-Language Components (MLC)</title><link>https://rhidayat.work/series/pulumi/advanced/15-multi-language-components/</link><pubDate>Sun, 09 Aug 2026 16:40:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/advanced/15-multi-language-components/</guid><description>In Episode 7, we built a reusable TypeScript ComponentResource. But what if the Data Science team wants to use your component in their Python IaC? Historically, they couldn&amp;rsquo;t. Pulumi Multi-Language Components (MLC) solves this by using gRPC to project your TypeScript code across all supported languages.</description></item><item><title>Pulumi Ep 14: Policy as Code with CrossGuard</title><link>https://rhidayat.work/series/pulumi/advanced/14-policy-as-code-with-crossguard/</link><pubDate>Sun, 09 Aug 2026 16:30:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/advanced/14-policy-as-code-with-crossguard/</guid><description>In Terraform, enforcing security rules requires external tools like OPA (Open Policy Agent) and Rego. Pulumi provides a native Policy-as-Code engine called CrossGuard. In this episode, we will write TypeScript policies that act as a strict firewall, preventing developers from provisioning insecure infrastructure.</description></item><item><title>Pulumi Ep 13: Unit Testing Infrastructure (Jest)</title><link>https://rhidayat.work/series/pulumi/advanced/13-unit-testing-infrastructure/</link><pubDate>Sun, 09 Aug 2026 16:20:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/advanced/13-unit-testing-infrastructure/</guid><description>Testing infrastructure usually means deploying it to a sandbox, waiting 15 minutes, running a bash script to ping an IP, and tearing it down. Because Pulumi is TypeScript, we can use the industry-standard Jest testing framework to write offline, millisecond unit tests to validate our infrastructure logic &lt;em&gt;before&lt;/em&gt; we ever touch the cloud.</description></item><item><title>Pulumi Ep 12: Authoring Dynamic Providers</title><link>https://rhidayat.work/series/pulumi/advanced/12-dynamic-providers/</link><pubDate>Sun, 09 Aug 2026 16:10:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/advanced/12-dynamic-providers/</guid><description>What happens when you need to provision a resource in a system that doesn&amp;rsquo;t have an official Pulumi plugin? In Terraform, you must write complex Go code, compile a binary, and distribute it. In Pulumi, you can author a Dynamic Provider directly in your &lt;code&gt;index.ts&lt;/code&gt; file using pure TypeScript.</description></item><item><title>Pulumi Ep 11: The Automation API (Embedded Pulumi)</title><link>https://rhidayat.work/series/pulumi/advanced/11-automation-api/</link><pubDate>Sun, 09 Aug 2026 16:00:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/advanced/11-automation-api/</guid><description>Running &lt;code&gt;pulumi up&lt;/code&gt; from a CLI is great for Platform Engineers, but what if you want to build a self-service Internal Developer Portal (IDP) where developers click a button on a web page to provision a database? The Pulumi Automation API allows you to embed the entire Pulumi Engine inside your own Node.js, Python, or Go applications.</description></item><item><title>Pulumi Ep 10: Using Native Providers (AWS Classic vs AWS Native)</title><link>https://rhidayat.work/series/pulumi/intermediate/10-using-native-providers/</link><pubDate>Sun, 09 Aug 2026 15:40:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/intermediate/10-using-native-providers/</guid><description>Did you know that the &lt;code&gt;@pulumi/aws&lt;/code&gt; package you have been using is actually built on top of Terraform? In this final intermediate episode, we explore the difference between &amp;lsquo;Bridged&amp;rsquo; providers and &amp;lsquo;Native&amp;rsquo; providers, and learn how &lt;code&gt;@pulumi/aws-native&lt;/code&gt; directly communicates with the AWS Cloud Control API.</description></item><item><title>Pulumi Ep 9: Pulumi Packages and the Registry</title><link>https://rhidayat.work/series/pulumi/intermediate/09-pulumi-packages-and-registry/</link><pubDate>Sun, 09 Aug 2026 15:30:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/intermediate/09-pulumi-packages-and-registry/</guid><description>Platform Engineering is rarely confined to a single cloud. You often need to provision AWS servers, configure GitHub repositories, and set up DataDog dashboards simultaneously. In this episode, we learn how to leverage the Pulumi Registry to install third-party Providers and orchestrate multi-cloud deployments from a single TypeScript file.</description></item><item><title>Pulumi Ep 8: Cross-Stack References (Micro-Stacks)</title><link>https://rhidayat.work/series/pulumi/intermediate/08-cross-stack-references/</link><pubDate>Sun, 09 Aug 2026 15:20:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/intermediate/08-cross-stack-references/</guid><description>Deploying your entire infrastructure (Networking, Databases, Kubernetes, and Frontend) in a single Pulumi stack is dangerous. A tiny typo in an S3 bucket configuration could accidentally trigger the destruction of your VPC. In this episode, we learn how to architect Micro-Stacks and stitch them together using StackReference.</description></item><item><title>Pulumi Ep 7: Abstraction with ComponentResources</title><link>https://rhidayat.work/series/pulumi/intermediate/07-abstraction-with-componentresources/</link><pubDate>Sun, 09 Aug 2026 15:10:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/intermediate/07-abstraction-with-componentresources/</guid><description>Terraform relies on Modules for abstraction, which are essentially isolated directories of HCL files. Pulumi takes a much more elegant approach. Because we are using a real programming language, we can abstract complex architectures into reusable TypeScript Classes called ComponentResources.</description></item><item><title>Pulumi Ep 6: Loops and Conditional Infrastructure</title><link>https://rhidayat.work/series/pulumi/intermediate/06-loops-and-conditional-infrastructure/</link><pubDate>Sun, 09 Aug 2026 15:00:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/intermediate/06-loops-and-conditional-infrastructure/</guid><description>Welcome to the Intermediate Tier. The true advantage of using a general-purpose programming language for IaC is access to native control flow. In this episode, we will dynamically generate Subnets and Security Group rules using native array mapping and conditional logic based on environment flags.</description></item><item><title>Pulumi Ep 5: Inputs, Outputs, and Promises (The Asynchronous Conundrum)</title><link>https://rhidayat.work/series/pulumi/fundamental/05-inputs-outputs-and-promises/</link><pubDate>Sun, 09 Aug 2026 14:50:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/fundamental/05-inputs-outputs-and-promises/</guid><description>When you write standard TypeScript, data is computed immediately. But in Pulumi, when you request an EC2 instance&amp;rsquo;s IP address, the IP does not exist until AWS physically boots the server. This introduces temporal paradoxes. In this final fundamental episode, we master Inputs, Outputs, and how to safely manipulate asynchronous infrastructure data.</description></item><item><title>Pulumi Ep 4: Configuration and Secrets Management</title><link>https://rhidayat.work/series/pulumi/fundamental/04-configuration-and-secrets/</link><pubDate>Sun, 09 Aug 2026 14:40:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/fundamental/04-configuration-and-secrets/</guid><description>Hardcoding values like instance sizes and database passwords into your TypeScript code is a severe anti-pattern. In this episode, we learn how to decouple configuration from code using the Pulumi Config system, allowing the exact same codebase to deploy vastly different Staging and Production architectures.</description></item><item><title>Pulumi Ep 3: Declaring Resources in TypeScript</title><link>https://rhidayat.work/series/pulumi/fundamental/03-declaring-resources-in-typescript/</link><pubDate>Sun, 09 Aug 2026 14:30:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/fundamental/03-declaring-resources-in-typescript/</guid><description>In Terraform, you write declarative configuration blocks. In Pulumi, you instantiate Object-Oriented classes. This episode explores how to declare complex resources like an AWS VPC, Security Group, and EC2 instance using pure TypeScript, while leveraging your IDE&amp;rsquo;s IntelliSense for maximum productivity.</description></item><item><title>Pulumi Ep 2: Stacks and State Management</title><link>https://rhidayat.work/series/pulumi/fundamental/02-stacks-and-state/</link><pubDate>Sun, 09 Aug 2026 14:20:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/fundamental/02-stacks-and-state/</guid><description>Managing state files in Terraform is notoriously difficult, requiring external buckets and DynamoDB locks. Pulumi solves this out-of-the-box using the Pulumi Service. In this episode, we explore how State is managed, and how to use Stacks to deploy identical infrastructure to Staging and Production environments safely.</description></item><item><title>Pulumi Ep 1: Introduction to Pulumi and Project Initialization</title><link>https://rhidayat.work/series/pulumi/fundamental/01-introduction-to-pulumi/</link><pubDate>Sun, 09 Aug 2026 14:10:00 +0000</pubDate><guid>https://rhidayat.work/series/pulumi/fundamental/01-introduction-to-pulumi/</guid><description>It is time to leave YAML behind. In this episode, we will install the Pulumi CLI, scaffold a brand new TypeScript project, and understand the anatomy of the generated files. You will learn how Pulumi securely integrates with your cloud provider credentials.</description></item><item><title>Terraform Ep 15: Infrastructure Unit Testing with Terratest (Golang)</title><link>https://rhidayat.work/series/terraform/advanced/15-testing-with-terratest/</link><pubDate>Sun, 09 Aug 2026 11:40:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/advanced/15-testing-with-terratest/</guid><description>Running &amp;rsquo;terraform plan&amp;rsquo; is not enough to guarantee your infrastructure works. In this final episode, we bridge the gap between DevOps and Software Engineering by writing automated Golang tests using Terratest. We will programmatically provision infrastructure, assert its correctness, and tear it down.</description></item><item><title>Terraform Ep 14: Achieving DRY Architecture with Terragrunt</title><link>https://rhidayat.work/series/terraform/advanced/14-terragrunt-and-dry-architecture/</link><pubDate>Sun, 09 Aug 2026 11:30:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/advanced/14-terragrunt-and-dry-architecture/</guid><description>As your Terraform codebase scales across dozens of microservices and environments, you will find yourself copy-pasting the same &amp;lsquo;backend&amp;rsquo; and &amp;lsquo;provider&amp;rsquo; blocks repeatedly. Terragrunt is a powerful wrapper that eliminates this repetition, allowing you to define global configurations once.</description></item><item><title>Terraform Ep 13: Advanced State Manipulation (Surgical Refactoring)</title><link>https://rhidayat.work/series/terraform/advanced/13-advanced-state-manipulation/</link><pubDate>Sun, 09 Aug 2026 11:20:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/advanced/13-advanced-state-manipulation/</guid><description>Refactoring HCL code is dangerous. If you rename a resource block, Terraform will attempt to destroy the old resource and recreate it. In this episode, we learn how to use &amp;lsquo;moved&amp;rsquo; blocks and the state CLI to refactor code safely, preventing catastrophic database deletions.</description></item><item><title>Terraform Ep 12: CI/CD Automation with Terraform Cloud and GitHub Actions</title><link>https://rhidayat.work/series/terraform/advanced/12-cicd-with-terraform-cloud/</link><pubDate>Sun, 09 Aug 2026 11:10:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/advanced/12-cicd-with-terraform-cloud/</guid><description>Running &amp;rsquo;terraform apply&amp;rsquo; from a local laptop is a major security and compliance risk. In this episode, we transition to a GitOps workflow. You will learn how to automate Terraform plans on Pull Requests, and automatically apply changes upon merging to the main branch using GitHub Actions.</description></item><item><title>Terraform Ep 11: Managing Multi-Environment Architecture (Workspaces vs Directories)</title><link>https://rhidayat.work/series/terraform/advanced/11-workspaces-and-environments/</link><pubDate>Sun, 09 Aug 2026 11:00:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/advanced/11-workspaces-and-environments/</guid><description>Welcome to Tier 3: Advanced Platform Engineering. You now know how to write reusable modules and store state remotely. But how do you safely deploy identical infrastructure to both Staging and Production without them colliding? We explore Workspaces and Directory Isolation.</description></item><item><title>Terraform Ep 10: Remote State Backends and Concurrency Locking</title><link>https://rhidayat.work/series/terraform/intermediate/10-remote-state-and-locking/</link><pubDate>Sun, 09 Aug 2026 10:40:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/intermediate/10-remote-state-and-locking/</guid><description>Local state files are fine for solo learning, but catastrophic for team environments. In this episode, we will solve the &amp;lsquo;state file drift&amp;rsquo; problem by configuring a Remote Backend on AWS S3, and preventing simultaneous executions using DynamoDB locking.</description></item><item><title>Terraform Ep 9: Architecting Reusable, Production-Grade Modules</title><link>https://rhidayat.work/series/terraform/intermediate/09-writing-reusable-modules/</link><pubDate>Sun, 09 Aug 2026 10:30:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/intermediate/09-writing-reusable-modules/</guid><description>Modules are the functions of the Terraform ecosystem. In this episode, we will build a reusable AWS VPC module from scratch, define explicit inputs and outputs, and consume it from a separate Root Module. Stop copy-pasting code and start building a self-service infrastructure catalog.</description></item><item><title>Terraform Ep 8: Generating Nested Configurations with Dynamic Blocks</title><link>https://rhidayat.work/series/terraform/intermediate/08-dynamic-blocks/</link><pubDate>Sun, 09 Aug 2026 10:20:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/intermediate/08-dynamic-blocks/</guid><description>While &amp;lsquo;count&amp;rsquo; and &amp;lsquo;for_each&amp;rsquo; duplicate entire resources, &amp;lsquo;dynamic&amp;rsquo; blocks duplicate nested configurations &lt;em&gt;inside&lt;/em&gt; a single resource. Discover how to build highly flexible, list-driven Security Groups and Route Tables without repeating HCL blocks.</description></item><item><title>Terraform Ep 7: Advanced Looping Strategies (count vs for_each)</title><link>https://rhidayat.work/series/terraform/intermediate/07-loops-with-count-and-for-each/</link><pubDate>Sun, 09 Aug 2026 10:10:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/intermediate/07-loops-with-count-and-for-each/</guid><description>Copy-pasting resource blocks is a cardinal sin in Platform Engineering. In this episode, we will deploy identical infrastructure fleets using loops. You will learn the critical differences between &amp;lsquo;count&amp;rsquo; and &amp;lsquo;for_each&amp;rsquo;, and why &amp;lsquo;count&amp;rsquo; can accidentally destroy your production servers if used incorrectly.</description></item><item><title>Terraform Ep 6: Local Values, Built-in Functions, and Interpolation</title><link>https://rhidayat.work/series/terraform/intermediate/06-local-values-and-functions/</link><pubDate>Sun, 09 Aug 2026 10:00:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/intermediate/06-local-values-and-functions/</guid><description>Terraform is not just static configuration; it is a powerful programming language. In this episode, we explore how to perform string interpolations, use mathematical functions, and centralize complex expressions using the &amp;rsquo;locals&amp;rsquo; block to keep your code DRY.</description></item><item><title>Terraform Ep 5: Querying Existing Cloud Infrastructure with Data Sources</title><link>https://rhidayat.work/series/terraform/fundamental/05-data-sources/</link><pubDate>Sun, 09 Aug 2026 09:50:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/fundamental/05-data-sources/</guid><description>Not everything in your cloud is managed by Terraform. In this episode, you will learn how to use the &amp;lsquo;data&amp;rsquo; block to interrogate the AWS API. Fetch the latest Ubuntu AMI ID dynamically, or retrieve a VPC ID created by the Networking team, ensuring your code remains hardcode-free.</description></item><item><title>Terraform Ep 4: Input Variables, Outputs, and Data Types</title><link>https://rhidayat.work/series/terraform/fundamental/04-input-variables-and-outputs/</link><pubDate>Sun, 09 Aug 2026 09:40:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/fundamental/04-input-variables-and-outputs/</guid><description>Hardcoding values in Terraform is a bad practice. In this episode, we will introduce Input Variables and Data Types to make your code reusable across multiple environments. You will also learn how to extract critical information using Outputs.</description></item><item><title>Terraform Ep 3: Declaring Resources and Dependency Management</title><link>https://rhidayat.work/series/terraform/fundamental/03-declaring-resources/</link><pubDate>Sun, 09 Aug 2026 09:30:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/fundamental/03-declaring-resources/</guid><description>It is time to build real infrastructure. In this episode, we will declare an AWS Virtual Private Cloud (VPC) and a Subnet. You will learn how Terraform intelligently determines the correct order of creation using the Dependency Graph, preventing race conditions.</description></item><item><title>Terraform Ep 1: Introduction to IaC and the State File</title><link>https://rhidayat.work/series/terraform/fundamental/01-introduction-and-state/</link><pubDate>Sun, 09 Aug 2026 09:10:00 +0000</pubDate><guid>https://rhidayat.work/series/terraform/fundamental/01-introduction-and-state/</guid><description>Stop deploying cloud resources manually. In this first episode, we will transform your approach to cloud architecture by introducing declarative IaC. You will learn how Terraform tracks physical resources using the state file, and execute your first local configuration.</description></item></channel></rss>