<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0"><channel><title>Pulumi Blog: Pablo Terradillos</title><link>https://www.pulumi.com/blog/author/pablo-terradillos/</link><description>Pulumi blog posts: Pablo Terradillos.</description><language>en-us</language><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><item><title>The Standalone ESC CLI Retired: Use pulumi env</title><link>https://www.pulumi.com/blog/esc-cli-retiring-use-pulumi-env/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><guid>https://www.pulumi.com/blog/esc-cli-retiring-use-pulumi-env/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/esc-cli-retiring-use-pulumi-env/index.png" /&gt;
&lt;p&gt;&lt;a href="https://www.pulumi.com/docs/esc/"&gt;Pulumi ESC&lt;/a&gt; CLI v0.26.0 is the latest standalone release. We encourage users to use the &lt;a href="https://www.pulumi.com/docs/iac/cli/"&gt;Pulumi CLI&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/pulumi/esc"&gt;ESC repository&lt;/a&gt; has been archived and the code now lives under &lt;a href="https://github.com/pulumi/pulumi"&gt;pulumi&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-are-we-making-this-change"&gt;Why are we making this change&lt;/h2&gt;
&lt;p&gt;Pulumi ESC is the best way to store and manage configuration and secrets in your Pulumi programs and while you can certainly use ESC to store secrets and configurations for your applications or to manage your AI agents&amp;rsquo; credentials, it&amp;rsquo;s still a core feature of &lt;a href="https://www.pulumi.com/docs/iac/guides/basics/pulumi-cloud-vs-oss/"&gt;Pulumi Cloud&lt;/a&gt;, and we want to make sure we deliver a consistent experience across our entire suite.&lt;/p&gt;
&lt;p&gt;In addition to consistency, ESC and the Pulumi CLI share a lot of capabilities to interface to Pulumi Cloud and we want to make it easier and simpler for our customers: it&amp;rsquo;s now easier to understand which Pulumi organization you are working with, which user is logged in, etc.&lt;/p&gt;
&lt;h3 id="playing-nicer-with-humans-and-ai-agents"&gt;Playing nicer with humans and AI agents&lt;/h3&gt;
&lt;p&gt;A single CLI means one binary to install, one login to manage, and one place to look things up. This simplicity is beneficial whether the operator is a person or an agent.&lt;/p&gt;
&lt;p&gt;AI agents love code, and they love CLIs. By unifying the Pulumi CLI and ESC we offer a single place to look up operations around your Pulumi programs. Agents can now reason better about where to store configuration and secrets, without being confused by multiple CLI options that interface against the same service.&lt;/p&gt;
&lt;h3 id="faster-improvements"&gt;Faster improvements&lt;/h3&gt;
&lt;p&gt;With a shared CLI, any improvement to account management is automatically delivered to both: Pulumi and ESC users. At the same time, both benefit from ESC improvements and new features from day 1.&lt;/p&gt;
&lt;p&gt;ESC is a core component of our platform; a separate interface no longer makes sense.&lt;/p&gt;
&lt;h3 id="the-same-code-all-along"&gt;The same code all along&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re wondering what actually changes under the hood: nothing about how the commands work. The &lt;code&gt;pulumi env&lt;/code&gt; commands were never a reimplementation — the Pulumi CLI has built them from the ESC CLI&amp;rsquo;s own code since ESC&amp;rsquo;s first release, which is why the same command surface has always been available under &lt;a href="https://www.pulumi.com/docs/iac/cli/commands/pulumi_env/"&gt;&lt;code&gt;pulumi env&lt;/code&gt;&lt;/a&gt;. What we&amp;rsquo;re retiring is a second way to ship and install that code, not the code itself.&lt;/p&gt;
&lt;h2 id="do-i-need-to-update"&gt;Do I need to update?&lt;/h2&gt;
&lt;p&gt;If you are using the ESC CLI, you should switch as soon as possible, as the standalone binary will not get the latest features. Don&amp;rsquo;t worry — the mapping is mechanical, and the &lt;a href="https://www.pulumi.com/docs/esc/guides/migrate-from-esc-cli/"&gt;migration guide&lt;/a&gt; covers it command by command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;esc env &amp;lt;command&amp;gt;&lt;/code&gt; becomes &lt;code&gt;pulumi env &amp;lt;command&amp;gt;&lt;/code&gt;. For example, &lt;code&gt;esc env ls&lt;/code&gt; becomes &lt;code&gt;pulumi env ls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;esc open&lt;/code&gt; and &lt;code&gt;esc run&lt;/code&gt; shortcuts become &lt;code&gt;pulumi env open&lt;/code&gt; and &lt;code&gt;pulumi env run&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;esc login&lt;/code&gt;, &lt;code&gt;esc logout&lt;/code&gt;, and &lt;code&gt;esc version&lt;/code&gt; become &lt;code&gt;pulumi login&lt;/code&gt;, &lt;code&gt;pulumi logout&lt;/code&gt;, and &lt;code&gt;pulumi version&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are already using the Pulumi CLI, you have nothing to worry about; this has no effect since ESC commands were already available under the &lt;code&gt;pulumi env&lt;/code&gt; sub-command.&lt;/p&gt;
&lt;p&gt;Ready to switch? &lt;a href="https://www.pulumi.com/docs/install/"&gt;Install the Pulumi CLI&lt;/a&gt; if you don&amp;rsquo;t have it yet, then run &lt;code&gt;pulumi env ls&lt;/code&gt; to see your environments. Every command is documented in the &lt;a href="https://www.pulumi.com/docs/iac/cli/commands/pulumi_env/"&gt;&lt;code&gt;pulumi env&lt;/code&gt; reference&lt;/a&gt;.&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Boris Schlosser</author><category>esc</category><category>features</category></item><item><title>Lock Down Values in Pulumi ESC with fn::final</title><link>https://www.pulumi.com/blog/esc-fn-final/</link><pubDate>Tue, 17 Mar 2026 11:00:00 -0700</pubDate><guid>https://www.pulumi.com/blog/esc-fn-final/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/esc-fn-final/index.png" /&gt;
&lt;p&gt;&lt;a href="https://www.pulumi.com/docs/esc/"&gt;Pulumi ESC (Environments, Secrets, and Configuration)&lt;/a&gt; allows you to compose environments by importing configuration and secrets from other environments, but this also means a child environment can silently override a value set by a parent. When that value is a security policy or a compliance setting, an accidental override can cause real problems. With the new &lt;a href="https://www.pulumi.com/docs/esc/environments/syntax/builtin-functions/fn-final/"&gt;fn::final&lt;/a&gt; built-in function, you can mark values as final, preventing child environments from overriding them. If a child environment tries to override a final value, ESC raises a warning and preserves the original value.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say you have a parent environment that sets the AWS region for all deployments. You can use &lt;code&gt;fn::final&lt;/code&gt; to ensure no child environment can change it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# project/parent-env&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;aws-region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fn::final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If a child environment tries to override the final value, ESC raises a &lt;code&gt;cannot override final value&lt;/code&gt; warning.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# project/child-env&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;project/parent-env&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;aws-region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;eu-west-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# raises a warning&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This evaluates to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aws-region&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;us-east-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this scenario, the ESC environment is still valid, but the final value remains unchanged.&lt;/p&gt;
&lt;h2 id="when-to-use-fnfinal"&gt;When to use fn::final&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;fn::final&lt;/code&gt; for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security-sensitive values that shouldn&amp;rsquo;t be changed&lt;/li&gt;
&lt;li&gt;Compliance or policy settings enforced by a platform team&lt;/li&gt;
&lt;li&gt;Shared base environments where certain values must remain consistent&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;fn::final&lt;/code&gt; function is available now in all Pulumi ESC environments. For more information, check out the &lt;a href="https://www.pulumi.com/docs/esc/environments/syntax/builtin-functions/fn-final/"&gt;fn::final documentation&lt;/a&gt;!&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Sean Yeh</author><category>esc</category><category>features</category></item><item><title>Schema Validation Comes to Pulumi ESC with fn::validate</title><link>https://www.pulumi.com/blog/esc-schema-validation-fn-validate/</link><pubDate>Thu, 12 Feb 2026 11:00:00 -0300</pubDate><guid>https://www.pulumi.com/blog/esc-schema-validation-fn-validate/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/esc-schema-validation-fn-validate/index.png" /&gt;
&lt;p&gt;Pulumi ESC environments can now validate configuration values against JSON Schema with the new &lt;code&gt;fn::validate&lt;/code&gt; built-in function. Invalid configurations are caught immediately when you save, preventing misconfigurations from reaching your deployments.&lt;/p&gt;
&lt;p&gt;Configuration errors are often discovered too late during deployment or, worse, in production. With &lt;code&gt;fn::validate&lt;/code&gt;, you define validation rules directly in your environment, and ESC enforces them at save time. If a value doesn&amp;rsquo;t match its schema, the environment cannot be saved until the issue is resolved.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;fn::validate&lt;/code&gt; function takes a JSON Schema and a value. If the value conforms to the schema, it passes through unchanged. If not, ESC raises a validation error.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fn::validate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type: number, minimum: 1, maximum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65535&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This validates that &lt;code&gt;port&lt;/code&gt; is a number between 1 and 65535. The evaluated result is simply &lt;code&gt;8080&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="validating-objects-with-required-fields"&gt;Validating objects with required fields&lt;/h2&gt;
&lt;p&gt;For complex configurations, you can enforce structure and required fields:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fn::validate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;number }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;host, port, name]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;db.example.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5432&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;myapp&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If any required field is missing or has the wrong type, the environment cannot be saved.&lt;/p&gt;
&lt;h2 id="reusing-schemas-across-environments"&gt;Reusing schemas across environments&lt;/h2&gt;
&lt;p&gt;Define schemas once and reference them across multiple environments. Using the &lt;a href="https://www.pulumi.com/docs/esc/environments/syntax/builtin-properties/environments/"&gt;&lt;code&gt;environments&lt;/code&gt; built-in property&lt;/a&gt; keeps the schema out of your environment&amp;rsquo;s output:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schema environment (my-project/schemas)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;database-schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;number }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;host, port]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Environment using the schema&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fn::validate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${environments.my-project.schemas.database-schema}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;prod-db.example.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5432&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This pattern ensures consistent validation rules across teams and projects.&lt;/p&gt;
&lt;h2 id="what-happens-when-validation-fails"&gt;What happens when validation fails&lt;/h2&gt;
&lt;p&gt;When a value doesn&amp;rsquo;t conform to its schema, ESC returns a clear error message:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fn::validate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This raises: &lt;code&gt;expected string, got number&lt;/code&gt;. The environment cannot be saved until you fix the value or update the schema.&lt;/p&gt;
&lt;h2 id="when-to-use-schema-validation"&gt;When to use schema validation&lt;/h2&gt;
&lt;p&gt;Enable &lt;code&gt;fn::validate&lt;/code&gt; for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Values with specific type requirements (numbers, strings, arrays)&lt;/li&gt;
&lt;li&gt;Objects that must have certain fields present&lt;/li&gt;
&lt;li&gt;Numbers that must fall within a valid range&lt;/li&gt;
&lt;li&gt;Configurations shared across multiple environments&lt;/li&gt;
&lt;li&gt;Any value where catching errors early prevents downstream issues&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;fn::validate&lt;/code&gt; function is available now in all Pulumi ESC environments. Add schema validation to your existing environments or use it when creating new ones.&lt;/p&gt;
&lt;p&gt;For more information, see the &lt;a href="https://www.pulumi.com/docs/esc/environments/syntax/builtin-functions/fn-validate/"&gt;fn::validate documentation&lt;/a&gt;.&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Claire Gaestel</author><category>esc</category><category>features</category></item><item><title>Introducing the new and improved ESC Editor</title><link>https://www.pulumi.com/blog/new-esc-editor/</link><pubDate>Thu, 15 Jan 2026 08:00:00 -0500</pubDate><guid>https://www.pulumi.com/blog/new-esc-editor/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/new-esc-editor/index.png" /&gt;
&lt;p&gt;Pulumi ESC is Pulumi Cloud’s centralized solution for managing secrets and configuration across every vault and cloud provider you use. It helps teams secure their configuration while adopting modern best practices like short-lived credentials with OIDC and automated secret rotation.&lt;/p&gt;
&lt;p&gt;Whether you’re configuring Pulumi programs, powering applications and services, or managing credentials for tools like the AWS CLI, ESC provides a single, consistent way to do it safely and at scale.&lt;/p&gt;
&lt;p&gt;Behind the scenes, ESC integrates with multiple cloud providers and secret managers, supports composable environments, and offers rich built-in functions, from simple value transformations to encoding files as Base64.&lt;/p&gt;
&lt;p&gt;With this level of power, usability matters more than ever.
That’s why today we’re introducing the new and improved Pulumi ESC Web Editor, designed to make managing secrets and configuration easier, faster, and more intuitive.&lt;/p&gt;
&lt;p&gt;Today, you can create and manage your Pulumi ESC configuration in multiple ways, such as using the CLI &lt;code&gt;set&lt;/code&gt; and &lt;code&gt;edit&lt;/code&gt; commands, or through our &lt;a href="https://www.pulumi.com/docs/esc/development/vs-code-extension/"&gt;VS Code extension&lt;/a&gt;. For many users, however, their first experience with ESC happens in the Pulumi Cloud Console.&lt;/p&gt;
&lt;p&gt;Based on feedback from users of both our YAML Document view and Table view in the Console, we&amp;rsquo;ve been working hard to create a new and improved unified editor experience that makes ESC even easier to work with. One of the most notable improvements is a brand new &lt;strong&gt;Inspect&lt;/strong&gt; tab that lets you easily edit secrets and gain deeper insights into your configuration. With this new UI, you can now freely switch between writing YAML and using rich UI elements to manipulate your environment—and the editor keeps everything in sync, with clear, in-context information about what you&amp;rsquo;re doing and what&amp;rsquo;s possible at every step.&lt;/p&gt;
&lt;p&gt;Let’s explore some of these use cases!&lt;/p&gt;
&lt;h2 id="adding-and-editing-secrets"&gt;Adding and editing secrets&lt;/h2&gt;
&lt;p&gt;Adding secrets is now as simple as selecting &lt;strong&gt;Secret&lt;/strong&gt; from the &lt;strong&gt;Add new&lt;/strong&gt; menu.
&lt;img src="menu.png" alt="&amp;ldquo;Screenshot of add new menu&amp;rdquo;"&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Inspect&lt;/strong&gt; tab lets you view and edit your secret securely, automatically encrypting it as ciphertext in your environment definition. No more worrying about accidentally exposing sensitive values!&lt;/p&gt;
&lt;p&gt;&lt;img src="secrets.png" alt="&amp;ldquo;Screenshot of secret editor&amp;rdquo;"&gt;&lt;/p&gt;
&lt;h2 id="using-providers-and-built-in-functions"&gt;Using providers and built-in functions&lt;/h2&gt;
&lt;p&gt;ESC offers a large library of &lt;a href="https://www.pulumi.com/docs/esc/integrations/"&gt;providers&lt;/a&gt; and &lt;a href="https://www.pulumi.com/docs/esc/environments/syntax/builtin-functions/"&gt;built-in functions&lt;/a&gt; to use in your environment. The new editor makes discovering and using them effortless.&lt;/p&gt;
&lt;div class="flex flex-col md:flex-row gap-4 my-4"&gt;
&lt;img src="providers.png" alt="Screenshot of adding providers" class="w-full" /&gt;
&lt;/div&gt;
&lt;div class="flex flex-col md:flex-row gap-4 my-4"&gt;
&lt;img src="functions.png" alt="Screenshot of adding functions" class="w-full" /&gt;
&lt;/div&gt;
&lt;p&gt;When you add a provider or function, the editor inserts it with example values to get you started quickly. The &lt;strong&gt;Inspect&lt;/strong&gt; tab provides instant access to documentation, so you can more easily configure the integrations.&lt;/p&gt;
&lt;p&gt;&lt;img src="provider-docs.png" alt="&amp;ldquo;Screenshot of Provider documentation&amp;rdquo;"&gt;&lt;/p&gt;
&lt;h2 id="exporting-configurations"&gt;Exporting configurations&lt;/h2&gt;
&lt;p&gt;Consuming your configuration where you need it is now easier than ever. The &lt;strong&gt;Export&lt;/strong&gt; menu in the &lt;strong&gt;Inspect&lt;/strong&gt; sidebar lets you quickly expose values as Pulumi config for your stacks, or as environment variables in your shell.&lt;/p&gt;
&lt;p&gt;&lt;img src="exports.png" alt="&amp;ldquo;Screenshot of Exporting configurations&amp;rdquo;"&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The new Pulumi ESC Editor brings together the best of both worlds: the power of the YAML editor with the ease of UI controls. Try it out today in the Pulumi Cloud Console and let us know what you think!&lt;/p&gt;</description><author>Sean Yeh</author><author>Vic Fernandez</author><author>Pablo Terradillos</author><category>esc</category><category>features</category></item><item><title>New Pulumi ESC Onboarding and OIDC Provider Experience</title><link>https://www.pulumi.com/blog/esc-new-onboarding/</link><pubDate>Fri, 17 Oct 2025 16:00:00 -0300</pubDate><guid>https://www.pulumi.com/blog/esc-new-onboarding/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/esc-new-onboarding/index.png" /&gt;
&lt;p&gt;Pulumi ESC (Environments, Secrets, and Configuration) provides centralized secrets management and configuration orchestration across your infrastructure and applications. Today, we’re excited to introduce a redesigned onboarding experience and a simpler, automated way to set up Pulumi ESC as an OpenID Connect (OIDC) provider.&lt;/p&gt;
&lt;h2 id="a-new-and-refreshed-onboarding-experience"&gt;A new and refreshed onboarding experience&lt;/h2&gt;
&lt;p&gt;Pulumi ESC helps you manage configuration for Pulumi programs, handle secret rotation, and centralize secrets stored across multiple providers.&lt;/p&gt;
&lt;p&gt;We’ve now started simplifying these workflows from the moment you create a new Environment. The redesigned onboarding experience helps you get the most out of ESC.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-new-onboarding/esc-onboarding-1.png" alt="The new Pulumi ESC onboarding experience provides a stylish look"&gt;&lt;/p&gt;
&lt;h2 id="using-pulumi-esc-as-an-oidc-provider"&gt;Using Pulumi ESC as an OIDC Provider&lt;/h2&gt;
&lt;p&gt;Among its many uses, &lt;a href="https://www.pulumi.com/docs/esc/environments/configuring-oidc/"&gt;Pulumi ESC can act as an OpenID Connect (OIDC) provider&lt;/a&gt;, issuing short-lived, signed tokens that external systems can exchange for temporary cloud credentials. This eliminates hard-coded credentials and improves your security posture.&lt;/p&gt;
&lt;p&gt;Other Pulumi offerings, such as &lt;a href="https://www.pulumi.com/product/pulumi-insights/"&gt;Pulumi Insights&lt;/a&gt;, use this mechanism to securely scan resources across your organization.&lt;/p&gt;
&lt;h2 id="a-simpler-way-to-set-up-oidc-for-your-cloud-providers"&gt;A simpler way to set up OIDC for your cloud providers&lt;/h2&gt;
&lt;p&gt;Setting up an OIDC provider manually can involve multiple steps and be error-prone. To simplify this, Pulumi ESC now offers automated setup for AWS, Azure, and Google Cloud directly from the onboarding flow.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-new-onboarding/esc-onboarding-2.png" alt="The new Onboarding experience offers a Login Provider Setup for the most popular cloud providers"&gt;&lt;/p&gt;
&lt;p&gt;For each login provider, we offer different setup options to suit your needs. You can log in with your cloud credentials and let Pulumi Cloud handle the rest, or you can create your resources from your own machine using the Pulumi CLI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-new-onboarding/esc-onboarding-3.png" alt="You can setup OIDC Providers via multiple options such as giving pulumi permissions through SSO or via executing a program on your local cli."&gt;&lt;/p&gt;
&lt;p&gt;Previously, you had to go to the AWS Console to create an identity provider, create and configure an IAM Role, and set up the trust policy before finally creating your ESC Environment.&lt;/p&gt;
&lt;p&gt;Now, you can just use SSO, giving Pulumi Cloud permissions to create the necessary resources automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-new-onboarding/esc-onboarding-4.png" alt="To setup AWS via SSO you need to provide the SSO start URL and SSO region"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-new-onboarding/esc-onboarding-5.png" alt="AWS will prompt you for permissions to pulumi to create the necessary resources"&gt;&lt;/p&gt;
&lt;p&gt;After we have finished setting up the trust relationship with AWS, we&amp;rsquo;ll set up a new ESC environment for you under the specified project.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-new-onboarding/esc-onboarding-6.png" alt="A new environment will be created under the project and name you specify"&gt;&lt;/p&gt;
&lt;p&gt;Once setup is complete, your new environment is ready to issue short-lived credentials.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi env run aws-login/tehsis-env -- aws s3 ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can now access your cloud resources securely, without worrying about managing long-lived credentials.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;This is just the beginning of our work to simplify Pulumi ESC setup and onboarding. We’re continuing to refine how teams configure, secure, and manage environments to make getting started with ESC as smooth as possible.&lt;/p&gt;
&lt;p&gt;Try &lt;a href="https://www.pulumi.com/docs/esc/environments/"&gt;Pulumi ESC&lt;/a&gt; today and see how it can streamline your secrets and configuration management!&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Sean Yeh</author><category>esc</category></item><item><title>Pulumi ESC: Open Approvals</title><link>https://www.pulumi.com/blog/esc-open-approvals/</link><pubDate>Mon, 13 Oct 2025 16:00:00 -0300</pubDate><guid>https://www.pulumi.com/blog/esc-open-approvals/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/esc-open-approvals/index.png" /&gt;
&lt;p&gt;Many teams live with the fear that a production environment &lt;strong&gt;might be accidentally opened, exposing credentials or sensitive systems before anyone even notices&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We’re excited to announce a new feature for Pulumi ESC: &lt;a href="https://www.pulumi.com/docs/esc/administration/approvals/#open-approvals"&gt;Open approvals&lt;/a&gt;. A &lt;strong&gt;governance capability that lets organizations require review and sign-off before an environment is opened&lt;/strong&gt; (i.e. activated or exposed)&lt;/p&gt;
&lt;h2 id="expanding-on-our-mission-to-enforce-compliance-and-security-without-slowing-teams-down"&gt;Expanding on our mission to enforce compliance and security without slowing teams down&lt;/h2&gt;
&lt;p&gt;You may recall that earlier this year we introduced &lt;a href="https://www.pulumi.com/blog/approvals-in-pulumi-esc"&gt;Approvals for updates&lt;/a&gt;, which allows teams to require review and sign-off before applying modifications to environment configurations. We are now extending Pulumi ESC auditing and governance capabilities to enable Just in time (JIT) access control.&lt;/p&gt;
&lt;p&gt;Many organizations require more robust guardrails around when an environment becomes active or accessible. Open Approvals introduces a gate before environment activation, enforcing that every environment open is intentional, reviewed, and governed.&lt;/p&gt;
&lt;p&gt;Open Approvals introduces a gate before environment activation, enforcing that every environment open is intentional, reviewed, and governed.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;When configuring Approvals gates for your environments under &lt;strong&gt;Settings → Approval Rulesets&lt;/strong&gt;, you can now gate &lt;em&gt;Open&lt;/em&gt; actions in addition to Updates.
From this very same UI, you can define the approvals requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Number of required reviewers&lt;/li&gt;
&lt;li&gt;Specific teams or individuals allowed to approve&lt;/li&gt;
&lt;li&gt;Whether self-approval is permitted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-open-approvals/open-approvals-1.png" alt="Settings page for Approvals in ESC"&gt;&lt;/p&gt;
&lt;p&gt;Once a ruleset is defined, all open operations in the corresponding environment will require to be approved before proceeding.&lt;/p&gt;
&lt;p&gt;To create an open request, users need to specify the approval duration, how long they need access after opening the environment, and a description explaining why access is needed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-open-approvals/open-approvals-2.png" alt="Request open access to environment modal"&gt;&lt;/p&gt;
&lt;p&gt;Approvals can be later review and approved from the Approvals tab.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/esc-open-approvals/open-approvals-3.png" alt="Pending approvals page"&gt;&lt;/p&gt;
&lt;p&gt;A request access can also be created from the CLI via the newly introduced &lt;code&gt;pulumi env open-request&lt;/code&gt; command.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi env open-request org/project/env --access-duration-seconds&lt;span class="o"&gt;=&lt;/span&gt;2h --grant-expiration-seconds&lt;span class="o"&gt;=&lt;/span&gt;1h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="closing-notes"&gt;Closing notes&lt;/h2&gt;
&lt;p&gt;Open approvals expands on Pulumi ESC support for compliance and governance capability while we stay true to our goal: empower teams to move fast while staying secure and compliant: no matter where or how changes happen.&lt;/p&gt;
&lt;p&gt;We’re excited about what’s ahead and look forward to building it together with your feedback.&lt;/p&gt;
&lt;p&gt;You can learn more about &lt;a href="https://www.pulumi.com/docs/esc/administration/approvals"&gt;Approvals in Pulumi ESC Docs&lt;/a&gt;.&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Claire Gaestel</author><author>Robert Harris</author><category>esc</category></item><item><title>Introducing Approvals in Pulumi ESC</title><link>https://www.pulumi.com/blog/approvals-in-pulumi-esc/</link><pubDate>Mon, 04 Aug 2025 09:00:00 -0300</pubDate><guid>https://www.pulumi.com/blog/approvals-in-pulumi-esc/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/approvals-in-pulumi-esc/index.png" /&gt;
&lt;p&gt;Did you know that &lt;strong&gt;80% of unplanned outages aren’t caused by hardware failures or cyberattacks, but by the very changes we make to improve our systems?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pulumi ESC already enables safer change management with &lt;a href="https://www.youtube.com/watch?v=HQN5KOY4asE"&gt;our innovative versioning capability&lt;/a&gt; which &lt;strong&gt;allows users to track and roll back environment revisions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Building on this foundation, we’re excited to announce the release of &lt;a href="https://www.pulumi.com/docs/esc/administration/approvals/"&gt;&lt;strong&gt;Approvals&lt;/strong&gt; in Pulumi ESC&lt;/a&gt;—a new feature that enables organizations to &lt;strong&gt;bring governance and oversight directly into their environment configuration workflows.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With Approvals, teams can require explicit review and sign-off before applying changes to ESC-managed environments, bringing the same rigor to configuration as they already have with infrastructure-as-code and application development.&lt;/p&gt;
&lt;h2 id="enforce-change-management-without-slowing-teams-down"&gt;Enforce Change Management Without Slowing Teams Down&lt;/h2&gt;
&lt;p&gt;Pulumi ESC helps teams manage environment configurations—such as secrets and application settings—across services and environments, from development through production.&lt;/p&gt;
&lt;p&gt;In fast-moving teams, managing these settings safely and consistently is critical. But as the number of contributors grows, so does the risk of accidental or unreviewed changes making it into critical environments.&lt;/p&gt;
&lt;p&gt;That’s where Approvals come in.&lt;/p&gt;
&lt;p&gt;With Approvals, any proposed change to an ESC environment—whether through the Pulumi Console or CLI—must go through a structured review process before it’s applied. Similar to submitting a Pull Request, contributors can propose changes that are reviewed and approved by designated team members.&lt;/p&gt;
&lt;p&gt;This gives you a native, consistent workflow for gating configuration updates without needing external tools or manual oversight.&lt;/p&gt;
&lt;h2 id="why-use-approvals"&gt;Why use Approvals?&lt;/h2&gt;
&lt;p&gt;Teams can use Pulumi ESC Approvals to apply the same rigor of code review workflows to environment configurations and secrets management. Approvals help organizations enforce governance policies, meet compliance requirements, and reduce the risk of misconfigurations by requiring explicit review and sign‑off before applying changes. Each request creates a clear, auditable record of who approved what, when, and why, which is especially valuable for regulated industries or teams with strict change‑management processes.&lt;/p&gt;
&lt;p&gt;By introducing a controlled review process, Approvals let developers propose updates while ensuring only authorized reviewers can approve and apply them. This balances collaboration with security and accountability, and works seamlessly in both the Pulumi Cloud console and the Pulumi CLI.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;To get started, navigate to your environment’s &lt;strong&gt;Settings → Approval Rulesets&lt;/strong&gt;, where you can define approval requirements such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Number of required reviewers&lt;/li&gt;
&lt;li&gt;Specific teams or individuals allowed to approve&lt;/li&gt;
&lt;li&gt;Whether self-approval is permitted&lt;/li&gt;
&lt;li&gt;Whether changes require reapproval if modified&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="approvals-ruleset.png" alt="Pulumi Ruleset configuration"&gt;&lt;/p&gt;
&lt;p&gt;Once a ruleset is enabled, any environment update must go through a &lt;strong&gt;change request&lt;/strong&gt; workflow. Instead of directly saving changes, contributors create a draft, which then must be reviewed and approved before being applied.&lt;/p&gt;
&lt;p&gt;&lt;img src="approvals-workflow.png" alt="Pulumi ESC Approvals Workflows"&gt;&lt;/p&gt;
&lt;p&gt;Changes pending approval are clearly visible to your team, and reviewers can inspect the diff, leave feedback, or revise the request before approving.&lt;/p&gt;
&lt;p&gt;Approvals are also fully supported in the &lt;a href="https://www.pulumi.com/docs/iac/cli/commands/pulumi_env/"&gt;Pulumi CLI&lt;/a&gt;, using the &lt;code&gt;--draft&lt;/code&gt; flag:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi env &lt;span class="nb"&gt;set&lt;/span&gt; --draft org/project/env FEATURE_X_ENABLED &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In addition to the CLI, Approvals can be used directly from the &lt;a href="https://github.com/pulumi/esc-sdk"&gt;ESC SDK&lt;/a&gt;—making it easy to integrate change‑management workflows into your own applications or automation scripts.&lt;/p&gt;
&lt;p&gt;They are also available through the &lt;a href="https://marketplace.visualstudio.com/items?itemName=pulumi.pulumi-vscode-tools"&gt;Pulumi Visual Studio Code Extension&lt;/a&gt;, allowing developers to review, approve, and apply configuration changes without leaving their editor.&lt;/p&gt;
&lt;p&gt;Finally, the Pulumi Service Provider supports managing approval rules as code. For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;@pulumi/pulumiservice&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;pulumi&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;@pulumi/pulumi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;approvalRule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ApprovalRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rule-test&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;My rule!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;targetActionTypes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;update&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;environmentIdentifier&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;organization&lt;/span&gt;: &lt;span class="kt"&gt;environment.organization&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;project&lt;/span&gt;: &lt;span class="kt"&gt;environment.project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;name&lt;/span&gt;: &lt;span class="kt"&gt;environment.name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;approvalRuleConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;numApprovalsRequired&lt;/span&gt;: &lt;span class="kt"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;allowSelfApproval&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;requireReapprovalOnChange&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;eligibleApprovers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rbacPermission&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;environment:write&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pulumi-bot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;IaroslavTitov&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can find more examples for different languages at the &lt;a href="https://github.com/pulumi/pulumi-pulumiservice/tree/main/examples"&gt;Pulumi Service Provider Github repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="built-for-collaboration-and-compliance"&gt;Built for Collaboration and Compliance&lt;/h2&gt;
&lt;p&gt;Whether you’re enforcing separation of duties, complying with industry standards or regulations, or simply want better visibility into changes, Approvals helps bring process to how configuration flows through your systems.&lt;/p&gt;
&lt;p&gt;It also integrates seamlessly into existing workflows—no need to reinvent how teams work. Just add governance where it matters most.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s Next&lt;/h2&gt;
&lt;p&gt;Approvals in ESC is just the beginning. We&amp;rsquo;re exploring how approval workflows can be extended to other areas of the Pulumi ecosystem to provide a consistent, governed experience across the entire software delivery lifecycle.&lt;/p&gt;
&lt;p&gt;Our goal is to empower teams to move fast while staying secure and compliant—no matter where or how changes happen. We’re excited about what’s ahead and look forward to building it together with your feedback.&lt;/p&gt;
&lt;p&gt;Happy building!&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Claire Gaestel</author><category>esc</category></item><item><title>Bring Your Own Keys With Pulumi ESC</title><link>https://www.pulumi.com/blog/bring-your-own-keys-with-pulumi-esc/</link><pubDate>Wed, 18 Jun 2025 13:25:26 -0300</pubDate><guid>https://www.pulumi.com/blog/bring-your-own-keys-with-pulumi-esc/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/bring-your-own-keys-with-pulumi-esc/index.png" /&gt;
&lt;p&gt;Today we’re excited to launch support for Customer-Managed Keys (CMKs) in Pulumi ESC. This feature gives your organization full control over how your secrets and state are encrypted — empowering you to meet the most demanding compliance requirements like HIPAA, GDPR, and FedRAMP, all while maintaining the ease-of-use that Pulumi is known for.&lt;/p&gt;
&lt;h2 id="why-customer-managed-keys"&gt;Why Customer-Managed Keys?&lt;/h2&gt;
&lt;p&gt;Pulumi encrypts secrets and other sensitive information stored in ESC using data keys, which are encrypted with Pulumi-Managed Keys using strong security standards. However, customers might need to use their own keys to gain full control over their lifecycle and revocation, maintain a centralized audit trail, and enforce custom rotation policies. This is especially important to meet compliance requirements or specific regulations (e.g., HIPAA, GDPR, FedRAMP, etc.). Customer-Managed Keys give customers that control while keeping these aspects transparent for the consumers of those secrets.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Customer-Managed Keys integrate seamlessly with your Pulumi Cloud Organization. Once enabled, all existing data keys used to encrypt your ESC secrets, previously encrypted with the Pulumi-managed key, will be automatically re-encrypted with the new CMK.&lt;/p&gt;
&lt;p&gt;Setting it up takes just a few minutes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create&lt;/strong&gt; a KMS key in your AWS account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grant access&lt;/strong&gt; to the KMS key using OIDC in your AWS account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure&lt;/strong&gt; your Pulumi Cloud organization to use your new KMS key.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="available-today"&gt;Available Today&lt;/h2&gt;
&lt;p&gt;Customer-Managed Keys with support for AWS KMS are available today for all organizations on the &lt;strong&gt;Pulumi Enterprise&lt;/strong&gt; or &lt;strong&gt;Business Critical&lt;/strong&gt; plans. You can set it up by following the instructions &lt;a href="https://www.pulumi.com/docs/pulumi-cloud/admin/customer-managed-keys"&gt;in the Pulumi Cloud documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We expect to add support for more cloud providers in the future. Please vote on the following GitHub issues for your favorite to support prioritization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulumi/pulumi-cloud-requests/issues/521"&gt;Azure Key Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulumi/pulumi-cloud-requests/issues/522"&gt;Google Cloud KMS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="share-your-feedback"&gt;Share Your Feedback&lt;/h2&gt;
&lt;p&gt;We’re excited to see how Customer-Managed Keys help you and your organization meet your compliance goals with Pulumi Cloud. Your feedback is essential as we continue to evolve this feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect with us in the &lt;a href="https://slack.pulumi.com"&gt;Pulumi Community Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open an issue on &lt;a href="https://github.com/pulumi/pulumi"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read the full documentation on &lt;a href="https://www.pulumi.com/docs/pulumi-cloud/admin/customer-managed-keys"&gt;Customer-Managed Keys&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try this today, &lt;a href="https://pulumi.com/start"&gt;Get Started with Pulumi for free&lt;/a&gt;&lt;/p&gt;</description><author>Pablo Terradillos</author><author>Boris Schlosser</author><category>esc</category><category>aws</category><category>features</category><category>secrets</category></item></channel></rss>