<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>DX Blog</title>
        <link>https://dx.pagopa.it/blog</link>
        <description>DX Blog</description>
        <lastBuildDate>Tue, 24 Mar 2026 10:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Securing Function Apps with Managed Identity: No More Function Keys]]></title>
            <link>https://dx.pagopa.it/blog/function-app-managed-identity-auth</link>
            <guid>https://dx.pagopa.it/blog/function-app-managed-identity-auth</guid>
            <pubDate>Tue, 24 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[The Azure Function App Terraform module now supports Entra ID authentication, letting APIM authenticate via Managed Identity instead of shared function keys.]]></description>
            <content:encoded><![CDATA[<p>Managing shared secrets is a hidden cost of running APIs: function keys must be
stored in Key Vault, injected by APIM, and rotated periodically. One leaked key
means any caller can invoke your Function App. Beyond security concerns, shared
keys obscure your architecture: you lose track of who the caller is and how
changes to your Function App may ripple through your system. The DX team has
shipped an update to the <strong>Azure Function App Terraform module</strong> that eliminates
this pattern entirely.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="what-changed">What Changed<a href="https://dx.pagopa.it/blog/function-app-managed-identity-auth#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-function-app/azurerm/latest" target="_blank" rel="noopener noreferrer" class=""><code>azure-function-app</code></a>
module now accepts an <code>entra_id_authentication</code> variable. When set, the Function
App enforces <strong>token-based authentication</strong>: every inbound request must carry a
valid JWT issued by Entra ID. Unauthenticated calls receive HTTP 401 — no key
required, no secret to rotate.</p>
<p>APIM obtains the token automatically using its <strong>system-assigned Managed
Identity</strong>, so the integration remains seamless from the caller's perspective.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="how-it-works">How It Works<a href="https://dx.pagopa.it/blog/function-app-managed-identity-auth#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<!-- -->
<p>The module wires up Entra ID authentication (EasyAuth) under the hood: every
inbound request is validated against the tenant endpoint, and only APIM
identities explicitly listed in <code>allowed_callers_client_ids</code> can authenticate.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="getting-started">Getting Started<a href="https://dx.pagopa.it/blog/function-app-managed-identity-auth#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "function_app" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure-function-app/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># ... other required parameters ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">entra_id_authentication</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">audience_client_id</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azuread_application.my_app.client_id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">allowed_callers_client_ids</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">data.azuread_service_principal.apim.client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tenant_id</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_subscription.current.tenant_id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>On the APIM side, replace the <code>x-functions-key</code> header with the
<code>authentication-managed-identity</code> policy element — that's the only policy change
needed.</p>
<div class="theme-admonition theme-admonition-info admonition_x7yd alert alert--info"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_udfK"><p>The Entra ID application must be created manually. Infrastructure contributors
do not have the required permissions to create Entra registrations via
Terraform. Open a ticket in <strong>#team_devex_help</strong> Slack channel to request one.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="key-benefits">Key Benefits<a href="https://dx.pagopa.it/blog/function-app-managed-identity-auth#key-benefits" class="hash-link" aria-label="Direct link to Key Benefits" title="Direct link to Key Benefits" translate="no">​</a></h2>
<table><thead><tr><th>Aspect</th><th>Before (key-based)</th><th>After (Managed Identity)</th></tr></thead><tbody><tr><td>Secrets</td><td>Function key in Key Vault</td><td>None — token-based</td></tr><tr><td>Caller control</td><td>Any holder of the key</td><td>Only <code>allowed_callers_client_ids</code></td></tr><tr><td>Key rotation</td><td>Manual, periodic</td><td>Not needed</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="learn-more">Learn More<a href="https://dx.pagopa.it/blog/function-app-managed-identity-auth#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p>For step-by-step configuration, APIM policy examples, and a recommended
blue-green migration strategy for existing Function Apps, read the full guide:</p>
<p>👉
<a href="https://dx.pagopa.it/docs/azure/integrating-services/apim-function-app-authentication" target="_blank" rel="noopener noreferrer" class=""><strong>Authenticating APIM to Function Apps with Managed Identity</strong></a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing SaveMoney: Smart FinOps for Azure Resources]]></title>
            <link>https://dx.pagopa.it/blog/savemoney-finops-tool</link>
            <guid>https://dx.pagopa.it/blog/savemoney-finops-tool</guid>
            <pubDate>Fri, 05 Dec 2025 10:00:00 GMT</pubDate>
            <description><![CDATA[A data-driven approach to identifying unused and cost-inefficient cloud resources with the DX CLI]]></description>
            <content:encoded><![CDATA[<p>Cloud costs can quickly spiral out of control. Forgotten <strong>virtual machines</strong>,
<strong>unattached disks</strong>, idle <strong>App Service Plans</strong>—these <em>"ghost resources"</em>
accumulate over time, silently draining budgets. To address this challenge, the
DX team has built <strong>SaveMoney</strong>, a tool integrated into the DX CLI that helps
teams identify and optimize cloud spending without breaking a sweat.</p>
<p>SaveMoney is <strong>read-only, metric-driven, and intelligent</strong>. It doesn't delete or
modify anything—instead, it generates detailed reports to support informed
FinOps decisions.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="the-problem-hidden-cloud-waste">The Problem: Hidden Cloud Waste<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#the-problem-hidden-cloud-waste" class="hash-link" aria-label="Direct link to The Problem: Hidden Cloud Waste" title="Direct link to The Problem: Hidden Cloud Waste" translate="no">​</a></h2>
<p>In large cloud environments, it's easy to lose track of resources:</p>
<ul>
<li class="">A developer spins up a VM for testing and forgets to deallocate it</li>
<li class="">An App Service Plan remains active after all apps are removed</li>
<li class="">Disks persist after VMs are deleted</li>
<li class="">Public IPs sit idle with no associated resources</li>
</ul>
<p>These scenarios are common across organizations, and they add up to significant
unnecessary costs. Traditional cloud cost management tools often rely on simple
heuristics or require manual tagging—neither of which provides the full picture.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="the-solution-metric-based-analysis">The Solution: Metric-Based Analysis<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#the-solution-metric-based-analysis" class="hash-link" aria-label="Direct link to The Solution: Metric-Based Analysis" title="Direct link to The Solution: Metric-Based Analysis" translate="no">​</a></h2>
<p>SaveMoney takes a <strong>data-driven approach</strong> to cost optimization by analyzing
actual Azure Monitor metrics over configurable time periods. Instead of guessing
whether a resource is unused, it examines:</p>
<ul>
<li class=""><strong>CPU utilization</strong> for Virtual Machines and App Service Plans</li>
<li class=""><strong>Network traffic</strong> for VMs, Public IPs, and Static Web Apps</li>
<li class=""><strong>Memory consumption</strong> for App Service Plans and Container Apps</li>
<li class=""><strong>Transaction counts</strong> for Storage Accounts</li>
<li class=""><strong>Deployment state</strong> for Container Apps and App Service Plans</li>
</ul>
<p>This metric-based detection provides high confidence in the results, reducing
false positives and helping teams focus on truly wasteful resources.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="architecture--multi-cloud-vision">Architecture &amp; Multi-Cloud Vision<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#architecture--multi-cloud-vision" class="hash-link" aria-label="Direct link to Architecture &amp; Multi-Cloud Vision" title="Direct link to Architecture &amp; Multi-Cloud Vision" translate="no">​</a></h2>
<p>SaveMoney follows a modular architecture designed for <strong>multi-cloud support</strong>:</p>
<!-- -->
<p>Currently, <strong>Azure is the primary supported cloud provider</strong>, with comprehensive
analysis for common resource types. AWS support is planned for future releases.
The architecture separates cloud-specific analyzers from the core logic, making
it straightforward to add new providers and expand coverage.</p>
<div class="theme-admonition theme-admonition-note admonition_x7yd alert alert--secondary"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Continuous Improvement</div><div class="admonitionContent_udfK"><p>The Azure analyzer is actively evolving. We're continuously refining detection
logic, adding support for additional resource types, and improving metric-based
thresholds based on real-world feedback.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="what-savemoney-detects">What SaveMoney Detects<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#what-savemoney-detects" class="hash-link" aria-label="Direct link to What SaveMoney Detects" title="Direct link to What SaveMoney Detects" translate="no">​</a></h2>
<p>SaveMoney currently analyzes <strong>9 common Azure resource types</strong>, focusing on the
ones that typically drive the most cloud waste:</p>
<ul>
<li class=""><strong>High Cost Risk</strong>: Virtual Machines (deallocated or idle), App Service Plans
(empty or oversized)</li>
<li class=""><strong>Medium Cost Risk</strong>: Orphaned Disks, unused Public IPs, idle Network
Interfaces, disconnected Private Endpoints, low-traffic Storage Accounts and
Container Apps</li>
<li class=""><strong>Low Cost Risk</strong>: Static Web Apps with minimal traffic</li>
</ul>
<p>Each resource is evaluated using a combination of <strong>state checks</strong> (is it
attached? running?) and <strong>Azure Monitor metrics</strong> (CPU usage, network traffic,
transactions) to minimize false positives.</p>
<div class="theme-admonition theme-admonition-tip admonition_x7yd alert alert--success"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_udfK"><p>For the complete list of analyzed resources and detection criteria, check out
the
<a href="https://dx.pagopa.it/docs/dx-cli#savemoney--cost-optimization" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="getting-started">Getting Started<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>SaveMoney is available as part of the <code>@pagopa/dx-cli</code> toolchain. Here's how to
use it:</p>
<div class="theme-admonition theme-admonition-info admonition_x7yd alert alert--info"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Early Stage</div><div class="admonitionContent_udfK"><p>SaveMoney is currently in its initial version. The CLI interface and available
commands will evolve over time with additional filters, output options, and
workflow integrations based on user feedback and real-world usage.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="prerequisites">Prerequisites<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class=""><strong>Azure subscription(s)</strong> with appropriate permissions</li>
<li class=""><strong>Azure CLI authentication</strong></li>
<li class=""><strong>Node.js 22 or higher</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="installation">Installation<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>You can invoke the CLI directly via <code>npx</code> without installing globally, and if
you're already using the DX CLI, SaveMoney is included:</p>
<div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--help</span><br></div></code></pre></div></div>
<p>When installed locally in a monorepo you can also run:</p>
<div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> dx savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--help</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="configuration-options">Configuration Options<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#configuration-options" class="hash-link" aria-label="Direct link to Configuration Options" title="Direct link to Configuration Options" translate="no">​</a></h3>
<p>SaveMoney supports multiple configuration methods to fit different workflows:</p>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">Config File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Environment Variables</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">CLI Options</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Interactive Prompt</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><p>Create a JSON configuration file (e.g., <code>config.json</code>):</p><div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"tenantId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"your-tenant-id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"subscriptionIds"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"subscription-id-1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"subscription-id-2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"preferredLocation"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"italynorth"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"timespanDays"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div><p>Then run:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--config</span><span class="token plain"> config.json</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><p>Set environment variables:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">ARM_TENANT_ID</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"your-tenant-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">ARM_SUBSCRIPTION_ID</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"subscription-id-1,subscription-id-2"</span><br></div></code></pre></div></div><p>Then run:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><p>Pass options directly via command line:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--config</span><span class="token plain"> config.json </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--format</span><span class="token plain"> table </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--location</span><span class="token plain"> italynorth </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--days</span><span class="token plain"> </span><span class="token number">30</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--verbose</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><p>If no configuration is provided, SaveMoney will prompt you interactively:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Enter Tenant ID: your-tenant-id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Enter Subscription IDs (comma-separated): sub-1,sub-2</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="output-formats">Output Formats<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#output-formats" class="hash-link" aria-label="Direct link to Output Formats" title="Direct link to Output Formats" translate="no">​</a></h3>
<p>SaveMoney offers three output formats to suit different use cases:</p>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">JSON Format</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Table Format</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Detailed JSON</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><p>Standard JSON output for integration with other tools or CI/CD pipelines:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--format</span><span class="token plain"> json</span><br></div></code></pre></div></div><p><strong>Example output:</strong></p><div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"costRisk"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"high"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"location"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"italynorth"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"vm-test-01"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"reason"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Low CPU usage (avg 0.57%). Low network traffic (0.06 MB/day avg)."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"resourceGroup"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg-test"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"subscriptionId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"suspectedUnused"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Microsoft.Compute/virtualMachines"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><p>A human-readable summary perfect for terminal viewing:</p><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--format</span><span class="token plain"> table</span><br></div></code></pre></div></div><p><strong>Example output:</strong></p><div class="language-text codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-text codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">┌────────────────────────┬─────────────────────────────────────┬────────────────┬────────┬──────────────────────────────────────────┐</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ Name                   │ Type                                │ Resource Group │ Risk   │ Reason                                   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├────────────────────────┼─────────────────────────────────────┼────────────────┼────────┼──────────────────────────────────────────┤</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ vm-test-01             │ Microsoft.Compute/virtualMachines   │ rg-test        │ high   │ VM is deallocated.                       │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ asp-unused-premium     │ Microsoft.Web/serverfarms           │ rg-prod        │ high   │ No apps deployed. Premium tier.          │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ disk-unattached        │ Microsoft.Compute/disks             │ rg-dev         │ medium │ Disk is not attached to any VM.          │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ pip-idle-static        │ Microsoft.Network/publicIPAddresses │ rg-network     │ medium │ Not associated. Static IP not in use.    │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└────────────────────────┴─────────────────────────────────────┴────────────────┴────────┴──────────────────────────────────────────┘</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><p>Comprehensive output with <strong>all resource metadata</strong>, ideal for:</p><ul>
<li class="">Deep analysis with AI tools or LLMs</li>
<li class="">Custom scripts and automation</li>
<li class="">Audit trails and compliance reports</li>
</ul><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--format</span><span class="token plain"> detailed-json</span><br></div></code></pre></div></div><p>This format includes complete Azure resource properties, tags, locations, SKUs,
and more.</p></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="the-road-ahead">The Road Ahead<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#the-road-ahead" class="hash-link" aria-label="Direct link to The Road Ahead" title="Direct link to The Road Ahead" translate="no">​</a></h2>
<p>We're continuously evolving SaveMoney with exciting features on the horizon:</p>
<ul>
<li class="">
<p><strong>Multi-Cloud Expansion</strong> – AWS support is on the roadmap, extending the same
metric-driven approach to Amazon Web Services and beyond. Our modular
architecture makes it straightforward to add analyzers for additional cloud
providers.</p>
</li>
<li class="">
<p><strong>Automated Governance</strong> – Automated reports showing unused resources detected
in your subscriptions, and CI/CD pipeline integration to flag potential waste
before it accumulates.</p>
</li>
<li class="">
<p><strong>Smarter Analysis</strong> – Enhanced detection logic for additional Azure resource
types, more sophisticated metric analysis with configurable thresholds, trend
analysis to identify usage patterns, and integration with cloud pricing APIs
for precise cost impact estimates.</p>
</li>
<li class="">
<p><strong>Additional Output Formats</strong> – Reports based on community feedback for
different use cases and workflow integrations.</p>
</li>
<li class="">
<p><strong>Workflow Integration</strong> – Automated PR comments with cost impact analysis,
policy-based governance for automatic resource tagging, and custom dashboards
showing cost trends and optimization opportunities.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="get-started-today">Get Started Today<a href="https://dx.pagopa.it/blog/savemoney-finops-tool#get-started-today" class="hash-link" aria-label="Direct link to Get Started Today" title="Direct link to Get Started Today" translate="no">​</a></h2>
<p>Ready to uncover hidden waste in your Azure environment? SaveMoney is
open-source and available now as part of the DX toolchain.</p>
<p><strong>Start your first analysis in under a minute:</strong></p>
<div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli savemoney </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--help</span><br></div></code></pre></div></div>
<p><strong>Explore the documentation:</strong></p>
<ul>
<li class=""><a href="https://dx.pagopa.it/docs/dx-cli#savemoney--cost-optimization" target="_blank" rel="noopener noreferrer" class="">Full CLI documentation</a>
– Configuration options, output formats, and usage examples</li>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/packages/savemoney" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>
– Source code and architecture details</li>
</ul>
<hr>
<p>Cloud cost optimization doesn't have to be a monthly fire drill. With the right
tools and automation, it becomes part of your daily workflow—invisible,
effortless, and continuous.</p>
<p>Happy cost optimization! 💰</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Migrating to PNPM: What's Next for the PagoPA DX Toolchain]]></title>
            <link>https://dx.pagopa.it/blog/migrating-to-pnpm</link>
            <guid>https://dx.pagopa.it/blog/migrating-to-pnpm</guid>
            <pubDate>Fri, 03 Oct 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[Big news for the PagoPA developer community! 🎉]]></description>
            <content:encoded><![CDATA[<p>Big news for the PagoPA developer community! 🎉</p>
<p>We're officially moving from Yarn to
<a href="https://pagopa.github.io/technology-radar/tools/pnpm.html" target="_blank" rel="noopener noreferrer" class="">PNPM</a> for our
dependency management. This change is a significant step forward for the PagoPA
DX Toolchain, bringing improvements in speed, consistency and security to our
development workflow.</p>
<div class="theme-admonition theme-admonition-warning admonition_x7yd alert alert--warning"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Deprecation notice</div><div class="admonitionContent_udfK"><p>We understand that a change of this magnitude requires a smooth transition. That's why Yarn will continue to be fully
supported and integrated into our toolchain until <strong>January 16th, 2026</strong>, after
which it will be officially dismissed.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="why-pnpm">Why PNPM?<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#why-pnpm" class="hash-link" aria-label="Direct link to Why PNPM?" title="Direct link to Why PNPM?" translate="no">​</a></h2>
<p>You might be asking why we're making this switch. Here are a few key reasons:</p>
<ul>
<li class="">
<p><strong>Faster and More Efficient</strong>: PNPM's unique approach to dependency
management, using a content-addressable store, avoids the need for duplicated
packages. This means faster installations and less disk space consumption.</p>
</li>
<li class="">
<p><strong>A Safer Dependency Tree</strong>: PNPM creates a strict, non-flat node_modules
structure, which helps prevent accidental access to dependencies that are not
explicitly declared in your package.json. This makes our dependency trees more
predictable and secure. This is particularly beneficial for our monorepo
setups, as it will prevent ghost dependencies issues before the deployment.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="getting-started">Getting Started<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>We've already updated the PagoPA DX Toolchain to include PNPM support. To make
the migration as smooth as possible, we've created a migration script accessible
via our DX CLI.</p>
<p>To run the migration script, use the following command in your project's root
directory:</p>
<div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx @pagopa/dx-cli codemod apply use-pnpm</span><br></div></code></pre></div></div>
<p>This script will import your existing lockfile and it will automatically
replace Yarn and NPM commands in your CI/CD workflows with their PNPM equivalents.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="prerequisites">Prerequisites<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer" class="">Node.js</a> <code>20.19.5</code> or higher with <code>corepack</code> enabled.</p>
<div class="theme-admonition theme-admonition-note admonition_x7yd alert alert--secondary"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_udfK"><p>Corepack is included by default with Node.js versions 16.9.0 and
above, but you'll need to enable it manually for version 20 and above. You can
do this by running:</p><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">corepack </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">enable</span><br></div></code></pre></div></div></div></div>
</li>
<li class="">
<p>Your project should use the PagoPA DX workflows for code review and
deployment. The migration script will update only the following workflows:</p>
<ul>
<li class=""><a class="" href="https://dx.pagopa.it/docs/typescript/code-review">js_code_review.yaml</a></li>
<li class=""><code>web_app_deploy.yaml</code></li>
<li class=""><code>function_app_deploy.yaml</code></li>
</ul>
</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_x7yd alert alert--success"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Need help?</div><div class="admonitionContent_udfK"><p>For any questions or assistance you need during the migration
process, you can reach out to the PagoPA DX team on Slack in the
<code>#team_devex_help</code> channel.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="after-the-migration">After the migration<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#after-the-migration" class="hash-link" aria-label="Direct link to After the migration" title="Direct link to After the migration" translate="no">​</a></h3>
<p>After running the migration script, test your project locally to ensure all scripts
are working as expected, and all dependencies are correctly resolved.</p>
<div class="theme-admonition theme-admonition-warning admonition_x7yd alert alert--warning"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Important</div><div class="admonitionContent_udfK"><p>Remember that PNPM is more strict that NPM and Yarn (without Plug'n'Play) and does not allow
indirect dependencies.</p><p>This means that if your project relies on packages that are not explicitly
declared in your <code>package.json</code>, you might encounter errors during installation or runtime.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="quick-guide-using-pnpm">Quick Guide: Using PNPM<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#quick-guide-using-pnpm" class="hash-link" aria-label="Direct link to Quick Guide: Using PNPM" title="Direct link to Quick Guide: Using PNPM" translate="no">​</a></h2>
<p>To help you get started, here's a quick reference guide on how to perform common
tasks with PNPM, compared to their Yarn equivalents.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="install-dependencies">Install dependencies<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#install-dependencies" class="hash-link" aria-label="Direct link to Install dependencies" title="Direct link to Install dependencies" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">Yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">NPM</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">PNPM</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Install dependencies</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Don't alter the lockfile</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--immutable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a new dependency to root package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> express</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a development dependency to root package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-D</span><span class="token plain"> typescript</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Install dependencies</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Don't alter the lockfile</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> ci</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a new dependency to root package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> express</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a development dependency to root package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> --save-dev typescript</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Install dependencies</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Don't alter the lockfile.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># In CI is the default behavior, even without this flag.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> --frozen-lockfile</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a new dependency to root package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># By default, it does not allow adding dependencies to root packages</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># unless the -w (workspace) flag is used</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-w</span><span class="token plain"> express</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a development dependency to root package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-w</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-D</span><span class="token plain"> typescript</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="multi-projects-support">Multi-projects support<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#multi-projects-support" class="hash-link" aria-label="Direct link to Multi-projects support" title="Direct link to Multi-projects support" translate="no">​</a></h3>
<p>Both Yarn and PNPM support managing multiple projects within a single
repository. Yarn requires that packages are defined in the <code>workspaces</code> field of
the root <code>package.json</code>, while PNPM uses a dedicated <code>pnpm-workspace.yaml</code> file.</p>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">Yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">NPM</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">PNPM</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">package.json</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-monorepo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"private"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"workspaces"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token string" style="color:rgb(255, 121, 198)">"apps/*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a new dependency to my-app package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> workspace my-app </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> express</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">package.json</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-monorepo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"private"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"workspaces"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token string" style="color:rgb(255, 121, 198)">"apps/*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a new dependency to my-app package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-w</span><span class="token plain"> my-app </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> express</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">pnpm-workspace.yaml</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">packages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'apps/*'</span><br></div></code></pre></div></div><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a new dependency to my-app package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--filter</span><span class="token plain"> my-app </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> express</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Note that filters, supports wildcards and complex expressions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Example: Add a new dependency to all packages starting with "my-"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-*"</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> express</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Examples: Install dependencies only in packages that have changed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># relative to the main branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"...[origin/main]"</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># The --filter syntax is the same used by Turbo</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="run-scripts">Run scripts<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#run-scripts" class="hash-link" aria-label="Direct link to Run scripts" title="Direct link to Run scripts" translate="no">​</a></h3>
<p>Both Yarn and PNPM allow you to run scripts defined in your <code>package.json</code>
files.</p>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">Yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">NPM</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">PNPM</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in the current package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in the my-app package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> workspace my-app build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in all packages</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> workspaces foreach </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--all</span><span class="token plain"> run build</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in the current package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> run build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in the my-app package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> run build </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-w</span><span class="token plain"> my-app</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in all packages</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> run build </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--workspaces</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-shell codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">shell</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-shell codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in the current package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in the my-app package</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--filter</span><span class="token plain"> my-app build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run the build script in all packages</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-r</span><span class="token plain"> build</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="other-features">Other features<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#other-features" class="hash-link" aria-label="Direct link to Other features" title="Direct link to Other features" translate="no">​</a></h3>
<p>PNPM offers unique features that help us manage dependencies at scale. Here are
some examples.</p>
<h4 class="anchor anchorTargetStickyNavbar_N5U8" id="catalogs">Catalogs<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#catalogs" class="hash-link" aria-label="Direct link to Catalogs" title="Direct link to Catalogs" translate="no">​</a></h4>
<p><a href="https://pnpm.io/catalogs" target="_blank" rel="noopener noreferrer" class="">Catalogs</a> are a workspaces feature for defining
dependency version ranges as reusable constants.</p>
<p>Imagine you have multiple packages that depend on <code>react</code> and <code>react-dom</code>.
Instead of specifying the version in each package, you can define a catalog in
the root <code>pnpm-workspace.yaml</code> file.</p>
<div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">pnpm-workspace.yaml</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">packages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"apps/*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"packages/*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">catalogs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">react</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ^18.0.0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">react-dom</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ^18.0.0</span><br></div></code></pre></div></div>
<p>Then, in each package's <code>package.json</code>, you can reference the catalog:</p>
<div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">apps/my-app/package.json</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-app"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.0.0"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"dependencies"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"react"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"catalog:"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"react-dom"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"catalog:"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_sufb">packages/my-library/package.json</div><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-library"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.0.0"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"dependencies"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"react"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"catalog:"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"react-dom"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"catalog:"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>When you run <code>pnpm install</code>, PNPM will resolve the <code>catalog:</code> references to the
versions defined in the <code>pnpm-workspace.yaml</code> file. This ensures that all
packages use the same version of <code>react</code> and <code>react-dom</code>, making it easier to
manage and update dependencies across the monorepo.</p>
<h4 class="anchor anchorTargetStickyNavbar_N5U8" id="security">Security<a href="https://dx.pagopa.it/blog/migrating-to-pnpm#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h4>
<p>PNPM has built-in security features that help protect your projects from
vulnerabilities.</p>
<ul>
<li class=""><strong>Post Install Scripts Control</strong>: PNPM allows you to control the execution of
post-install scripts, which can be a vector for supply chain attacks. You can
disable these scripts globally or on a per-package basis.</li>
<li class=""><strong>minimumReleaseAge</strong>: This setting allows you to specify a minimum age for
package releases. This can help avoid using newly published packages that
might not have been thoroughly used yet.</li>
</ul>
<p>For a complete list of PNPM features and commands, check out the
<a href="https://pnpm.io/" target="_blank" rel="noopener noreferrer" class="">official PNPM documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Publishing Terraform Modules and Provider from Our Monorepo: Lessons Learned]]></title>
            <link>https://dx.pagopa.it/blog/terraform-registry-journey</link>
            <guid>https://dx.pagopa.it/blog/terraform-registry-journey</guid>
            <pubDate>Wed, 30 Apr 2025 13:00:00 GMT</pubDate>
            <description><![CDATA[How we managed to publish and maintain Terraform modules and provider from our monorepo]]></description>
            <content:encoded><![CDATA[<p>At PagoPA, we heavily rely on Infrastructure as Code (IaC) practices to deliver
our cloud solutions. Terraform has become a fundamental tool in our engineering
toolkit, allowing us to manage our infrastructure efficiently and ensure
consistency across environments.</p>
<p>As our projects grew in number and complexity, we faced a common challenge: how
to effectively share and reuse Terraform code while maintaining quality and
consistency. This led us to explore publishing our modules and provider to the
Terraform Registry, all while preserving our internal development process based
on a monorepo structure.</p>
<p>In this post, we'll share our journey as the Developer Experience team, the
challenges we faced, and the technical solutions we implemented to bridge the
gap between developing Terraform modules in a single repository and meeting the
Terraform Registry requirements.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="the-challenges-we-faced">The Challenges We Faced<a href="https://dx.pagopa.it/blog/terraform-registry-journey#the-challenges-we-faced" class="hash-link" aria-label="Direct link to The Challenges We Faced" title="Direct link to The Challenges We Faced" translate="no">​</a></h2>
<p>Before diving into our solution, let's outline the main challenges we were
trying to overcome:</p>
<ol>
<li class="">
<p><strong>Encouraging Module Reuse</strong>: Publishing modules to the registry provides a
central, versioned source, encouraging teams to reuse the canonical module
instead of duplicating code or reinventing the wheel.</p>
</li>
<li class="">
<p><strong>Inefficient Module Downloads</strong>: Referencing modules directly from GitHub
meant Terraform downloaded the entire repository for each module, causing
slow <code>terraform init</code> times and inefficient storage space management.</p>
</li>
<li class="">
<p><strong>Version Management</strong>: Without proper versioning, tracking changes and
ensuring backward compatibility became increasingly difficult.</p>
</li>
<li class="">
<p><strong>Documentation</strong>: Without a centralized place to document our modules,
teams struggled to understand how to use them correctly.</p>
</li>
<li class="">
<p><strong>Registry Requirements</strong>: The Terraform Registry has specific requirements
for modules and providers, particularly around repository structure (one
module per repository).</p>
</li>
<li class="">
<p><strong>Development Workflow</strong>: We enjoy the benefits of a monorepo approach for
code reviews, issue tracking, and shared CI/CD pipelines.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="our-solution-bridging-monorepo-and-terraform-registry">Our Solution: Bridging Monorepo and Terraform Registry<a href="https://dx.pagopa.it/blog/terraform-registry-journey#our-solution-bridging-monorepo-and-terraform-registry" class="hash-link" aria-label="Direct link to Our Solution: Bridging Monorepo and Terraform Registry" title="Direct link to Our Solution: Bridging Monorepo and Terraform Registry" translate="no">​</a></h2>
<p>We developed a system that allows us to:</p>
<ol>
<li class="">Develop and maintain modules in our monorepo</li>
<li class="">Automatically publish them to dedicated repositories</li>
<li class="">Release them to the Terraform Registry with proper versioning</li>
</ol>
<p>Here's a visual representation of our approach:</p>
<p><img decoding="async" loading="lazy" alt="Monorepo to Registry Workflow" src="https://dx.pagopa.it/assets/images/push-to-subrepo-43477cd51815ad092061204105908d87.png" width="985" height="726" class="img_Xwu8"></p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="technical-implementation-for-modules">Technical Implementation for Modules<a href="https://dx.pagopa.it/blog/terraform-registry-journey#technical-implementation-for-modules" class="hash-link" aria-label="Direct link to Technical Implementation for Modules" title="Direct link to Technical Implementation for Modules" translate="no">​</a></h3>
<p>The technical implementation involves several components working together to
bridge our monorepo workflow with the Terraform Registry requirements.</p>
<h4 class="anchor anchorTargetStickyNavbar_N5U8" id="1-structured-module-organization">1. Structured Module Organization<a href="https://dx.pagopa.it/blog/terraform-registry-journey#1-structured-module-organization" class="hash-link" aria-label="Direct link to 1. Structured Module Organization" title="Direct link to 1. Structured Module Organization" translate="no">​</a></h4>
<p>Within our monorepo, we organize modules in the
<a href="https://github.com/pagopa/dx/tree/main/infra/modules" target="_blank" rel="noopener noreferrer" class=""><code>infra/modules</code></a>
directory following a consistent pattern. Each module (such as
<a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_api_management" target="_blank" rel="noopener noreferrer" class=""><code>azure_api_management</code></a>
and
<a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_container_app" target="_blank" rel="noopener noreferrer" class=""><code>azure_container_app</code></a>)
contains its own code, tests, examples, and documentation, making it easy for
developers to navigate and contribute.</p>
<h4 class="anchor anchorTargetStickyNavbar_N5U8" id="2-automated-push-to-sub-repositories">2. Automated Push to Sub-repositories<a href="https://dx.pagopa.it/blog/terraform-registry-journey#2-automated-push-to-sub-repositories" class="hash-link" aria-label="Direct link to 2. Automated Push to Sub-repositories" title="Direct link to 2. Automated Push to Sub-repositories" translate="no">​</a></h4>
<p>The heart of our solution is an automated
<a href="https://github.com/pagopa/dx/blob/main/.github/workflows/_release-bash-modules-to-subrepo.yaml" target="_blank" rel="noopener noreferrer" class="">GitHub Action workflow</a>
that handles synchronization between our monorepo and individual repositories.
When changes are made to a module in our monorepo, the workflow detects these
changes and pushes them to a dedicated sub-repository following the Terraform
Registry naming convention. <strong>Crucially, before pushing, automated tests are run
against the modules to ensure quality and prevent regressions.</strong></p>
<p>For instance, our Azure API Management module in the monorepo is pushed to a
repository named
<a href="https://github.com/pagopa-dx/terraform-azurerm-azure-api-management" target="_blank" rel="noopener noreferrer" class=""><code>terraform-azurerm-azure-api-management</code></a>,
making it ready for Registry distribution while preserving our centralized
development model.</p>
<h4 class="anchor anchorTargetStickyNavbar_N5U8" id="3-version-management-with-changesets">3. Version Management with Changesets<a href="https://dx.pagopa.it/blog/terraform-registry-journey#3-version-management-with-changesets" class="hash-link" aria-label="Direct link to 3. Version Management with Changesets" title="Direct link to 3. Version Management with Changesets" translate="no">​</a></h4>
<p>We use <a href="https://github.com/changesets/changesets" target="_blank" rel="noopener noreferrer" class="">Changesets</a> to manage versions
and generate changelogs:</p>
<ol>
<li class="">
<p>Developers create a changeset describing their changes using the tool's
command-line interface.</p>
<div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Example command for creating a changeset</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> changeset</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>This process prompts for the change type (patch/minor/major), a description
of the changes, and the affected modules.</p>
</li>
<li class="">
<p>When merged, a release action automated by the tool bumps versions, updates
changelogs, tags the repository, and triggers the sub-repository push.</p>
</li>
</ol>
<p>This gives us proper semantic versioning and clear documentation of changes.</p>
<h4 class="anchor anchorTargetStickyNavbar_N5U8" id="4-module-security-with-lock-files">4. Module Security with Lock Files<a href="https://dx.pagopa.it/blog/terraform-registry-journey#4-module-security-with-lock-files" class="hash-link" aria-label="Direct link to 4. Module Security with Lock Files" title="Direct link to 4. Module Security with Lock Files" translate="no">​</a></h4>
<p>To ensure security and prevent supply chain attacks, we implemented a pre-commit
system that generates lock files for all Terraform configurations using a
<a href="https://github.com/pagopa/dx/blob/main/infra/scripts/lock-modules.sh" target="_blank" rel="noopener noreferrer" class="">custom script</a>,
similar to provider locks.</p>
<p>This is critical when using Registry modules, as it ensures that the exact
module versions and their content hashes are verified before deployment.</p>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">Lock File Example</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Pre-commit Config</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-json codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-json codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"modules"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"registry.terraform.io/pagopa-dx/azure-role-assignments/azurerm"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"0.0.1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"hash"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a123bc4567890def1234567890abcdef1234567890"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">repos</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">repo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//github.com/pagopa/dx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">rev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pre_commit_scripts@0.0.1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">hooks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lock_modules</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">exclude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ^.</span><span class="token important">*/(_modules|modules|\.terraform)(/.*)?$</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">files</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> src/(prod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain">dev) </span><span class="token comment" style="color:rgb(98, 114, 164)"># Example paths</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="bonus-publishing-our-custom-provider">Bonus: Publishing Our Custom Provider<a href="https://dx.pagopa.it/blog/terraform-registry-journey#bonus-publishing-our-custom-provider" class="hash-link" aria-label="Direct link to Bonus: Publishing Our Custom Provider" title="Direct link to Bonus: Publishing Our Custom Provider" translate="no">​</a></h3>
<p>Beyond modules, we also developed a custom Terraform provider,
<a href="https://registry.terraform.io/providers/pagopa-dx/azure/latest" target="_blank" rel="noopener noreferrer" class="">DX Azure provider</a>,
to encapsulate specific logic like our resource naming conventions. We applied a
similar automated approach:</p>
<ol>
<li class=""><strong>Development</strong> happens in the monorepo (<code>infra/provider</code>).</li>
<li class=""><strong>Automated Workflow</strong>
(<a href="https://github.com/pagopa/dx/blob/main/.github/workflows/_release-bash-provider-to-subrepo.yaml" target="_blank" rel="noopener noreferrer" class=""><code>_release-bash-provider-to-subrepo.yaml</code></a>)
pushes code to a dedicated <code>terraform-provider-azure</code> repository.</li>
<li class=""><strong>Registry Publication</strong>: Tagged releases trigger a CI/CD pipeline that
builds, signs with GPG, and publishes the provider to the Terraform Registry
under the <code>pagopa-dx/azure</code> namespace.</li>
</ol>
<p>This allows teams to use our custom provider easily:</p>
<div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">dx</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 0.0"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Specify desired version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "dx" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Configuration options</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="benefits-and-results">Benefits and Results<a href="https://dx.pagopa.it/blog/terraform-registry-journey#benefits-and-results" class="hash-link" aria-label="Direct link to Benefits and Results" title="Direct link to Benefits and Results" translate="no">​</a></h2>
<p>Our approach has yielded significant benefits:</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="1-better-developer-experience">1. Better Developer Experience<a href="https://dx.pagopa.it/blog/terraform-registry-journey#1-better-developer-experience" class="hash-link" aria-label="Direct link to 1. Better Developer Experience" title="Direct link to 1. Better Developer Experience" translate="no">​</a></h3>
<p>Teams can now simply reference our modules with clear versioning:</p>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">Before</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">After</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "roles" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/pagopa/dx//infra/modules/azure_role_assignments?ref=main"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// parameters...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "roles" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure-role-assignments/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 0.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// parameters...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="2-semantic-versioning-benefits">2. Semantic Versioning Benefits<a href="https://dx.pagopa.it/blog/terraform-registry-journey#2-semantic-versioning-benefits" class="hash-link" aria-label="Direct link to 2. Semantic Versioning Benefits" title="Direct link to 2. Semantic Versioning Benefits" translate="no">​</a></h3>
<p>With our approach to semantic versioning, teams now enjoy a clear contract for
module updates. They can confidently upgrade modules within the same minor
version knowing that breaking changes won't occur. This system helps developers
easily identify when major changes require careful migration planning, reducing
refactoring time during updates and making dependency management more
straightforward.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="3-enhanced-documentation-access">3. Enhanced Documentation Access<a href="https://dx.pagopa.it/blog/terraform-registry-journey#3-enhanced-documentation-access" class="hash-link" aria-label="Direct link to 3. Enhanced Documentation Access" title="Direct link to 3. Enhanced Documentation Access" translate="no">​</a></h3>
<p>The Registry serves as a professional, centralized documentation interface for
all our infrastructure components. Teams can now browse comprehensive module
documentation, review input and output variable specifications, find practical
usage examples, and access version histories all in one place. This
centralization eliminates the need to navigate multiple GitHub repositories or
documentation sources, making it faster and easier to implement modules
correctly.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="4-centralized-development-with-decentralized-distribution">4. Centralized Development with Decentralized Distribution<a href="https://dx.pagopa.it/blog/terraform-registry-journey#4-centralized-development-with-decentralized-distribution" class="hash-link" aria-label="Direct link to 4. Centralized Development with Decentralized Distribution" title="Direct link to 4. Centralized Development with Decentralized Distribution" translate="no">​</a></h3>
<p>Our solution preserves the benefits of monorepo development while gaining the
advantages of Registry distribution. We maintain centralized code reviews and
issue tracking, consistent CI/CD pipelines, and a unified development workflow.
Simultaneously, we benefit from an official publication channel, standardized
documentation formats, semantic versioning, and simplified consumption for end
users.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="lessons-learned">Lessons Learned<a href="https://dx.pagopa.it/blog/terraform-registry-journey#lessons-learned" class="hash-link" aria-label="Direct link to Lessons Learned" title="Direct link to Lessons Learned" translate="no">​</a></h2>
<p>Throughout this journey, we've learned several important lessons that shaped our
approach and thinking about infrastructure code.</p>
<p>Automation proved absolutely essential. Without automated workflows, maintaining
synchronization between our monorepo and sub-repositories would be practically
impossible at scale. We've also discovered that versioning discipline matters
deeply; semantic versioning provides a clear contract for users of our modules
and provider.</p>
<p>Documentation has become a first-class citizen in our process. Good
documentation dramatically reduces onboarding time and support requests, making
teams more productive. We've embedded security into our workflow by using module
lock files, ensuring supply chain security without compromising convenience.</p>
<p>Perhaps most interestingly, we found that the Registry's requirements for
structure and documentation actually drove better practices across our entire
infrastructure codebase, improving our overall IaC quality.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="future-directions">Future Directions<a href="https://dx.pagopa.it/blog/terraform-registry-journey#future-directions" class="hash-link" aria-label="Direct link to Future Directions" title="Direct link to Future Directions" translate="no">​</a></h2>
<p>As we continue to evolve our approach, we're now exploring several exciting
directions. We plan to expand our module catalog to cover more infrastructure
patterns common across our organization. Our team is also enhancing the provider
with additional functions to address more use cases.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="conclusion">Conclusion<a href="https://dx.pagopa.it/blog/terraform-registry-journey#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Our journey from monorepo to Terraform Registry demonstrates that you don't have
to choose between a centralized development workflow and standardized
distribution. With the right automation and tools, you can have the best of both
worlds.</p>
<p>By publishing our modules and provider to the Terraform Registry, we've improved
code reuse, standardization, and documentation while maintaining our preferred
development workflow. The investment in automation has paid dividends in terms
of development velocity and code quality.</p>
<p>We hope our experience provides valuable insights for teams facing similar
challenges in their Infrastructure as Code journey.</p>
<p>Have questions about our approach or want to see our modules? Check out our
<a href="https://registry.terraform.io/namespaces/pagopa-dx" target="_blank" rel="noopener noreferrer" class="">Terraform Registry namespace</a>
or feel free to contact us.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing the 'Azure GitHub Environment Bootstrap' Terraform Module to Enhance New Project Startup]]></title>
            <link>https://dx.pagopa.it/blog/devex-azure-bootstrap-0.1-alpha</link>
            <guid>https://dx.pagopa.it/blog/devex-azure-bootstrap-0.1-alpha</guid>
            <pubDate>Fri, 28 Mar 2025 17:00:00 GMT</pubDate>
            <description><![CDATA[Boosting Brand New Repository Setup]]></description>
            <content:encoded><![CDATA[<p>The new Terraform module
<a href="https://github.com/pagopa/dx/blob/main/infra/modules/azure_github_environment_bootstrap" target="_blank" rel="noopener noreferrer" class=""><code>Azure GitHub Environment Bootstrap</code></a>
developed by the DevEx team, has finally left the beta status by reaching its
first major version release!</p>
<p>This module is useful for anybody that has just created a new repository and
wants to focus quickly on their goals rather than spending hours in setting up
everything around the new repository. The module focuses on projects which
leverage Azure, GitHub, and a single environment (production). After applying
this module, the repository will have:</p>
<ul>
<li class="">completed the setup needed to launch <strong>GitHub Actions</strong> workflows</li>
<li class="">a dedicated private <strong>GitHub Runner</strong> to connect to private Azure resources
from GitHub pipelines</li>
<li class="">an Azure <strong>resource group</strong> to deploy resources generally contained in
<code>infra/resources</code></li>
<li class="">the <strong>required permissions</strong> to operate on domain resources</li>
<li class="">a secure and smooth configuration</li>
</ul>
<p>To accomplish the setup, the module provisions:</p>
<ul>
<li class="">an Azure Container App Job to run workflows in a private <strong>GitHub Runner</strong>
integrated with an Azure VNet</li>
<li class="">a federation between the GitHub repository and Azure user-assigned <strong>managed
identities</strong> to allow workflows to connect with Azure tenant</li>
<li class="">the creation of a project-specific Azure resource group which will contain the
infrastructure of the entire repository as it will share the same lifecycle
and IAM setup</li>
<li class="">the IAM setup of both team and Azure user-assigned managed identities
following the <a class="" href="https://dx.pagopa.it/docs/azure/iam/azure-iam">latest DevEx framework</a></li>
<li class="">the GitHub repository settings according to the best practices found by the DX
team</li>
</ul>
<p>As the <code>Azure GitHub Environment Bootstrap</code> module is designed to support teams
in new project development, it is particularly indicated for mono repositories
which traditionally require more time to be properly prepared: in just a few
minutes, the repository will be ready to be used.</p>
<p>On the other hand, the new module may be a bit overwhelming for small
repositories, where you may have only one application. For this reason, the
module
<a href="https://github.com/pagopa/dx/blob/main/infra/modules/azure_federated_identity_with_github" target="_blank" rel="noopener noreferrer" class=""><code>azure_federated_identity_with_github</code></a>
is still maintained and available, and is suggested for those cases. However,
please note that this design is not advisable, and instead, the use of mono
repositories is recommended.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="getting-started">Getting Started<a href="https://dx.pagopa.it/blog/devex-azure-bootstrap-0.1-alpha#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>We recommend to reference the module via the Terraform Registry, and pin the
version to the latest stable release:</p>
<div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "repo" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure-github-environment-bootstrap/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt;1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Despite the <code>Azure GitHub Environment Bootstrap</code> module requiring a lot of
inputs, its usage remains easy. In fact, a lot of values are the same for
different projects under the same product's umbrella, and moreover are
well-known by our user base. The following data is requested:</p>
<ul>
<li class="">the Azure subscription and tenant IDs</li>
<li class="">the IDs of team-specific Entra ID groups as expected by
<a class="" href="https://dx.pagopa.it/docs/azure/iam/azure-iam">DevEx IAM framework</a></li>
<li class="">the ID of an existing Azure Container App Environment</li>
<li class="">the details of the Storage Account holding the Terraform state file</li>
<li class="">the details of the current repository (name, description, topics, optionally
reviewers, etc.)</li>
<li class="">the IDs of the product-shared cloud resources, if any (API Management, Private
Endpoints, VNet, etc.)</li>
</ul>
<p>More details about the usage can be found in the documentation, which is
available in the
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-github-environment-bootstrap/azurerm/latest" target="_blank" rel="noopener noreferrer" class="">module entry in the Terraform Registry</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="examples">Examples<a href="https://dx.pagopa.it/blog/devex-azure-bootstrap-0.1-alpha#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no">​</a></h3>
<p>Explore these repositories, which have successfully adopted the
<code>Azure GitHub Environment Bootstrap</code> module from its early stages:</p>
<ul>
<li class=""><a href="https://github.com/pagopa/io-messages/tree/main/infra/repository" target="_blank" rel="noopener noreferrer" class="">IO Messages</a></li>
<li class=""><a href="https://github.com/pagopa/io-wallet/tree/main/infra/repository" target="_blank" rel="noopener noreferrer" class="">IO Wallet</a></li>
<li class=""><a href="https://github.com/pagopa/io-services-cms/tree/main/infra/repository" target="_blank" rel="noopener noreferrer" class="">IO Services CMS</a></li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing the 'Azure Service Bus Namespace' Terraform Module and Usage Patterns to Facilitate Service Bus Setup]]></title>
            <link>https://dx.pagopa.it/blog/devex-azure-servicebus-0.1-alpha</link>
            <guid>https://dx.pagopa.it/blog/devex-azure-servicebus-0.1-alpha</guid>
            <pubDate>Fri, 28 Mar 2025 17:00:00 GMT</pubDate>
            <description><![CDATA[Boosting Service Bus setup]]></description>
            <content:encoded><![CDATA[<p>The new Terraform module
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-service-bus-namespace/azurerm/latest" target="_blank" rel="noopener noreferrer" class=""><code>Azure Service Bus Namespace</code></a>
has been released by the DevEx team to enable customers to easily and
straightforwardly set up Service Bus!</p>
<p>This module abstracts inner complexities such as networking, authentication, and
scaling. By choosing the <code>l</code> tier (which matches the <code>Premium</code> SKU), the module
provides private communication via private endpoints and also includes an
autoscaler resource to dynamically change the number of instances depending on
CPU and memory metrics.</p>
<p>The module also supports the <code>m</code> tier (<code>Standard</code> SKU), but it is recommended to
use this tier only in test environments as the resource cannot be isolated in
terms of networking and remains on the public internet.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="getting-started">Getting Started<a href="https://dx.pagopa.it/blog/devex-azure-servicebus-0.1-alpha#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>We recommend referencing the module via the Terraform Registry and pinning the
version to the latest stable release:</p>
<div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "sbns" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure-service-bus-namespace/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt;0.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Roles can be managed through the traditional
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-role-assignments/azurerm/latest" target="_blank" rel="noopener noreferrer" class="">role assignment module</a>,
which you should already be familiar with. By passing names of queues, topics,
and subscriptions, the IAM complexity is taken away.</p>
<div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "roles" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure-role-assignments/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt;1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">principal_id</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> &lt;principal_id&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_subscription.current.subscription_id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">service_bus</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">namespace_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> &lt;value&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> &lt;value&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">role</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reader|writer|owner"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">description</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> &lt;value&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">queue_names</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (optional) </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">&lt;list of queues&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">topic_names</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (optional) </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">&lt;list of topics&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">subscriptions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        (optional) &lt;list of key-value pairs for subscriptions, e.g. </span><span class="token property">topic</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">&lt;list of subscriptions&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Additionally, the
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-github-environment-bootstrap/azurerm/latest" target="_blank" rel="noopener noreferrer" class="">Azure Bootstrap module</a>
has been updated to add the needed roles to apply Terraform code to a
centralized Service Bus instance, if you have one.</p>
<p>More details can be found in the documentation, which is available in the
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-service-bus-namespace/azurerm/latest" target="_blank" rel="noopener noreferrer" class="">module entry in the Terraform Registry</a>.</p>
<p>Moreover, if you want to learn more about best practices and patterns, check out
<a href="https://dx.pagopa.it/docs/infrastructure/azure/using-service-bus" target="_blank" rel="noopener noreferrer" class="">DX guidelines</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="examples">Examples<a href="https://dx.pagopa.it/blog/devex-azure-servicebus-0.1-alpha#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no">​</a></h3>
<p>Explore
<a href="https://github.com/pagopa-dx/terraform-azurerm-azure-service-bus-namespace/tree/main/examples/complete" target="_blank" rel="noopener noreferrer" class="">module examples</a>
to create the Service Bus namespace.
<a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_role_assignments/examples/service_bus" target="_blank" rel="noopener noreferrer" class="">Other examples</a>
are also available to show queue, topic, and subscription definitions.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing the Azure Service Bus Alerts Terraform Module]]></title>
            <link>https://dx.pagopa.it/blog/devex-azure-servicebus-alerts-0.1-alpha</link>
            <guid>https://dx.pagopa.it/blog/devex-azure-servicebus-alerts-0.1-alpha</guid>
            <pubDate>Fri, 28 Mar 2025 17:00:00 GMT</pubDate>
            <description><![CDATA[Boosting Service Bus setup]]></description>
            <content:encoded><![CDATA[<p>The new Terraform module
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-service-bus-dlq-alert/azurerm/latest" target="_blank" rel="noopener noreferrer" class=""><code>Azure Service Bus Alerts</code></a>
has been released to help teams monitor their Azure Service Bus instances with
minimal setup and improved observability.</p>
<p>This module allows teams to configure alerts for both <strong>active</strong> and
<strong>dead-lettered messages</strong> across queues and topics, providing flexibility
through customizable thresholds, severities, and metric windows.</p>
<p>It is designed to integrate easily with your existing Service Bus namespaces and
can be customized through simple input variables. Multiple entities can be
monitored at once, and alert actions can be routed to one or more Azure Monitor
Action Groups.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="getting-started">Getting Started<a href="https://dx.pagopa.it/blog/devex-azure-servicebus-alerts-0.1-alpha#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>We recommend referencing the module via the Terraform Registry and pinning the
version to the latest stable release:</p>
<div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "alerts" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pagopa-dx/azure-service-bus-dlq-alert/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 0.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">prefix</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">env_short</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"d"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">location</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"westeurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">app_name</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"myapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">instance_number</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">service_bus_namespace_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_servicebus_namespace.example.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">alerts_on_dlq_messages</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">description</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DLQ messages alert"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">entity_names</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"queue1"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"topic1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">threshold</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">severity</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Error"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">check_every</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">lookback_period</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT10M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">alerts_on_active_messages</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">description</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Active messages alert"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">entity_names</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"queue1"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"topic1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">threshold</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">20</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">severity</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Warning"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">check_every</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT15M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">lookback_period</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT30M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">action_group_ids</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">azurerm_monitor_action_group.example.id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="examples">Examples<a href="https://dx.pagopa.it/blog/devex-azure-servicebus-alerts-0.1-alpha#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no">​</a></h3>
<p>Explore a
<a href="https://github.com/pagopa-dx/terraform-azurerm-azure-service-bus-dlq-alert/tree/main/example/simple" target="_blank" rel="noopener noreferrer" class="">simple example</a>
to get started quickly.</p>
<p>More information about metrics and setup can be found in the
<a href="https://registry.terraform.io/modules/pagopa-dx/azure-service-bus-dlq-alert/azurerm/latest" target="_blank" rel="noopener noreferrer" class="">module documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Benchmark for Typescript Code Generators from OpenAPI]]></title>
            <link>https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha</link>
            <guid>https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha</guid>
            <pubDate>Tue, 24 Sep 2024 17:00:00 GMT</pubDate>
            <description><![CDATA[Generating TypeScript Code from OpenAPI Specification]]></description>
            <content:encoded><![CDATA[<p>The digital services we provide interact through REST APIs that are documented
using OpenAPI specifications.</p>
<p>Using API clients requires the code that handles HTTP requests and responses to
strictly adhere to the OpenAPI specifications. This is crucial to ensure that
the exchanged data is valid and consistent with the defined schemas. Similarly,
when providing APIs through NodeJS services, such as Express or similar
frameworks, it is important to follow the same standards. This ensures that the
APIs are reliable, scalable, and easy to maintain.</p>
<p>The purpose of this document is to evaluate and compare various TypeScript
OpenAPI generators for both frontend and backend development. The evaluation
will focus on critical features and help determine whether to invest in a custom
tool (make) or adopt an existing tool.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="guiding-principles">Guiding Principles<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#guiding-principles" class="hash-link" aria-label="Direct link to Guiding Principles" title="Direct link to Guiding Principles" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="main-requirements">Main Requirements<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#main-requirements" class="hash-link" aria-label="Direct link to Main Requirements" title="Direct link to Main Requirements" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Runtime Payload Control</strong> The generators must provide runtime controls on
the payloads to ensure data integrity and adherence to defined schemas. We
believe runtime control is necessary to guarantee that the Typescript type
matches the actual structure of the payload. Without this, there's a higher
chance of runtime errors due to discrepancies in the data format.</p>
</li>
<li class="">
<p><strong>Generation of Isomorphic Types</strong> The ability to generate types usable both
on the client and server sides (e.g., in Express route handlers).</p>
</li>
<li class="">
<p><strong>Support for String Patterns (Regex)</strong> Generators must support string
patterns using regular expressions to enforce constraints on string values.</p>
</li>
<li class="">
<p><strong>Support for JSON Schema Constraints</strong> For example, the handling of
constraints such as minimum, maximum, exclusiveMinimum, and exclusiveMaximum
is essential for validating numeric data.</p>
</li>
<li class="">
<p><strong>Community and Maintainability</strong> A strong community and/or easily
maintainable codebase are crucial for the long-term viability and support of
the generator.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="additional-features-nice-to-have">Additional Features (Nice to Have)<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#additional-features-nice-to-have" class="hash-link" aria-label="Direct link to Additional Features (Nice to Have)" title="Direct link to Additional Features (Nice to Have)" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Support for Security Headers</strong> Generators should support security headers
to enhance API security.</p>
</li>
<li class="">
<p><strong>Support for File Uploads</strong> The ability to handle file uploads seamlessly
within the API.</p>
</li>
<li class="">
<p><strong>Support for File Downloads (Octet Stream)</strong> There must be support for file
downloads, specifically as an octet stream.</p>
</li>
<li class="">
<p><strong>Minimal Footprint</strong> Generators should aim for minimal footprint, e.g.,
generating one type per file with tree-shaking capabilities to optimize
performance.</p>
</li>
<li class="">
<p><strong>Developer Experience</strong> High performance during code generation is
important. The generator should be fast and not slow down the IDE, even
during type inference.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="comparison">Comparison<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#comparison" class="hash-link" aria-label="Direct link to Comparison" title="Direct link to Comparison" translate="no">​</a></h2>
<ul>
<li class=""><strong>typed-openapi</strong>: Converts to Typescript before converting to runtime types
(typebox-codegen → zod), losing information on constraints.</li>
<li class=""><strong>openapi-generator</strong>: Runtime checks are limited to verifying if the value is
defined.</li>
<li class=""><strong>swagger-codegen</strong>: An older version of openapi-generator.</li>
<li class=""><strong>autorest</strong>: Seems promising on paper, but couldn't get it to start (freezes
on startup).</li>
<li class=""><strong>openapi-io-ts</strong>: Inexistent community, doesn't work with our specs, not
maintained.</li>
<li class=""><strong>orval</strong>: Primarily targets React; generates code that works on our specs.</li>
</ul>
<table><thead><tr><th>Generator</th><th>Server Types</th><th>Community</th><th>Supports Regex (Pattern String)</th><th>Supports Min/Max (Number)</th><th>Supports HTTP Headers</th></tr></thead><tbody><tr><td>typed-openapi</td><td>Yes</td><td>Yes</td><td>No</td><td>No</td><td>Yes</td></tr><tr><td>openapi-generator</td><td>Yes</td><td>Yes</td><td>No</td><td>No</td><td>Yes</td></tr><tr><td>swagger-codegen</td><td>Yes</td><td>Yes</td><td>No</td><td>No</td><td>Yes</td></tr><tr><td>autorest</td><td>???</td><td>Yes</td><td>???</td><td>???</td><td>???</td></tr><tr><td>openapi-io-ts</td><td>???</td><td>No</td><td>???</td><td>???</td><td>???</td></tr><tr><td>orval</td><td>No</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="exclusion-criteria">Exclusion Criteria<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#exclusion-criteria" class="hash-link" aria-label="Direct link to Exclusion Criteria" title="Direct link to Exclusion Criteria" translate="no">​</a></h2>
<p>Some tools are excluded from this benchmark due to lack of runtime controls (at
least, as of the writing of this document):</p>
<ul>
<li class="">heyapi</li>
<li class="">oazapfts</li>
<li class="">openapi-backend</li>
<li class="">openapi-typescript</li>
<li class="">swagger-typescript-api</li>
</ul>
<p>Although it is possible to translate the generated Typescript types into
structures (e.g., zod/typebox) that allow runtime controls, this kind of
conversion results in a loss of information on constraints (e.g., maximum,
minimum, maxLength, pattern, etc.).</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="generated-code-repository">Generated Code Repository<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#generated-code-repository" class="hash-link" aria-label="Direct link to Generated Code Repository" title="Direct link to Generated Code Repository" translate="no">​</a></h2>
<p>A repository is available to compare the code of different generators:
<a href="https://github.com/gunzip/openapi-generator-benchmark" target="_blank" rel="noopener noreferrer" class="">GitHub - gunzip/openapi-generator-benchmark</a></p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="issues-with-openapi-zod-client">Issues with openapi-zod-client<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#issues-with-openapi-zod-client" class="hash-link" aria-label="Direct link to Issues with openapi-zod-client" title="Direct link to Issues with openapi-zod-client" translate="no">​</a></h2>
<ol>
<li class="">Inaccurate type generation.</li>
<li class="">Poor performance in the IDE due to type inference from the single object
passed to the zodios <code>makeApi</code> method.</li>
<li class="">Dependency on <code>@zodios/core</code> for HTTP calls (via Axios), parameter
validation, and query string handling.</li>
<li class="">Does not support multiple successful values (2xx codes).</li>
<li class="">Both the client and types are contained in a single file, making it hard to
optimize the bundle (important for frontend clients).</li>
<li class="">The maintainer of zodios has been inactive for a while.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="example-of-inaccurate-type-generation">Example of Inaccurate Type Generation<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#example-of-inaccurate-type-generation" class="hash-link" aria-label="Direct link to Example of Inaccurate Type Generation" title="Direct link to Example of Inaccurate Type Generation" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-typescript codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> MessageSubject </span><span class="token operator">=</span><span class="token plain"> z</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> MessageBodyMarkdown </span><span class="token operator">=</span><span class="token plain"> z</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> MessageContent </span><span class="token operator">=</span><span class="token plain"> z</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    subject</span><span class="token operator">:</span><span class="token plain"> MessageSubject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">min</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">max</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    markdown</span><span class="token operator">:</span><span class="token plain"> MessageBodyMarkdown</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">min</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">80</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">max</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">passthrough</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Generated from the foloowing OpenAPI schema:</p>
<div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">MessageSubject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">minLength</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">maxLength</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">120</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">MessageBodyMarkdown</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">minLength</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">maxLength</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">10000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">MessageContent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> object</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">MessageContent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">subject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">$ref</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#/components/schemas/MessageSubject"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">markdown</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">$ref</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#/components/schemas/MessageBodyMarkdown"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> markdown</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="issues-with-swagger-typescript-api--ts-to-zod">Issues with swagger-typescript-api + ts-to-zod<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#issues-with-swagger-typescript-api--ts-to-zod" class="hash-link" aria-label="Direct link to Issues with swagger-typescript-api + ts-to-zod" title="Direct link to Issues with swagger-typescript-api + ts-to-zod" translate="no">​</a></h2>
<p>Unlike other Typescript type generators, <code>swagger-typescript-api</code> retains
information on constraints (minimum, maximum, maxLength, pattern, etc.) in JSDoc
comments associated with type definitions. This allows for the reconstruction of
runtime schemas, for example, using tools like <code>ts-to-zod</code>. However:</p>
<ol>
<li class="">The generated runtime schemas are separate from the client code, so the
“plumbing” to connect the runtime validation (ts-to-zod) to the generated
types (<code>swagger-typescript-api</code>) must be implemented manually.</li>
<li class="">Types are not always accurate due to discrepancies between the annotations
generated by swagger-typescript-api and those expected by ts-to-zod (e.g.,
<code>@min</code> vs <code>@minimum</code>).</li>
<li class="">Some inaccuracies in type generation produce invalid Typescript code.</li>
</ol>
<p>Nevertheless, the zod schemas are more faithful than those generated by
openapi-zod-client.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="example-of-accurate-type-generation">Example of Accurate Type Generation<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#example-of-accurate-type-generation" class="hash-link" aria-label="Direct link to Example of Accurate Type Generation" title="Direct link to Example of Accurate Type Generation" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-typescript codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> messageSubjectSchema </span><span class="token operator">=</span><span class="token plain"> z</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">min</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">max</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">120</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> messageBodyMarkdownSchema </span><span class="token operator">=</span><span class="token plain"> z</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">min</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">80</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">max</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> messageContentSchema </span><span class="token operator">=</span><span class="token plain"> z</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  subject</span><span class="token operator">:</span><span class="token plain"> messageSubjectSchema</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  markdown</span><span class="token operator">:</span><span class="token plain"> messageBodyMarkdownSchema</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="conclusion">Conclusion<a href="https://dx.pagopa.it/blog/typescript-openapi-generators-0.1-alpha#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>As of Jun 2024, no OpenAPI generator fully meets our guiding principles. While
<code>openapi-zod-client</code> seems to cover most of the desired features, it still
appears to be an immature project, not always accurate in type generation.</p>
<p>It is appropriate to invest in the development of a Typescript code generator
from OpenAPI that performs correct and complete runtime checks.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DevEx Initiative: Transforming the Development Experience at PagoPA]]></title>
            <link>https://dx.pagopa.it/blog/devex-initiative-0.1-alpha</link>
            <guid>https://dx.pagopa.it/blog/devex-initiative-0.1-alpha</guid>
            <pubDate>Sun, 01 Sep 2024 10:00:00 GMT</pubDate>
            <description><![CDATA[Transforming the Development Experience at PagoPA]]></description>
            <content:encoded><![CDATA[<p>Imagine being able to release the first API for a <strong>new</strong> digital service into
production in minutes instead of weeks, having fewer decisions to make, less
code to interpret and maintain, onboarding new team members with zero downtime:
this is the goal we set for ourselves with the <strong>Developer Experience
(<a href="https://pagopa.atlassian.net/wiki/spaces/ENG/pages/861732865/DevEx+Lab+-+Initiative+canvas" target="_blank" rel="noopener noreferrer" class="">DevEx</a>)</strong>
initiative.</p>
<p>At the heart of the Engineering Area, a group of Senior, Cloud, and Staff
Engineers has decided to tackle the daily challenges that slow down our work.
We're here to break down barriers, simplify processes, and make software
development smoother and more rewarding for everyone.</p>
<div class="container"><div class="row"><div class="col col--6"><div class="col-demo"><p><img decoding="async" loading="lazy" alt="Complex development process without DevEx tools showing multiple
manual steps and scattered documentation" src="https://dx.pagopa.it/assets/images/image-3-8e18730fd132cfd04045e27395e071b0.png" width="1024" height="1024" class="img_Xwu8"></p></div></div><div class="col col--6"><div class="col-demo"><p><img decoding="async" loading="lazy" alt="Streamlined development process with DevEx tools showing automated
workflows and centralized resources" src="https://dx.pagopa.it/assets/images/image-2-94dfc520cbae20ec4e74f520c0666751.png" width="1024" height="1024" class="img_Xwu8"></p></div></div></div></div>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="why-devex">Why DevEx<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#why-devex" class="hash-link" aria-label="Direct link to Why DevEx" title="Direct link to Why DevEx" translate="no">​</a></h2>
<p>How much time is lost before even writing a line of code? How many decisions
need to be made? And how long does it take for a new engineer to become truly
productive?</p>
<p>With DevEx, we want to answer these questions and solve the problems that hinder
our daily work:</p>
<ul>
<li class=""><strong>Reduce downtime:</strong> Every second spent configuring an environment or
interpreting old code is a second lost to innovation.</li>
<li class=""><strong>Lower cognitive load</strong>: Less complexity means more room to create value,
reducing errors, and speeding up time-to-market</li>
<li class=""><strong>Speed up onboarding:</strong> Every new developer should be able to contribute from
day one.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="what-we-do">What We Do<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#what-we-do" class="hash-link" aria-label="Direct link to What We Do" title="Direct link to What We Do" translate="no">​</a></h2>
<p>As <a href="https://github.com/orgs/pagopa/teams/engineering-team-devex" target="_blank" rel="noopener noreferrer" class="">DevEx team</a> we
doesn't just identify problems and suggest solutions: we tackle them head-on,
getting our hands dirty.</p>
<ul>
<li class=""><strong>Common patterns and golden paths:</strong> We provide <em>golden paths</em> so you don't
have to reinvent the wheel every time.</li>
<li class=""><strong>Ready-to-use abstractions and tools:</strong> We reduce boilerplate code so you can
focus on the code that matters.</li>
<li class=""><strong>Optimized development environments:</strong> We share pre-configured and ready to
use <em>templates</em> because infrastructure should never be an obstacle but a
resource.</li>
<li class=""><strong>Centralized documentation:</strong> You'll no longer have to search for an answer;
it will always be at your fingertips.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="how-were-organized">How We're Organized<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#how-were-organized" class="hash-link" aria-label="Direct link to How We're Organized" title="Direct link to How We're Organized" translate="no">​</a></h2>
<p>Currently, the DevEx initiative is driven by engineers working asynchronously,
contributing alongside their primary responsibilities within their main
projects. It may not always be this way, but for now, it seems to be working!</p>
<p>Every two weeks, we hold a review &amp; demo session on Google Meet. This is a key
moment to review our goals
(<a href="https://pagopa.atlassian.net/wiki/spaces/DevEx/pages/962757129/OKR" target="_blank" rel="noopener noreferrer" class="">OKRs</a>) and
share our progress. Each member autonomously selects a task from the
<a href="https://pagopa.atlassian.net/jira/software/c/projects/DEVEX/boards/501/backlog" target="_blank" rel="noopener noreferrer" class="">Jira DevEx Board</a>
and carries it forward, collaborating with the rest of the team through Code
Reviews and RFCs.</p>
<p>Staff Engineers, in particular, are expected to independently select priority
tasks beyond the scope of the project (domain) they are already engaged in. This
approach requires <strong>collaboration from Product Managers</strong> to ensure that
activities are aligned with strategic business objectives.</p>
<p>Innovation doesn't stop at theory: we bring solutions directly into projects,
<strong>proactively supporting stream-aligned teams</strong>, and promoting the adoption of
DX tools.</p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="where-we-stand">Where We Stand<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#where-we-stand" class="hash-link" aria-label="Direct link to Where We Stand" title="Direct link to Where We Stand" translate="no">​</a></h2>
<p>We started with an idea and a
<a href="https://www.figma.com/board/7rmB4tXRQlzfStPuJh4vU2/Kick-Off?node-id=0-1&amp;t=UZeTC0BhIFl9678h-0" target="_blank" rel="noopener noreferrer" class="">brainstorming session</a>,
then we got to work.</p>
<p>Between April and July 2024, we have...</p>
<ul>
<li class="">
<p>Identified
<a href="https://github.com/pagopa/dx/blob/main/decisions/0006-we-start-with-typescript-and-azure.md" target="_blank" rel="noopener noreferrer" class="">shared technologies and patterns</a>
to focus our initial efforts on, currently: Typescript, Terraform, Azure, and
GitHub Actions.</p>
</li>
<li class="">
<p>Established some new practices such as:</p>
<ul>
<li class=""><a href="https://dx.pagopa.it/docs/conventions/azure-naming-convention" target="_blank" rel="noopener noreferrer" class="">naming conventions</a>
for Azure resources</li>
<li class="">structure for
<a href="https://dx.pagopa.it/docs/conventions/npm-scripts" target="_blank" rel="noopener noreferrer" class="">npm tasks for Typescript projects</a></li>
<li class=""><a href="https://dx.pagopa.it/docs/conventions/infra-folder-structure" target="_blank" rel="noopener noreferrer" class="">HCL code structure for Terraform modules</a></li>
</ul>
</li>
<li class="">
<p>Implemented new Terraform modules for:</p>
<ul>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/infra/modules/github_selfhosted_runner_on_container_app_jobs" target="_blank" rel="noopener noreferrer" class="">creating a GitHub Actions runner</a></li>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_federated_identity_with_github" target="_blank" rel="noopener noreferrer" class="">setting up GitHub repository identity on Azure</a></li>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_role_assignments" target="_blank" rel="noopener noreferrer" class="">easily creating roles and permissions for Azure services</a></li>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_function_app" target="_blank" rel="noopener noreferrer" class="">creating an Azure Functions App</a></li>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_app_service" target="_blank" rel="noopener noreferrer" class="">creating an Azure App Service</a></li>
<li class=""><a href="https://github.com/pagopa/dx/tree/main/infra/modules/azure_app_service_plan_autoscaler" target="_blank" rel="noopener noreferrer" class="">setting up autoscaling for an App Service or Function App</a></li>
</ul>
</li>
<li class="">
<p>Developed GitHub Actions for:</p>
<ul>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/js_code_review.yaml" target="_blank" rel="noopener noreferrer" class="">conducting code reviews on Typescript codebases</a></li>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/validate-docker-image-v1.yaml" target="_blank" rel="noopener noreferrer" class="">building Docker images</a></li>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/infra_apply.yaml" target="_blank" rel="noopener noreferrer" class="">deploying Azure services via Terraform</a></li>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/infra_plan.yaml" target="_blank" rel="noopener noreferrer" class="">planning infrastructure changes</a></li>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/infra_drift_detection.yml" target="_blank" rel="noopener noreferrer" class="">notifying of drifts between IaC code and infrastructure</a></li>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/web_app_deploy.yaml" target="_blank" rel="noopener noreferrer" class="">deploying to production Azure Function or App Service</a></li>
<li class=""><a href="https://github.com/pagopa/dx/blob/main/.github/workflows/static_analysis.yaml" target="_blank" rel="noopener noreferrer" class="">linting Terraform code</a></li>
</ul>
</li>
<li class="">
<p>Set up
<a href="https://github.com/pagopa/dx-typescript" target="_blank" rel="noopener noreferrer" class="">basic configurations for Typescript tooling</a>:
eslint, yarn, turbo, changeset.</p>
</li>
<li class="">
<p>Shared the
<a href="https://dx.pagopa.it/docs/articles/benchmark-openapi-gen" target="_blank" rel="noopener noreferrer" class="">results of a benchmark on tools for generating clients from OpenAPI specifications</a></p>
</li>
<li class="">
<p>Analyzed the state of the art for
<a href="https://dx.pagopa.it/docs/articles/azure-tracing" target="_blank" rel="noopener noreferrer" class="">distributed monitoring and log correlation on Azure</a></p>
</li>
</ul>
<p>While it may seem like a lot of material, we recognize that without proper
documentation and effective communication, our efforts might be overlooked.
That's why we've launched a <a href="https://dx.pagopa.it/docs/" target="_blank" rel="noopener noreferrer" class="">dedicated website</a> to
be populated with content and continuously updated as a reference for all
engineers in the organization.</p>
<p>And that's not all! We're also working to provide tools (<em>scaffolding</em>) that can
automate repetitive and redundant tasks.</p>
<div class="theme-admonition theme-admonition-info admonition_x7yd alert alert--info"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_udfK"><p>We want to reach a point where documentation becomes unnecessary!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="pilot-projects">Pilot Projects<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#pilot-projects" class="hash-link" aria-label="Direct link to Pilot Projects" title="Direct link to Pilot Projects" translate="no">​</a></h2>
<p>Although still in its early stages, much of the tooling we’ve developed has
already been successfully used in several real projects.</p>
<p>Here are some examples!</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="trial-system">Trial System<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#trial-system" class="hash-link" aria-label="Direct link to Trial System" title="Direct link to Trial System" translate="no">​</a></h3>
<p>The team that implemented the Trial System used DevEx tooling to create a
platform that allows any digital service to segment users and test new features
on a selected group (feature flags):</p>
<p><a href="https://github.com/pagopa/trial-system" target="_blank" rel="noopener noreferrer" class="">https://github.com/pagopa/trial-system</a></p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="io-fims">IO FIMS<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#io-fims" class="hash-link" aria-label="Direct link to IO FIMS" title="Direct link to IO FIMS" translate="no">​</a></h3>
<p>IO FIMS is a project that manages Single Sign-On for IO users. The team used
DevEx tooling to create a new service:</p>
<p><a href="https://github.com/pagopa/io-fims" target="_blank" rel="noopener noreferrer" class="">https://github.com/pagopa/io-fims</a></p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="io-communication">IO communication<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#io-communication" class="hash-link" aria-label="Direct link to IO communication" title="Direct link to IO communication" translate="no">​</a></h3>
<p>The team that implemented the messaging service for IO used DevEx tooling to
create a new Typescript monorepo and manage the deployment of Azure Functions:</p>
<p><a href="https://github.com/pagopa/io-messages" target="_blank" rel="noopener noreferrer" class="">https://github.com/pagopa/io-messages</a></p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="io-authentication">IO authentication<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#io-authentication" class="hash-link" aria-label="Direct link to IO authentication" title="Direct link to IO authentication" translate="no">​</a></h3>
<p>The team that implemented the user authentication service for IO used DevEx
tooling to create a new Typescript monorepo and manage the deployment of Azure
Functions:</p>
<p><a href="https://github.com/pagopa/io-auth-n-identity-domain" target="_blank" rel="noopener noreferrer" class="">https://github.com/pagopa/io-auth-n-identity-domain</a></p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="io-services">IO services<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#io-services" class="hash-link" aria-label="Direct link to IO services" title="Direct link to IO services" translate="no">​</a></h3>
<p>The team that implemented the backoffice for organizations in IO used DevEx
tooling to manage the deployment of infrastructure and Azure Functions:</p>
<p><a href="https://github.com/search?q=repo%3Apagopa%2Fio-services-cms+pagopa%2Fdx&amp;type=code" target="_blank" rel="noopener noreferrer" class="">https://github.com/search?q=repo%3Apagopa%2Fio-services-cms+pagopa%2Fdx&amp;type=code</a></p>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="current-benefits-of-devex">Current Benefits of DevEx<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#current-benefits-of-devex" class="hash-link" aria-label="Direct link to Current Benefits of DevEx" title="Direct link to Current Benefits of DevEx" translate="no">​</a></h2>
<p>Let's share some brief code snippets to show how DevEx tooling can make
engineers' work easier and faster.</p>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="setting-up-github-repository-permissions-on-azure">Setting Up GitHub Repository Permissions on Azure<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#setting-up-github-repository-permissions-on-azure" class="hash-link" aria-label="Direct link to Setting Up GitHub Repository Permissions on Azure" title="Direct link to Setting Up GitHub Repository Permissions on Azure" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">With DX</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Without DX</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> io-messages/infra/identity</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">find</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-type</span><span class="token plain"> f</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./prod/outputs.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./prod/locals.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./prod/main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./prod/README.md</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./prod/.terraform.lock.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">find</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-type</span><span class="token plain"> f </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">xargs</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-l</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">awk</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{print $1}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token number">160</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># LoC</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-bash codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-bash codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> io-services-cms/.identity</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">find</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-type</span><span class="token plain"> f</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./github_repository.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./99_locals.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./03_github_environment_ci.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./01_data.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./env/prod/backend.ini</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./env/prod/terraform.tfvars</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./env/prod/backend.tfvars</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./99_variables.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./04_github_identity.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./terraform.sh</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./03_github_environment_infra.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./99_outputs.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./03_github_repo_secrets.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./.terraform.lock.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./03_github_environment_cd.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./03_github_environment_opex.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">find</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-type</span><span class="token plain"> f </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">xargs</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-l</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">awk</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{print $1}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token number">731</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># LoC</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="setting-up-autoscaling-for-an-app-service-or-function-app">Setting Up Autoscaling for an App Service or Function App<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#setting-up-autoscaling-for-an-app-service-or-function-app" class="hash-link" aria-label="Direct link to Setting Up Autoscaling for an App Service or Function App" title="Direct link to Setting Up Autoscaling for an App Service or Function App" translate="no">​</a></h3>
<!-- -->
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">With DX</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Without DX</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "function_app_user_autoscaler" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/pagopa/dx//infra/modules/azure_app_service_plan_autoscaler?ref=main"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">target_service</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">function_app_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.function_app_user.function_app.function_app.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">scheduler</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">maximum</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">normal_load</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">minimum</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">scale_metrics</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">cpu</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">upper_threshold</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">50</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">increase_by</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_monitor_autoscale_setting"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"cms_fn"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">prefix</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">env_short</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">location_short</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">domain</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-cms-func-as-01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">target_resource_id</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.plan.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">profile</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">capacity</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.cms.autoscale_settings.default</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">minimum</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.cms.autoscale_settings.min</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">maximum</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.cms.autoscale_settings.max</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">metric_trigger</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Requests"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_resource_id</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.function_app.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"microsoft.web/sites"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_grain</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">statistic</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_window</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_aggregation</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GreaterThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">threshold</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">3000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">divide_by_instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">scale_action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">direction</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Increase"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ChangeCount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">cooldown</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">metric_trigger</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CpuPercentage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_resource_id</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.plan.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"microsoft.web/serverfarms"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_grain</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">statistic</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_window</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_aggregation</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GreaterThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">threshold</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">60</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">divide_by_instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">scale_action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">direction</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Increase"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ChangeCount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">cooldown</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">metric_trigger</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"MemoryPercentage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_resource_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.plan.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"microsoft.web/serverfarms"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_grain</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">statistic</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_window</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_aggregation</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GreaterThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">threshold</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">scale_action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">direction</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Increase"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ChangeCount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">cooldown</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">metric_trigger</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Requests"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_resource_id</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.function_app.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"microsoft.web/sites"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_grain</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">statistic</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_window</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT7M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_aggregation</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LessThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">threshold</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">divide_by_instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">scale_action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">direction</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Decrease"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ChangeCount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">cooldown</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">metric_trigger</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CpuPercentage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_resource_id</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.plan.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"microsoft.web/serverfarms"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_grain</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">statistic</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_window</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT7M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_aggregation</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LessThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        threshold                </span><span class="token number">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        divide_by </span><span class="token property">instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">scale_action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">direction</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Decrease"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ChangeCount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">cooldown</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">metric_trigger</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"MemoryPercentage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_resource_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.cms_fn.function_app.plan.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"microsoft.web/serverfarms"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_grain</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT1M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">statistic</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_window</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT7M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">time_aggregation</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LessThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        threshold          </span><span class="token number">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">scale_action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">direction</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Decrease"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ChangeCount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">cooldown</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="deploying-an-azure-function-app">Deploying an Azure Function App<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#deploying-an-azure-function-app" class="hash-link" aria-label="Direct link to Deploying an Azure Function App" title="Direct link to Deploying an Azure Function App" translate="no">​</a></h3>
<!-- -->
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">With DX</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Without DX</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Deploy (op</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">func)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">workflow_dispatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">op_func_deploy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/dx/.github/workflows/web_app_deploy.yaml@add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">deploy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">workflow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Deploy</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">secrets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> inherit</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">workspace_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> op</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">func</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">prod</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">resource_group_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fims</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">01</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">web_app_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fims</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">op</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">func</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">01</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">use_staging_slot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">use_private_agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Azure DevOps pipeline to release a new version and deploy to production.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">HEALTHCHECK_PATH</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"api/info"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RELEASE_SEMVER"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"When packing a release, define the version bump to apply"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> major</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> minor</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> patch</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> minor</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Map of production apps to deploy to, in the form</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#   {logicName}:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#     appname: {name of the resource}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#     rg: {name of the resource group}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Although it's a parameter, it's not intended to be edited at runtime.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># It's here because variables only handle scalar values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PRODUCTION_APPS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> object</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">servicesfn1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">appname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">servicesfn2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">appname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> io</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Only manual activations are intended</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">trigger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> none</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">pr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> none</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># This pipeline has been implemented to be run on hosted agent</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> pools based both</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># on 'windows' and 'ubuntu' virtual machine images and using the scripts defined</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># in the package.json file. Since we are deploying on Azure functions on Windows</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># runtime, the pipeline is currently configured to use a Windows hosted image for</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># the build and deploy.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">pool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">vmImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ubuntu-latest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">repositories</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">repository</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopaCommons</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pipeline</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">templates</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">ref</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> refs/tags/v18</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">endpoint</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"io-azure-devops-github-ro"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">stages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a release</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Activated when ONE OF these are met:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># - is on branch master</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># - is a tag in the form v{version}-RELEASE</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Release</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">condition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      and( succeeded()</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> or( eq(variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'Build.SourceBranch'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      'refs/heads/master')</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> and( startsWith(variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'Build.SourceBranch'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      'refs/tags')</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> endsWith(variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'Build.SourceBranch'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">RELEASE') ) ) )</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">pool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">vmImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ubuntu-latest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> make_release</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> if eq(variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'Build.SourceBranch'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> 'refs/heads/master') </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> templates/node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">setup/template.yaml@pagopaCommons</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">persistCredentials</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> templates/node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">github</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">release/template.yaml@pagopaCommons</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">semver</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ parameters.RELEASE_SEMVER }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">gitEmail</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $(GIT_EMAIL)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">gitUsername</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $(GIT_USERNAME)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">gitHubConnection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $(GITHUB_CONNECTION)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> if ne(variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'Build.SourceBranch'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> 'refs/heads/master') </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  echo "We assume this reference to be a valid release: $(Build.SourceBranch). Therefore, there is no need to bundle a new release."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Skip release bundle"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Prepare Artifact</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Prepare_artifact</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">dependsOn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Release</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prepare_artifact"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token comment" style="color:rgb(98, 114, 164)"># Build application</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> templates/node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">setup/template.yaml@pagopaCommons</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token comment" style="color:rgb(98, 114, 164)"># On the assumption that this stage is executed only when Release stage is,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token comment" style="color:rgb(98, 114, 164)">#  with this parameter we set the reference the deploy script must pull changes from.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token comment" style="color:rgb(98, 114, 164)"># The branch/tag name is calculated from the source branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token comment" style="color:rgb(98, 114, 164)">#  ex: Build.SourceBranch=refs/heads/master --&gt; master</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token comment" style="color:rgb(98, 114, 164)">#  ex: Build.SourceBranch=refs/tags/v1.2.3-RELEASE --&gt; v1.2.3-RELEASE</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">gitReference</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> replace(replace(variables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'Build.SourceBranch'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">'refs/tags/'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> '')</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'refs/heads/'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> '') </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              yarn predeploy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Build"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token comment" style="color:rgb(98, 114, 164)"># Install functions extensions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">task</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> DotNetCoreCLI@2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"build"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">arguments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-o bin"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token comment" style="color:rgb(98, 114, 164)"># Copy application to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">task</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CopyFiles@2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">SourceFolder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(System.DefaultWorkingDirectory)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">TargetFolder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(System.DefaultWorkingDirectory)/bundle"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">Contents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                **/*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !.git/**/*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !**/*.js.map</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !**/*.ts</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !.vscode/**/*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !.devops/**/*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !.prettierrc</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !.gitignore</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !README.md</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !jest.config.js</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !local.settings.json</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !tsconfig.json</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !tslint.json</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !yarn.lock</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !Dangerfile.js</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !CODEOWNERS</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                !__*/**/*</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Copy deploy files"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">publish</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $(System.DefaultWorkingDirectory)/bundle</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">artifact</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Bundle</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Deploy on staging slot</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> each app in parameters.PRODUCTION_APPS </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Deploy_$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> app.Key </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">_to_staging</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">dependsOn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Prepare_artifact</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"do_deploy_${{ app.Key }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">checkout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> none</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">download</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> current</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">artifact</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Bundle</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">task</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> AzureFunctionApp@1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">azureSubscription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(PRODUCTION_AZURE_SUBSCRIPTION)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">resourceGroupName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ app.Value.rg }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">appType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"functionApp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">appName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ app.Value.appname }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">package</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(Pipeline.Workspace)/Bundle"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">deploymentMethod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">deployToSlotOrASE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">slotName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"staging"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Deploy to staging slot</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Check that the staging instance is healthy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> each app in parameters.PRODUCTION_APPS </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Healthcheck_$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> app.Key </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">dependsOn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Deploy_$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> app.Key </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">_to_staging</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">pool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $(AGENT_POOL)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"do_healthcheck_${{ app.Key }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">checkout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> none</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  # fails if response status is not 2xx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  curl -f 'https://${{ app.Value.appname }}-staging.azurewebsites.net/$(HEALTHCHECK_PATH)'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Healthcheck"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Promote the staging instance to production</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> each app in parameters.PRODUCTION_APPS </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Swap_$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> app.Key </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">_to_production</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">dependsOn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Deploy_$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> app.Key </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">_to_staging</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token comment" style="color:rgb(98, 114, 164)"># Wait for every healthcheck to succeed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token comment" style="color:rgb(98, 114, 164)"># This implied that no app is swapped to prod if at least one healthcheck fails</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> each appInner in parameters.PRODUCTION_APPS </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Healthcheck_$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> appInner.Key </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"do_deploy_${{ app.Key }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">checkout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> none</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">task</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> AzureAppServiceManage@0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">azureSubscription</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(PRODUCTION_AZURE_SUBSCRIPTION)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">resourceGroupName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ app.Value.rg }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">webAppName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ app.Value.appname }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">sourceSlot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> staging</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  </span><span class="token key atrule">swapWithProduction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">displayName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Swap with production slot</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Publish client SDK to NPM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> PublishClientSDKtoNPM</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">dependsOn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Release</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">pool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">vmImage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ubuntu-latest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> publish_SDK</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token comment" style="color:rgb(98, 114, 164)"># Template for generating and deploying client SDK to NPM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> templates/client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">sdk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">publish/template.yaml@pagopaCommons</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">openapiSpecPath</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"openapi/index.yaml"</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="applying-terraform-changes-to-cloud-resources">Applying Terraform Changes to Cloud Resources<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#applying-terraform-changes-to-cloud-resources" class="hash-link" aria-label="Direct link to Applying Terraform Changes to Cloud Resources" title="Direct link to Applying Terraform Changes to Cloud Resources" translate="no">​</a></h3>
<!-- -->
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">With DX</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Without DX</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Release Infrastructure</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">workflow_dispatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"infra/resources/**"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform version edit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".terraform-version"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">release_prod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/dx/.github/workflows/infra_apply.yaml@3585afcf2d306da91d68cabfd0344a82e1ee10f3</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Release Infrastructure</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">secrets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> inherit</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">base_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> infra/resources</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">override_github_environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"infra-prod"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">use_private_agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-yaml codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-yaml codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Continuous Delivery on prod citizen</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">auth</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">workflow_dispatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Trigger the workflow on push on the main branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"src/domains/citizen-auth**"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".github/workflows/prod**"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">permissions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">id-token</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> write</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">contents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> read</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"src/domains/citizen-auth"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">AZURE_ENVIRONMENT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">create_runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Create Runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">22.04</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">outputs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">runner_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> steps.create_github_runner.outputs.runner_name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Create GitHub Runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> create_github_runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/github-self-hosted-runner-azure-create-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/github</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">hosted</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">create</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@b4590e069e753daee6bc9809d484523cc7026035</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">container_app_environment_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CONTAINER_APP_ENVIRONMENT_NAME </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">resource_group_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_RESOURCE_GROUP_NAME </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">pat_token</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.BOT_TOKEN </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">terraform_preapply_job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Pre Apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">hosted</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ needs.create_runner.outputs.runner_name }}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">ci</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">needs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> create_runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Checkout</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> checkout</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/actions/checkout/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@1f9a0c22da41e6ebfa534300ef656657ea2c6707</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">persist-credentials</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">fetch-depth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Setup terraform</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> setup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">version</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># https://github.com/pagopa/terraform-install-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">install</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@1f76f593176e58c423b88d72273a612ba7ba430b</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform pre apply common</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/terraform-preapply-azure-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">preapply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@70c6db53dea31f0ddc65ed43e9b7f013859be64e</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> env.DIR </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">common</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">azure_environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform pre apply weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">beta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/terraform-preapply-azure-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">preapply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@70c6db53dea31f0ddc65ed43e9b7f013859be64e</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> env.DIR </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">azure_environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">beta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform pre apply weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">prod01</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/terraform-preapply-azure-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">preapply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@70c6db53dea31f0ddc65ed43e9b7f013859be64e</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> env.DIR </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">azure_environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">prod01</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">terraform_apply_job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">hosted</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${{ needs.create_runner.outputs.runner_name }}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">cd</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">needs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">create_runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> terraform_preapply_job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform apply common</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/terraform-apply-azure-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">apply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@845c8b98c03f6c364e11b755935b4d29a1a46e0d</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> env.DIR </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">common</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform apply weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">beta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/terraform-apply-azure-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">apply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@845c8b98c03f6c364e11b755935b4d29a1a46e0d</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> env.DIR </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform apply weu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">prod01</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/terraform-apply-azure-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">apply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@845c8b98c03f6c364e11b755935b4d29a1a46e0d</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> env.DIR </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">cleanup_runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Cleanup Runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> always()</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">22.04</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">needs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">create_runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> terraform_preapply_job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> terraform_apply_job</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Cleanup GitHub Runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> cleanup_github_runner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># from https://github.com/pagopa/github-self-hosted-runner-azure-cleanup-action/commits/main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> pagopa/github</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">hosted</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">runner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">azure</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">cleanup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">action@97731a35e6ffc79b66c4dfd2aae5e4fd04e3ebb5</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription_id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">resource_group_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_RESOURCE_GROUP_NAME </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">runner_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> needs.create_runner.outputs.runner_name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">pat_token</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.BOT_TOKEN </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="creating-a-production-ready-api-management-instance">Creating a Production Ready API Management Instance<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#creating-a-production-ready-api-management-instance" class="hash-link" aria-label="Direct link to Creating a Production Ready API Management Instance" title="Direct link to Creating a Production Ready API Management Instance" translate="no">​</a></h3>
<!-- -->
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">With DX</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Without DX</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azure_apim" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"../../"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">environment</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.environment</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">use_case</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"high_load"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Change this values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">publisher_email</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example@pagopa.it"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">publisher_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Example Publisher"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">virtual_network</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.virtual_network.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.virtual_network.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subnet_id</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_subnet.example.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">virtual_network_type_internal</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "apim" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"git::https://github.com/pagopa/terraform-azurerm-v3.git//api_management?ref=v4.1.15"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subnet_id</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.apim_snet.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.rg_internal.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> format(</span><span class="token string" style="color:rgb(255, 121, 198)">"%s-apim-api"</span><span class="token plain">, local.project)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.rg_internal.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">publisher_name</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.apim_publisher_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">publisher_email</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_key_vault_secret.apim_publisher_email.value</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">notification_sender_email</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_key_vault_secret.apim_publisher_email.value</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sku_name</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.apim_sku</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">virtual_network_type</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Internal"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># not used at the moment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">redis_connection_string</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null </span><span class="token comment" style="color:rgb(98, 114, 164)"># module.redis_apim.primary_connection_string</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">redis_cache_id</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null </span><span class="token comment" style="color:rgb(98, 114, 164)"># module.redis_apim.id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># This enables the Username and Password Identity Provider</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sign_up_enabled</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">hostname_configuration</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">proxy</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># io-p-apim-api.azure-api.net</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">default_ssl_binding</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">host_name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"io-p-apim-api.azure-api.net"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">key_vault_id</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># api-internal.io.italia.it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">default_ssl_binding</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">host_name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.apim_hostname_api_internal</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">key_vault_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> replace(</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          data.azurerm_key_vault_certificate.api_internal_io_italia_it.secret_id,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token string" style="color:rgb(255, 121, 198)">"/</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">data</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">azurerm_key_vault_certificate</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">api_internal_io_italia_it</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">version</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        )</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># api-app.internal.io.pagopa.it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">default_ssl_binding</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">host_name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.apim_hostname_api_app_internal</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">key_vault_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> replace(</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          data.azurerm_key_vault_certificate.api_app_internal_io_pagopa_it.secret_id,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token string" style="color:rgb(255, 121, 198)">"/</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">data</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">azurerm_key_vault_certificate</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">api_app_internal_io_pagopa_it</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">version</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        )</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">developer_portal</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">management</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">portal</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">application_insights_instrumentation_key</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_application_insights.application_insights.instrumentation_key</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">lock_enable</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># no lock</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">autoscale</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.apim_autoscale</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">alerts_enabled</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.apim_alerts_enabled</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">action</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">action_group_id</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_monitor_action_group.slack.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">webhook_properties</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">action_group_id</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_monitor_action_group.email.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">webhook_properties</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># metrics docs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># https://docs.microsoft.com/en-us/azure/azure-monitor/essentials/metrics-supported#microsoftapimanagementservice</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">metric_alerts</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">capacity</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">description</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Apim used capacity is too high"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">frequency</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">window_size</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">severity</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">auto_mitigate</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">criteria</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Microsoft.ApiManagement/service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Capacity"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">aggregation</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GreaterThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">threshold</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">40</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">skip_metric_validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">dimension</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">dynamic_criteria</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">duration</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">description</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Apim abnormal response time"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">frequency</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">window_size</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">severity</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">auto_mitigate</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">criteria</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">dynamic_criteria</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Microsoft.ApiManagement/service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Duration"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">aggregation</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Average"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GreaterThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">alert_sensitivity</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"High"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">evaluation_total_count</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">evaluation_failure_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">skip_metric_validation</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">ignore_data_before</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2021-01-01T00:00:00Z"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># sample data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">dimension</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">requests_failed</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">description</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Apim abnormal failed requests"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">frequency</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">window_size</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PT5M"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">severity</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">auto_mitigate</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">criteria</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">dynamic_criteria</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_namespace</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Microsoft.ApiManagement/service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">metric_name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Requests"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">aggregation</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Total"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">operator</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GreaterThan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">alert_sensitivity</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"High"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">evaluation_total_count</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">evaluation_failure_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">skip_metric_validation</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">ignore_data_before</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2021-01-01T00:00:00Z"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># sample data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">dimension</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"BackendResponseCode"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">operator</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Include"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">values</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"5xx"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_N5U8" id="assigning-permissions-to-azure-services">Assigning Permissions to Azure Services<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#assigning-permissions-to-azure-services" class="hash-link" aria-label="Direct link to Assigning Permissions to Azure Services" title="Direct link to Assigning Permissions to Azure Services" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList_PCWF"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_v0Wy tabs__item--active">With DX</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_v0Wy">Without DX</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_dE4T"><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "rp_func_roles" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"github.com/pagopa/dx//infra/modules/azure_role_assignments?ref=main"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">principal_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.relying_party_func.system_identity_principal</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">cosmos</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_cosmosdb_account.fims.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_cosmosdb_account.fims.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">role</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"writer"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">key_vault</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.key_vault.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.key_vault.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">roles</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">secrets</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reader"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_dE4T" hidden=""><div class="language-hcl codeBlockContainer_SlKv theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_ne9w"><pre tabindex="0" class="prism-code language-hcl codeBlock_aq2g thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_tCuI"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_key_vault_access_policy"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"relying_party_func_key_vault_access_policy"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">key_vault_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.key_vault.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tenant_id</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_client_config.current.tenant_id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">object_id</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.relying_party_func.system_identity_principal</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">secret_permissions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"Get"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_permissions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">certificate_permissions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_cosmosdb_sql_role_assignment"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rp_func_sql_role"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_cosmosdb_account.fims.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_cosmosdb_account.fims.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">role_definition_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">data</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">azurerm_cosmosdb_account</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">fims</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">id</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">principal_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.relying_party_func.system_identity_principal</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">scope</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_cosmosdb_account.fims.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="im-sold-how-can-i-get-involved">I'm sold! How Can I Get Involved?<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#im-sold-how-can-i-get-involved" class="hash-link" aria-label="Direct link to I'm sold! How Can I Get Involved?" title="Direct link to I'm sold! How Can I Get Involved?" translate="no">​</a></h2>
<p>If you want to adopt our tooling, contribute to the project, or simply learn
more, don't hesitate to contact us on Slack in the
<a href="https://pagopaspa.slack.com/archives/C06EK19JBMM" target="_blank" rel="noopener noreferrer" class="">#team_devex</a> channel.</p>
<p>We want to make your work simpler and more rewarding, and we want to support you
as best as we can in these early stages of the initiative.</p>
<div class="theme-admonition theme-admonition-info admonition_x7yd alert alert--info"><div class="admonitionHeading_RL3N"><span class="admonitionIcon_A9XN"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_udfK"><p>Our ultimate goal is to become unnecessary!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_N5U8" id="looking-ahead">Looking Ahead<a href="https://dx.pagopa.it/blog/devex-initiative-0.1-alpha#looking-ahead" class="hash-link" aria-label="Direct link to Looking Ahead" title="Direct link to Looking Ahead" translate="no">​</a></h2>
<p>In the medium term (by 2025), we aim to achieve the highest score on the
<a href="https://pagopa.atlassian.net/wiki/spaces/DevEx/pages/1181941934/Platform+engineering+maturity+model" target="_blank" rel="noopener noreferrer" class="">maturity score</a>
for our tooling and to have 100% adoption by stream-aligned teams. Follow our
progress and activities on our
<a href="https://pagopa.atlassian.net/jira/software/c/projects/DEVEX/boards/501/backlog" target="_blank" rel="noopener noreferrer" class="">Jira Board</a>.</p>
<p>In the long term we plan to support more languages (JAVA), frameworks, and cloud
providers (AWS), and to create a community of developers who share our vision
and values.</p>
<p>Today, we are just at the beginning. With DevEx, we are redefining how we
develop, collaborate, and innovate at PagoPA. Are you ready to join us on this
journey?</p>]]></content:encoded>
        </item>
    </channel>
</rss>