<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Boris Teplitsky</title>
    <description>The latest articles on DEV Community by Boris Teplitsky (@boristep).</description>
    <link>https://dev.to/boristep</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1979094%2F5feb505b-1509-417f-b565-5469bd2ad3e0.png</url>
      <title>DEV Community: Boris Teplitsky</title>
      <link>https://dev.to/boristep</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/boristep"/>
    <language>en</language>
    <item>
      <title>Why I stopped letting LLMs write my Terraform</title>
      <dc:creator>Boris Teplitsky</dc:creator>
      <pubDate>Mon, 18 May 2026 09:32:50 +0000</pubDate>
      <link>https://dev.to/boristep/why-i-stopped-letting-llms-write-my-terraform-26m0</link>
      <guid>https://dev.to/boristep/why-i-stopped-letting-llms-write-my-terraform-26m0</guid>
      <description>&lt;p&gt;I am an IT architect. Been doing system automation for years. As a cloud architect lately, I see that landing zone setup really needs some automation. Hundreds (not millions) of parameters come from business and technical requirements and actually predefine how the LZ should look.The problem is that most of these parameters you can't get from the customer. They are distributed over tens of standards, guides, manuals, etc.Great, LLM is a perfect tool for it. It can gather information from different non-structured sources and build a set of parametrised templates (let's say JSON). Parameters come from the user and I get an unambiguous spec of what we have to build.Next step — create from the spec a Terraform script, execute it, and the LZ is ready. Give it to LLM too.But no... every change in parameters and conditions gives me another LZ. Now I have to go to my big boss and explain to him why, when he asked for one small change, I bring him something cardinally different from the first version.Not on my shift.So I asked the LLM to build Jinja2 templates and some code (generators) that create Terraform from the spec and the templates.Turns out there's a name for what I ended up with — Compiled AI. LLMs build the templates, deterministic code runs them.&lt;br&gt;
Technical details of how I did it:(&lt;a href="https://medium.com/google-cloud/compile-time-ai-for-gcp-landing-zones-2555560fbd2f" rel="noopener noreferrer"&gt;https://medium.com/google-cloud/compile-time-ai-for-gcp-landing-zones-2555560fbd2f&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>googlecloud</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Compiled AI for GCP Landing Zones</title>
      <dc:creator>Boris Teplitsky</dc:creator>
      <pubDate>Mon, 18 May 2026 06:48:01 +0000</pubDate>
      <link>https://dev.to/boristep/compiled-ai-for-gcp-landing-zones-43i1</link>
      <guid>https://dev.to/boristep/compiled-ai-for-gcp-landing-zones-43i1</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;How LLM-authored templates and deterministic generators replace runtime guesswork in complicated cloud foundations.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LLM is spreading into more and more areas of work, but there are several where it cannot produce content directly. These are bank regulatory filings, executed legal contracts, medical prescriptions, audit attestations, aerospace maintenance procedures, and so on. Such outputs must be reproducible from the same inputs and auditable to every value. The same requirements have to produce the same output, and any change in the output has to be explainable back to a change in the inputs.&lt;br&gt;
A public cloud landing zone belongs to this group. The same business requirements, regulatory obligations and architectural decisions have to produce the same configuration. A configuration that drifts because of sampling temperature is not acceptable, and a landing zone is not an exception. It is the foundation a regulated business runs on.&lt;/p&gt;

&lt;p&gt;Setting up a landing zone today typically consists of five steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gathering business and technical requirements and constraints, including applicable regulations.&lt;/li&gt;
&lt;li&gt;Selecting a reference architecture. It may be a similar project the team did recently, a public repository on GitHub, or a vendor blueprint. For GCP many teams use FAST; for AWS there are more options.&lt;/li&gt;
&lt;li&gt;Making the parameter decisions: regions, VPC topology, key policy, IAM model, VPC-SC perimeters, DR pairings, and so on.&lt;/li&gt;
&lt;li&gt;Writing or adapting the Terraform and YAML.&lt;/li&gt;
&lt;li&gt;Validating and delivering. An iterative process, from syntax validation with terraform plan to deep analysis of how the LZ aligns with the requirements.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1 and 3 are architects’ job. They need deep understanding of the company’s target and limitations, knowledge in public cloud foundation, architectural thinking. Usually these processes go through a series of discussions with colleagues and stakeholders. Steps 2, 4, 5 are less creative. They are mechanical, time-consuming, and frequently a source of mistakes that are hard to spot. Compile-time AI is aimed at the translation work. The judgment work stays with the architect.&lt;/p&gt;

&lt;p&gt;One more thing worth saying before going further. Google’s own &lt;a href="https://docs.cloud.google.com/architecture/landing-zones" rel="noopener noreferrer"&gt;landing zone design documentation&lt;/a&gt; states that “this series does not specifically address compliance requirements from regulated industries such as financial services or healthcare.” The official guidance stops where regulated cloud foundations actually begin.&lt;/p&gt;

&lt;p&gt;This article describes how to close this gap.&lt;br&gt;
&lt;strong&gt;Phase A&lt;/strong&gt; — building the corpus. This is the job of Merlin’s product team, not of the architect. The LLM reads framework documents, FAST modules, GCP best-practice guides, and practitioner literature, and drafts structured corpus entries: schemas, compliance rules, Jinja templates, validators. Each entity is reviewed by a human and passes tests before becoming a part of the corpus. The corpus is versioned. Nothing in it is the LLM’s unreviewed output.&lt;br&gt;
&lt;strong&gt;Phase B&lt;/strong&gt; — generating a landing zone. This is pure architect work performed using the Merlin application at &lt;a href="https://app.merlin-studio.cloud" rel="noopener noreferrer"&gt;https://app.merlin-studio.cloud&lt;/a&gt;. The process consists of three steps: discovery — defining business and technical requirements; configuration — supplying technical parameters; and finally generation — creating Terraform, YAML, diagrams and the scorecard based on corpus entities. There is no LLM in the runtime. The worker container does not even have an API key to a model provider. The same spec and the same corpus version produce identical output.&lt;/p&gt;

&lt;p&gt;The corpus is the boundary between the two phases. Phase A produces it. Phase B uses it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgej38mgq7ap34mlyta6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgej38mgq7ap34mlyta6c.png" width="778" height="481"&gt;&lt;/a&gt;&lt;br&gt;
The corpus contains several kinds of entities. The list below is the short version.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Section schemas. JSON files that define what the architect can configure for one part of the landing zone — the fields, their types, and the defaults that kick in if the architect leaves them alone.&lt;/li&gt;
&lt;li&gt;Output templates. Jinja2 templates that produce the files the engine emits: Terraform variables, Mermaid architecture diagrams, operator-facing documentation.&lt;/li&gt;
&lt;li&gt;Compliance mappings. One JSON file per framework. Each file translates a regulatory regime into concrete spec requirements — allowed regions, restriction levels, rotation cadences, retention floors, and so on.&lt;/li&gt;
&lt;li&gt;Validators. Python code that checks the generated bundle for structural correctness, cross-section consistency, and operational readiness, and produces the weighted score the architect sees in the scorecard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Phase A produces all of these. Phase B reads them. The LLM never runs at Phase B.&lt;/p&gt;

&lt;p&gt;Let’s trace one rule from the source document to the rendered Terraform.&lt;br&gt;
The source is HIPAA. &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-E/section-164.530#p-164.530(j)" rel="noopener noreferrer"&gt;Specifically, 45 CFR §164.530(j)&lt;/a&gt;.&lt;br&gt;
TL;DR in my own words: a covered entity has to keep its HIPAA-related documentation — written policies, procedures, operational records — for six years from the date of creation or the date the document was last in effect, whichever is later. Audit logs are part of that documentation, so the same six-year floor applies to them.&lt;br&gt;
&lt;strong&gt;Phase A.&lt;/strong&gt; The LLM is given the list of corpus topics Merlin tracks and asked to build the HIPAA mapping. It mines its training data, finds the text relevant to log retention, recognises that the matching Merlin field is log_retention.default_retention_days, converts six years to days (2190), and emits a JSON entry that fits the schema for compliance rules. A human reviewer reads the entry against the source paragraph: is the field path right, is 2190 the right number, did the LLM hallucinate any clause that isn’t in the regulation? Verification of the framework as a whole is performed end to end by Merlin’s team before the framework is released for use.&lt;br&gt;
The entry that lands in configuration/compliance_mappings/hipaa.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"log_retention.default_retention_days"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"field_label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Default Log Retention Period (Days)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minimum"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"minimum_value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"rationale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HIPAA requires 6-year retention of audit logs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"45 CFR 164.530(j)"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvnbmrf1stxzxxzom3oy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvnbmrf1stxzxxzom3oy.png" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase B&lt;/strong&gt;. An architect opens the wizard at app.merlin-studio.cloud and ticks HIPAA in the compliance section. Three things then happen.&lt;br&gt;
Compliance preprocessor. For each active framework, the preprocessor walks the rule entries and applies them to the spec. For this rule, operator: minimum with minimum_value: 2190 means: write 2190 into the spec at log_retention.default_retention_days, unless the architect already set that field explicitly. After this pass the spec contains default_retention_days = 2190.&lt;br&gt;
Section parser. Reshapes the spec into a flat dictionary that the template consumes. The retention value passes through unchanged.&lt;br&gt;
Template render. The Jinja2 template for the logging section reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jinja"&gt;&lt;code&gt;{ if values.log_retention is defined }
log_retention = {
default_retention_days = &lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;values.log_retention.default_retention_days&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
custom_buckets = {
{ for bucket in values.log_retention.custom_retention_buckets | default([]) %}
"&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_lz_prefix&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;-&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;bucket.name&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;" = {
retention_days = &lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;bucket.retention_days&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
locked = &lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;bucket.locked&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
}&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="s2"&gt;","&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;loop.last&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
{ endfor }
}
}
{ endif }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The renderer evaluates the template against the parsed spec and emits this block into the generated 08_logging_monitoring.tfvars:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;log_retention&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;default_retention_days&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2190&lt;/span&gt;
&lt;span class="nx"&gt;custom_buckets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three corpus artifacts contributed to that single block: the compliance mapping (which set 2190), the section schema (which defined the field), and the Jinja2 template (which laid out the HCL). Every link in the chain is a pure function of its inputs. Same wizard spec, same corpus version, same generated value, every time.&lt;br&gt;
Official documents — compliance frameworks, Google’s best-practice guides, FAST blueprints — do not cover every parameter of a landing zone. There are decisions an architect has to make that no document prescribes: budget alarm thresholds, naming conventions, DR strategy tiers, and many smaller choices.&lt;br&gt;
For these gaps, the LLM is the right tool: it mines its training data for the prevailing practice across vendor blogs, conference talks, FinOps and SRE literature, and the operational experience encoded in books and forums. It produces an entry against the same schema the compliance mappings use, with a default value that fits the conventional shape. A human reviewer judges whether the default is sensible for Merlin’s audience.&lt;br&gt;
A small example. In 09_cost_management.json the default starter budget is $1000 with alert thresholds at 50%, 80%, and 100% of current spend, plus 100% of forecasted spend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"budget_amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"alert_thresholds_percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"basis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"current"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"basis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"current"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"basis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"current"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"basis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forecasted"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing in FedRAMP, HIPAA, or CIS prescribes these numbers. They are the conventional FinOps starter shape.&lt;br&gt;
The entry that lands in the corpus looks no different from one derived from a regulation. The compliance preprocessor reads both the same way. Once the corpus is built, the question of where each value came from is a Phase A concern, settled before the architect opens the wizard.&lt;br&gt;
Phase B is the part of Merlin a reader can verify themselves. The architect’s wizard session produces a single spec.json file: every choice from the discovery and configuration steps is captured there. Merlin’s worker takes that file plus the corpus — Jinja2 templates and Python code (generators, composers) — and produces the bundle. The claim is: same spec.json, same corpus version, identical output zip.&lt;br&gt;
The mechanism is straightforward. The compliance preprocessor walks frameworks in their listed order and rule entries in their JSON-listed order. Section parsers are pure transformations of dicts. Generators and composers are pure Python: same input, same output. The Jinja2 environment is configured without any non-deterministic filters. The bundle assembler writes files into the zip in a fixed sorted order. There is no random sampling anywhere — there is no model in the loop. Sampling is what makes LLMs nondeterministic; Phase B has no LLM.&lt;br&gt;
Anyone can verify this directly at app.merlin-studio.cloud, guest mode included. Every project keeps its configurations versioned. An architect can regenerate the artifacts as many times as they want and, as long as the configuration has not changed, will get the same bundle back. Step into the configuration, change one parameter, regenerate — the diff in the artifacts is exactly the consequence of that one change. Revert the parameter, regenerate again, and the original artifacts are back. The chain from input to output is fully traceable, in both directions.&lt;br&gt;
The corpus is only as good as the team maintaining it. Phase A is real, ongoing work — new compliance frameworks, new GCP services, new best practices. What compile-time AI does is move that work to a place where humans can scrutinise it, and keep the architect’s session deterministic and reproducible.&lt;br&gt;
The two-phase approach Merlin uses has been in the air for some time. Several companies have implemented variants of it. For example Stainless uses this kind of architecture in their official SDKs for OpenAI, Anthropic, and others: an LLM helps build the generator’s configuration, and the generator itself runs without an LLM invocation.&lt;br&gt;
Recently, the approach got its theoretical grounding. A paper published April 2026 under the title &lt;a href="https://arxiv.org/abs/2604.05150" rel="noopener noreferrer"&gt;Compiled AI: Deterministic Code Generation for LLM-Based Workflow Automation (arxiv 2604.05150)&lt;/a&gt; studies the architecture in the context of high-stakes enterprise workflows. The paper’s name for the pattern, Compiled AI, fits Merlin exactly, which is why I use it.&lt;br&gt;
The interesting question for cloud foundations is not whether LLMs can help. They can. The question is where to put them. Merlin’s answer is: use LLM to build templates and rules; use deterministic pipelines to build the LZ artefacts.&lt;br&gt;
Merlin is free at &lt;a href="//app.merlin-studio.cloud"&gt;app.merlin-studio.cloud&lt;/a&gt;. I would be glad to discuss anything in the article that doesn’t sit right with you.&lt;/p&gt;

&lt;p&gt;·&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gcp</category>
      <category>llm</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>How to Start Your Google Cloud from the Right Foot</title>
      <dc:creator>Boris Teplitsky</dc:creator>
      <pubDate>Wed, 29 Apr 2026 05:51:58 +0000</pubDate>
      <link>https://dev.to/boristep/how-to-start-your-google-cloud-from-the-right-foot-5f0p</link>
      <guid>https://dev.to/boristep/how-to-start-your-google-cloud-from-the-right-foot-5f0p</guid>
      <description>&lt;h2&gt;
  
  
  Setting up a GCP landing zone from scratch — a step-by-step approach for DevOps engineers new to GCP.
&lt;/h2&gt;

&lt;p&gt;Let's consider a familiar situation: a company has decided to move part of its IT to Google Cloud. They assigned the job to a DevOps engineer — not a GCP expert, but someone with enough knowledge and experience to set up and deploy services on GCP. Sound familiar? Thousands of companies have been exactly in this position — and thousands more will be.&lt;/p&gt;

&lt;p&gt;Here we describe an approach to setting up Google Cloud for a small company — a startup, for example — or for a single system within a large company, using Merlin Studio (&lt;a href="https://site.merlin-studio.cloud" rel="noopener noreferrer"&gt;https://site.merlin-studio.cloud&lt;/a&gt;). We assume the company has no strict regulatory requirements (such as HIPAA or GDPR), but the company does care about following best practices and leaving room for seamless extension in the future.&lt;br&gt;&lt;br&gt;
The setup process with Merlin Studio consists of three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discovery&lt;/strong&gt; — defining business requirements and conditions
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt; — setting parameters for each GCP section
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation&lt;/strong&gt; — producing a package of Terraform tfvars files, schemas, documentation, and guides&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdrwae380bpclonh1y6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdrwae380bpclonh1y6j.png" alt="icongr" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Discovery
&lt;/h1&gt;

&lt;p&gt;At this stage you tell Merlin what you want it to build: what your company does, how big it is, how experienced your cloud team is, whether you have any regulatory requirements, whether you need connectivity to an on-prem datacenter or another cloud, and so on.&lt;br&gt;&lt;br&gt;
Merlin has no access to your environment and does not validate the accuracy of your answers — but it stores all your information encrypted, separately for each customer. So if you provide accurate data about your company, it will save you the effort of manual edits before deployment.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnpkgfbl9jmueq183agi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnpkgfbl9jmueq183agi.png" alt="Sc1" width="626" height="857"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in the screenshots, our example covers a small company — a startup — with no specific requirements. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9slescexvyxqpj2ac9tj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9slescexvyxqpj2ac9tj.png" alt="Sc2" width="626" height="850"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Among the technical requirements, pay attention to Terraform Output Format — either "Generic Terraform tfvars" or "FAST (Cloud Foundation Fabric)." FAST is a solid Terraform framework, but it requires effort to set up and maintain. For this reason, we chose tfvars — simpler and more suitable for small companies or projects.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F793xjc0hflatezfvp5bl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F793xjc0hflatezfvp5bl.png" alt="Sc3" width="632" height="764"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Merlin is able to produce scripts for landing zones that meet the requirements of a set of EU and US compliance frameworks. In our example we assume the company has no specific regulatory requirements, but we still recommend aligning the GCP setup to Google best practices — specifically, CIS Benchmarks. The CIS (Center for Internet Security) Benchmarks are a set of globally recognized configuration guidelines designed to reduce the attack surface of cloud environments. They are vendor-neutral, widely adopted, and free to use. The CIS recommendations are labeled on the configuration screens, but you are not required to accept all of them.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwr76c452lyfdv5x7mysl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwr76c452lyfdv5x7mysl.png" alt="Sc4" width="628" height="771"&gt;&lt;/a&gt;&lt;br&gt;
Based on the information provided during Discovery, Merlin sets the default configuration parameters, determines the profile complexity, identifies which configuration sections are required, and recommends a configuration mode: &lt;strong&gt;Express&lt;/strong&gt; (accept best-practice defaults), &lt;strong&gt;Guided&lt;/strong&gt; (review recommendations, customize as needed), or &lt;strong&gt;Expert&lt;/strong&gt; (full control over all options). You can change the configuration mode at any time, but to change the profile you must return to the Discovery stage.&lt;/p&gt;

&lt;p&gt;In our example, Merlin recommends the Simple profile and activates 12 configuration sections. To illustrate the key architectural decisions, we selected Guided mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fii8rj5vp0iytdf7r7mtp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fii8rj5vp0iytdf7r7mtp.png" alt="sc5" width="626" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd8w1qgw99g4igfcutbe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd8w1qgw99g4igfcutbe.png" alt="sc6" width="626" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuration
&lt;/h1&gt;

&lt;p&gt;Configuration is organized into sections, each covering a specific GCP domain — IAM, Networking, Security, and others. For our startup example, Merlin activated 12 sections. A sidebar lets you navigate between sections in any order — completed sections are marked, so you always know where you stand. You can focus on the sections relevant to your setup and leave the rest at their default values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0wicoaeoi7o5kqtbk05k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0wicoaeoi7o5kqtbk05k.png" alt="sc7" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting up a GCP environment requires tens, sometimes hundreds of parameters. Merlin makes this as straightforward as possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most fields have default values, set based on data collected during Discovery.
&lt;/li&gt;
&lt;li&gt;Almost every field has a help panel with a short explanation, a link to the relevant Google documentation, and an optional LLM prompt.
&lt;/li&gt;
&lt;li&gt;Fields required by compliance frameworks (CIS Benchmark in our case) are marked with a badge — red for mandatory, orange for recommended.
&lt;/li&gt;
&lt;li&gt;Merlin validates field values in real time and warns about errors and invalid inputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you finish all configuration steps, click &lt;strong&gt;Generate Spec&lt;/strong&gt; to produce a JSON document summarizing all configuration parameters. This step also performs cross-section validation, surfacing any errors and unmet requirements. If you are satisfied with the configuration, proceed to the next stage.    &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefo62sd7j3tu7sk25rms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefo62sd7j3tu7sk25rms.png" alt="sc10" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65snklaavm7np3mu21jg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65snklaavm7np3mu21jg.png" alt="sc10a" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Generation
&lt;/h1&gt;

&lt;p&gt;In the final stage, Merlin produces the artifacts for setting up your GCP environment. Clicking the &lt;strong&gt;Generate Artifacts&lt;/strong&gt; button starts the process. In our case, the output includes documentation, security scorecards, architecture diagrams, and 14 Terraform-related files (12 .tfvars and 2 JSON metadata files) used to provision the GCP environment.&lt;br&gt;&lt;br&gt;
 In our example, we showed how a DevOps engineer without deep GCP expertise can set up a landing zone from scratch in a single interactive session. Starting from business questions and simple configuration choices, you end up with 14 tfvars files, architecture and security scorecards, Mermaid diagrams, and a step-by-step DEPLOYMENT_GUIDE.md aligned with CIS Benchmarks.&lt;/p&gt;

&lt;p&gt;Merlin does not replace learning GCP. You still need to understand what you deploy, review the generated code, and adapt it to your environment. But instead of starting from an empty folder, you start with a working foundation that follows best practices. Your time goes into understanding the decisions, not rediscovering them.&lt;/p&gt;

&lt;p&gt;A complete set of files — including Terraform configurations, documentation, scorecards, and architecture diagrams — can be found at &lt;a href="https://github.com/Merlin-Studio/Startup-Example" rel="noopener noreferrer"&gt;github.com/Merlin-Studio/Startup-Example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Merlin is now open and free to try. No signup, no email — guest mode lets you start designing instantly: &lt;a href="https://app.merlin-studio.cloud/" rel="noopener noreferrer"&gt;https://app.merlin-studio.cloud/&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is the second article in our GCP Landing Zone series. The first article — &lt;a href="https://medium.com/google-cloud/setting-up-a-gcp-landing-zone-for-organizations-with-strict-regulatory-requirements-9054e0958b76" rel="noopener noreferrer"&gt;Setting Up a GCP Landing Zone for Organizations with Strict Regulatory Requirements&lt;/a&gt; — covers the same approach for healthcare and other regulated industries.&lt;/em&gt; &lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>devops</category>
      <category>terraform</category>
      <category>startup</category>
    </item>
    <item>
      <title>Setting Up a GCP Landing Zone for Organizations with Strict Regulatory Requirements</title>
      <dc:creator>Boris Teplitsky</dc:creator>
      <pubDate>Mon, 20 Apr 2026 07:46:06 +0000</pubDate>
      <link>https://dev.to/boristep/setting-up-a-gcp-landing-zone-for-organizations-with-strict-regulatory-requirements-3p59</link>
      <guid>https://dev.to/boristep/setting-up-a-gcp-landing-zone-for-organizations-with-strict-regulatory-requirements-3p59</guid>
      <description>&lt;p&gt;Setting up a GCP Landing Zone for organizations with strict compliance requirements is not a trivial task. Cloud Foundation Fabric with a suitable template can significantly simplify the work — but what if no appropriate template exists, or your specific requirements go beyond what the templates cover? In this article, we explain how a tool we built, Merlin Studio, can help set up a landing zone under complex compliance requirements. We use a US healthcare provider as an example, walking through a landing zone aligned with the HIPAA compliance framework. The same approach applies to other regulations in the US and EU.&lt;/p&gt;

&lt;p&gt;The setup process with Merlin Studio consists of three parts:&lt;br&gt;
&lt;strong&gt;Discovery&lt;/strong&gt; — defining business requirements and conditions&lt;br&gt;
&lt;strong&gt;Configuration&lt;/strong&gt; — setting parameters for all landing zone sections&lt;br&gt;
&lt;strong&gt;Generation&lt;/strong&gt; — producing a package of Cloud Foundation Fabric YAML files, scorecards, documentation, and guides.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmk4zzcyzobv18fse0xt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmk4zzcyzobv18fse0xt.png" alt="info" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you want to try Merlin on your own landing zone, drop us an email at &lt;a href="mailto:intentarcha@gmail.com"&gt;intentarcha@gmail.com&lt;/a&gt; and we’ll set up your access — it’s free.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovery
&lt;/h2&gt;

&lt;p&gt;The goal of this stage is to determine who and what we are setting up. During Discovery, the user fills out 7 forms describing the company and project's business environment. The forms cover general information about the organization and specific GCP implementation conditions: deployment strategy (GCP-only, hybrid with on-premises, or multi-cloud), workload types, company size, timeline, and budget expectations. A critical section is compliance — which regulatory frameworks must be implemented.&lt;br&gt;
In our example, we use a US healthcare provider that needs to connect GCP to an on-premises data center via Partner Interconnect. The required compliance frameworks are HIPAA, SOC 2, and CIS Benchmarks. Infrastructure requirements include multi-region deployment (us-east1 as primary, us-west1 as secondary) with warm standby disaster recovery.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F144aj5yedvugmqdyhdzu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F144aj5yedvugmqdyhdzu.png" alt="sc1" width="800" height="755"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuam1gc8csmzuknvgvd32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuam1gc8csmzuknvgvd32.png" alt="sc2" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w7s4iozerm1fttuk41y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w7s4iozerm1fttuk41y.png" alt="sc3" width="800" height="688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8v8eblijgcfce7abguwc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8v8eblijgcfce7abguwc.png" alt="sc4" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Based on the information provided during Discovery, Merlin sets the default landing zone configuration parameters, determines the profile complexity, identifies which configuration sections are required, and recommends a configuration mode: Express (accept best-practice defaults), Guided (review recommendations, customize as needed), or Expert (full control over all options). The user can change the configuration mode at any time, but to change the profile, they must return to the Discovery stage.&lt;br&gt;
In our example, Merlin recommends the Standard profile and activates 17 configuration sections. The user selects Guided mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbi495moqrdu5y3z481v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbi495moqrdu5y3z481v.png" alt="sc5" width="800" height="834"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foofqumknty4a5jg1433q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foofqumknty4a5jg1433q.png" alt="sc6" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;Configuration is organized into sections, each covering a specific domain — IAM, Networking, Security, and others. In our example, Merlin recommended 17 sections. A sidebar allows free navigation between sections in any order — completed sections are marked, so the user always knows where they are. This allows focusing on specific sections and leaving others at their default values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1533kvq6k465an7nx26b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1533kvq6k465an7nx26b.png" alt="sc7" width="774" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe158m7mjt5txiwrilfni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe158m7mjt5txiwrilfni.png" alt="sc8" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
In order to set up a landing zone, it is necessary to define hundreds of parameters. Merlin makes this task as straightforward as possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most fields have default values, set based on data collected during Discovery and the selected compliance framework requirements.&lt;/li&gt;
&lt;li&gt;Almost every field has a help panel with a short explanation, a link to the relevant Google documentation, and an optional LLM prompt.&lt;/li&gt;
&lt;li&gt;Fields required by compliance frameworks are marked with a badge — red for mandatory, orange for recommended.&lt;/li&gt;
&lt;li&gt;Merlin validates field values in real time and warns about errors and invalid inputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final step of the Configuration stage is generating a specification. Clicking the "Generate Spec" button triggers cross-section validation and produces a structured JSON document summarizing all configuration parameters. The results screen shows two things: any unmet compliance requirements with direct links to the relevant configuration sections, and the full specification in a readable format.&lt;br&gt;
The compliance posture summary is particularly useful — it shows exactly how many requirements are met per framework (in our example: SOC 2 12/13, HIPAA 28/29, CIS Benchmarks 16/17), lists each unmet requirement with the specific control reference, and provides a direct link to the configuration section where it can be fixed. No cross-referencing external documentation — everything needed to reach full compliance is on one screen.&lt;br&gt;
If the user is satisfied with the configuration, they proceed to the next stage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfgatm2odyulcd0bc306.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfgatm2odyulcd0bc306.png" alt="sc11" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation
&lt;/h2&gt;

&lt;p&gt;In the final stage, Merlin produces artifacts for setting up the landing zone with minimal effort compared to starting from scratch. All generated artifacts are divided into four categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scorecards — Merlin evaluates the configuration from architecture and security perspectives and provides a score with an explanation of any issues found. In our example, the security scan scored 100/100 (Checkov) and the architecture scorecard 98/100 — Overall Grade A. This is shift-left in practice: issues are caught at design time, before deployment, without waiting for findings from Security Command Center or Wiz.&lt;/li&gt;
&lt;li&gt;Terraform — Merlin generated 61 YAML files ready to use with Cloud Foundation Fabric. The files cover all five FAST stages: bootstrap (org setup, IAM, org policies), networking (VPC, subnets, firewall, DNS), security (KMS, SCC), project factory (workload projects), and VPC Service Controls (service perimeters). Dependencies between stages are handled automatically via FAST's $-interpolation tokens — no manual ID copying between stages.&lt;/li&gt;
&lt;li&gt;Documentation — A landing zone description and a step-by-step deployment guide explaining how to use the generated YAML files with Cloud Foundation Fabric.&lt;/li&gt;
&lt;li&gt;Diagrams — A set of diagrams describing the landing zone structure. Merlin produces Mermaid (.mmd) files rather than static images. Diagrams can be rendered at &lt;a href="https://mermaid.live" rel="noopener noreferrer"&gt;https://mermaid.live&lt;/a&gt; or converted to any graphics format.
The complete set of generated files and other Merlin examples are available at &lt;a href="https://github.com/Merlin-Studio" rel="noopener noreferrer"&gt;https://github.com/Merlin-Studio&lt;/a&gt;. Merlin Studio is currently free — registration only at &lt;a href="https://site.merlin-studio.cloud" rel="noopener noreferrer"&gt;https://site.merlin-studio.cloud&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1rrludmlnndcp5gezba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1rrludmlnndcp5gezba.png" alt="Sc12" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4v5hzkr0m6s4ymmruzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4v5hzkr0m6s4ymmruzk.png" alt="sc13" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our example we showed how weeks of work can be reduced to a single interactive session. Starting from business requirements and technical conditions, and with guidance from the tool throughout, the user ends up with 61 ready-to-use Cloud Foundation Fabric files, architecture and security scorecards, a deployment guide, and Mermaid diagrams — all aligned with HIPAA, SOC 2, and CIS Benchmarks.&lt;/p&gt;

&lt;p&gt;Despite providing a rich set of deployment-ready files, Merlin does not replace the cloud architect. Design review, stakeholder discussions, and alignment with networking and security teams remain an essential part of any landing zone project. What Merlin does is take the tedious part off the table.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interested in trying it? Email &lt;a href="mailto:intentarcha@gmail.com"&gt;intentarcha@gmail.com&lt;/a&gt; — we’ll get you set up within 24 hours.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>infrastructureascode</category>
      <category>googlecloud</category>
      <category>terraform</category>
      <category>hipaa</category>
    </item>
    <item>
      <title>GCP Landing Zone Setup Automation</title>
      <dc:creator>Boris Teplitsky</dc:creator>
      <pubDate>Mon, 16 Mar 2026 10:30:04 +0000</pubDate>
      <link>https://dev.to/boristep/gcp-landing-zone-setup-automation-31f8</link>
      <guid>https://dev.to/boristep/gcp-landing-zone-setup-automation-31f8</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every GCP engagement starts the same way. Discovery call, spreadsheet &lt;br&gt;
of requirements, weeks of manual Terraform, IAM wiring, VPC design, &lt;br&gt;
org policies, budget alerts. Then a review cycle to catch what was &lt;br&gt;
missed. Then another.&lt;/p&gt;

&lt;p&gt;For a process that happens at the start of every cloud project, &lt;br&gt;
it's remarkably unautomated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Landing Zone Actually Requires
&lt;/h2&gt;

&lt;p&gt;A production-ready GCP landing zone typically includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organization hierarchy and folder structure&lt;/li&gt;
&lt;li&gt;VPC and shared networking&lt;/li&gt;
&lt;li&gt;IAM roles and service accounts&lt;/li&gt;
&lt;li&gt;Org policies and constraints&lt;/li&gt;
&lt;li&gt;Budget alerts and billing controls&lt;/li&gt;
&lt;li&gt;Security baselines&lt;/li&gt;
&lt;li&gt;FAST-compatible configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting all of this right manually takes 2-3 weeks minimum.&lt;/p&gt;

&lt;h2&gt;
  
  
  A New Approach: Merlin
&lt;/h2&gt;

&lt;p&gt;Merlin is a GCP landing zone generator. Answer an architecture &lt;br&gt;
questionnaire — org structure, environments, compliance, networking &lt;br&gt;
— and it outputs a complete production-ready landing zone.&lt;/p&gt;

&lt;p&gt;What comes out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FAST-compatible Terraform files&lt;/li&gt;
&lt;li&gt;Architecture and security scorecards&lt;/li&gt;
&lt;li&gt;Mermaid diagrams&lt;/li&gt;
&lt;li&gt;Validation warnings&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  See the Real Output
&lt;/h2&gt;

&lt;p&gt;Published openly on GitHub — no signup required:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Merlin-Studio" rel="noopener noreferrer"&gt;github.com/Merlin-Studio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Includes Simple, Standard, and Advanced profile examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth Knowing About
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://site.merlin-studio.cloud" rel="noopener noreferrer"&gt;site.merlin-studio.cloud&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>terraform</category>
      <category>devops</category>
      <category>cloudarchitecture</category>
    </item>
  </channel>
</rss>
