From 13344f39b5b7798d3b17e22014e5fd330a10ae34 Mon Sep 17 00:00:00 2001 From: Cam Date: Mon, 10 Nov 2025 23:41:52 +0000 Subject: [PATCH 01/10] Enhance documentation structure and content for Pulumi ESC getting started guides --- content/docs/esc/get-started/_index.md | 14 ++ .../esc/get-started/import-environments.md | 2 +- .../get-started/integrate-with-pulumi-iac.md | 191 ++++++++---------- .../get-started/retrieve-external-secrets.md | 2 +- .../get-started/store-and-retrieve-secrets.md | 2 +- .../get-started/use-short-term-credentials.md | 2 +- 6 files changed, 97 insertions(+), 116 deletions(-) diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index 76687df4bbd4..4d418cac3a42 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -29,4 +29,18 @@ Before you begin, you can watch the following video which provides a high level +## Choose your path + +{{% notes "info" %}} + +**Already using Pulumi IaC?** + +If you have existing Pulumi infrastructure as code projects and want to centralize your configuration and secrets, jump directly to [Integrate with Pulumi IaC](/docs/esc/get-started/integrate-with-pulumi-iac/) to add ESC to your projects in three steps. + +**New to Pulumi ESC?** + +Continue with the tutorial below to learn ESC fundamentals, starting with account setup and creating your first environment. + +{{% /notes %}} + {{< get-started-stepper >}} diff --git a/content/docs/esc/get-started/import-environments.md b/content/docs/esc/get-started/import-environments.md index 512ef8773bfa..d196bed8b7ae 100644 --- a/content/docs/esc/get-started/import-environments.md +++ b/content/docs/esc/get-started/import-environments.md @@ -3,7 +3,7 @@ title_tag: Import Environments | Pulumi ESC title: Import environments h1: "Pulumi ESC: Import Environments" meta_desc: This page provides an overview on how to import environments in Pulumi ESC. -weight: 5 +weight: 6 menu: esc: parent: esc-get-started diff --git a/content/docs/esc/get-started/integrate-with-pulumi-iac.md b/content/docs/esc/get-started/integrate-with-pulumi-iac.md index 44ad8e871a84..973ed8e27f5d 100644 --- a/content/docs/esc/get-started/integrate-with-pulumi-iac.md +++ b/content/docs/esc/get-started/integrate-with-pulumi-iac.md @@ -3,7 +3,7 @@ title_tag: Integrate with Pulumi IaC | Pulumi ESC title: Integrate with Pulumi IaC h1: "Pulumi ESC: Integrate with Pulumi IaC" meta_desc: This page provides an overview on how to use Pulumi ESC with Pulumi IaC. -weight: 8 +weight: 4 menu: esc: parent: esc-get-started @@ -13,160 +13,127 @@ aliases: ## Overview -Pulumi ESC works independently of [Pulumi Infrastructure as Code (IaC)](/docs/get-started/), providing developers the flexibility to centrally manage their environment configuration regardless of how or where those environments are created. +Add Pulumi ESC to your existing Pulumi IaC projects in three steps to centrally manage configuration and secrets across all your stacks. This integration works seamlessly everywhere Pulumi runs, including locally, in CI/CD, Pulumi Deployments, and GitHub Actions. -Pulumi ESC also integrates seamlessly with Pulumi IaC, and this tutorial will demonstrate how to leverage Pulumi ESC in your own Pulumi programs. This works everywhere, including Pulumi Deployments and GitHub Actions, without any additional work or changes. +## Add ESC to your Pulumi project -## Prerequisites +### Step 1: Reference your ESC environment -To complete the steps in this tutorial, you will need to install the following prerequisites: +In your stack configuration file (`Pulumi..yaml`), add an `environment` block that references your ESC environment: -- the [Pulumi IaC CLI](/docs/cli/) -- one of [Pulumi's supported language runtimes](/docs/languages-sdks/) - -### Create and Configure a New Project - -Once the prerequisites are installed, run the `pulumi new ` command in an empty folder to [create a new Pulumi project](/docs/cli/commands/pulumi_new/), making sure to replace `` with the supported language of your choice: - -```bash -# example using python -$ pulumi new python -This command will walk you through creating a new Pulumi project. - -Enter a value or leave blank to accept the (default), and press . -Press ^C at any time to quit. - -project name (pulumi-esc-iac): -project description (A minimal Python Pulumi program): -Created project 'pulumi-esc-iac' - -Please enter your desired stack name. -To create a stack in an organization, use the format / (e.g. `acmecorp/dev`). -stack name (dev): pulumi/dev -Created stack 'dev' - -Installing dependencies... - -Creating virtual environment... -Finished creating virtual environment -Updating pip, setuptools, and wheel in virtual environment... -... -... -Finished installing dependencies - -Your new project is ready to go! - -To perform an initial deployment, run `pulumi up` +```yaml +environment: + - / ``` -## Access configuration locally - -In a Pulumi project, you can locally [store and retrieve configuration values](/docs/concepts/config/) using the `pulumi config set [value]` command. Run the following command to create a config value with a key of `myEnvironment` and a value of `development`: +For example, if your ESC environment is `my-org/aws-prod`: -```bash -$ pulumi config set myEnvironment development +```yaml +environment: + - my-org/aws-prod ``` -Now run the following command to create a secret config value with a key of `myPassword` and a value of `demo-password-123`: +You can also reference multiple environments, which will be merged in order: -```bash -$ pulumi config set myPassword demo-password-123 --secret +```yaml +environment: + - my-org/common + - my-org/aws-prod ``` -These values will be stored in your project's stack settings file `Pulumi..yaml` as shown below: +### Step 2: Define configuration in your ESC environment + +In your ESC environment file, use the `pulumiConfig` block to expose values to Pulumi IaC: ```yaml -# Contents of Pulumi..yaml file -config: - pulumi-esc-iac:myEnvironment: development - pulumi-esc-iac:myPassword: - secure: AAABADd5YzRaVuzxM08i5z2CJ3LGkQau5e5Lhk+1Gtj37qv6zKkFr8KxmN6X+w/XMg== +values: + pulumiConfig: + aws:region: us-west-2 + myApp:apiKey: + fn::secret: demo-api-key-123 ``` -You can retrieve the value of this configuration via the CLI by running the `pulumi config get ` command as shown below: +The `pulumiConfig` block maps ESC values to Pulumi configuration keys. Values defined here become available to your Pulumi program through the standard Configuration API. -```bash -# example output -$ pulumi config get myEnvironment -development -``` +### Step 3: Access configuration in your code -You can also import and access this configuration value from directly within your Pulumi program as shown below: +Use Pulumi's standard Configuration API to access these values in your infrastructure code: {{< example-program path="aws-import-export-pulumi-config" >}} -Run the `pulumi preview` command as shown below to validate the retrieval of the configuration: - -```bash -$ pulumi preview -Previewing update (dev) - -Loading policy packs... +That's it! Your Pulumi program now retrieves configuration and secrets from ESC. Run `pulumi preview` or `pulumi up` to see it in action. - Type Name Plan - + pulumi:pulumi:Stack pulumi-esc-iac-dev create +## Practical examples -Policies: - ✅ pulumi-internal-policies@v0.0.6 +### Centralizing cloud credentials -Outputs: # the outputted config values - Environment: "development" - Password : [secret] +Share AWS OIDC credentials across multiple stacks: -Resources: - + 1 to create +```yaml +values: + aws: + login: + fn::open::aws-login: + oidc: + roleArn: arn:aws:iam::123456789012:role/pulumi-deployment-role + sessionName: pulumi-session + pulumiConfig: + aws:region: ${aws.login.region} + environmentVariables: + AWS_ACCESS_KEY_ID: ${aws.login.accessKeyId} + AWS_SECRET_ACCESS_KEY: ${aws.login.secretAccessKey} + AWS_SESSION_TOKEN: ${aws.login.sessionToken} ``` -Defining the configuration via the project stack settings file may be fine when dealing with a singular project, but it can become very challenging to maintain securely and consistently across multiple projects. Centralizing these configuration values using Pulumi ESC provides more scalability without increasing administrative overhead along the way. +Learn more about [dynamic cloud credentials](/docs/esc/get-started/use-short-term-credentials/). -## Access configuration from ESC +### Managing API keys and secrets -To centralize this configuration and make it accessible to your Pulumi program, you will need to add a second-level key named `pulumiConfig` in your environment file that will expose the values nested underneath it to Pulumi IaC. Add the following configuration to your environment file: +Store third-party API keys centrally and reference them across projects: ```yaml values: pulumiConfig: - myEnvironment: development + myApp:datadogApiKey: + fn::secret: + fn::open::azure-secrets: + login: ${azure.login} + get: + secretId: https://my-keyvault.vault.azure.net/secrets/datadog-api-key ``` -From here, you will need to import your environment file into your Pulumi project. To do this, return to your `Pulumi..yaml` file and update it to import your environment as shown below, making sure to replace the value of `/` with the identifier of your own environment: +Learn more about [retrieving secrets from external sources](/docs/esc/get-started/retrieve-external-secrets/). -```yaml -environment: - - / -``` +### Environment-specific configuration -This will import any configuration values that you have defined under the `pulumiConfig` key in your environment file and make them accessible to your Pulumi project. +Compose environments to share common configuration while overriding values per environment: -Save the file and then run the `pulumi config get ` command as shown below to quickly test that the import is working: +```yaml +# common environment +values: + pulumiConfig: + myApp:instanceType: t3.micro + myApp:replicas: 1 -```bash -# example output -$ pulumi config get myEnvironment -development +# production environment (imports common) +imports: + - common +values: + pulumiConfig: + myApp:instanceType: t3.large # override for production + myApp:replicas: 3 # override for production ``` -Now run the `pulumi preview` command again to test that the imported configuration value is accessible from within your Pulumi program: - -```bash -$ pulumi preview -Previewing update (dev) +Learn more about [importing and composing environments](/docs/esc/get-started/import-environments/). -Loading policy packs... +## Next steps - Type Name Plan - + pulumi:pulumi:Stack pulumi-esc-iac-dev create - -Policies: - ✅ pulumi-internal-policies@v0.0.6 - -Outputs: - Value: "development" - -Resources: - + 1 to create -``` +Now that you've integrated ESC with your Pulumi IaC project, explore more ESC features: -See the Pulumi documentation on [Accessing Configuration from Code](/docs/concepts/config/#code) for more details. +- [Store and retrieve secrets](/docs/esc/get-started/store-and-retrieve-secrets/) - Learn how to manage secrets in ESC +- [Import environments](/docs/esc/get-started/import-environments/) - Compose environments for team boundaries +- [Dynamic cloud credentials](/docs/esc/get-started/use-short-term-credentials/) - Generate short-lived OIDC credentials +- [External secret providers](/docs/esc/get-started/retrieve-external-secrets/) - Pull secrets from AWS, Azure, GCP, and more +- [ESC + Pulumi IaC reference](/docs/esc/integrations/infrastructure/pulumi-iac/) - Complete integration documentation {{< get-started-stepper >}} diff --git a/content/docs/esc/get-started/retrieve-external-secrets.md b/content/docs/esc/get-started/retrieve-external-secrets.md index 4fd95dfcc735..0d4387320d64 100644 --- a/content/docs/esc/get-started/retrieve-external-secrets.md +++ b/content/docs/esc/get-started/retrieve-external-secrets.md @@ -3,7 +3,7 @@ title_tag: Retrieve External Secrets | Pulumi ESC title: Retrieve secrets from external sources h1: "Pulumi ESC: Retrieve Secrets from External Sources" meta_desc: This page provides an overview on how to retrieve secrets from external sources. -weight: 7 +weight: 8 menu: esc: parent: esc-get-started diff --git a/content/docs/esc/get-started/store-and-retrieve-secrets.md b/content/docs/esc/get-started/store-and-retrieve-secrets.md index ff4c28ff9662..1665e690b81e 100644 --- a/content/docs/esc/get-started/store-and-retrieve-secrets.md +++ b/content/docs/esc/get-started/store-and-retrieve-secrets.md @@ -3,7 +3,7 @@ title_tag: Store and Retrieve Secrets | Pulumi ESC title: Store and retrieve secrets h1: "Pulumi ESC: Store and Retrieve Secrets" meta_desc: This page provides an overview on how to store and retrieve secrets in Pulumi ESC. -weight: 4 +weight: 5 menu: esc: parent: esc-get-started diff --git a/content/docs/esc/get-started/use-short-term-credentials.md b/content/docs/esc/get-started/use-short-term-credentials.md index 004995b92aec..e14b61c1e9c1 100644 --- a/content/docs/esc/get-started/use-short-term-credentials.md +++ b/content/docs/esc/get-started/use-short-term-credentials.md @@ -3,7 +3,7 @@ title_tag: Use Short Term Cloud Credentials | Pulumi ESC title: Use short term cloud credentials h1: "Use Short Term Cloud Credentials to Run Commands Without Local Secrets" meta_desc: This page provides an overview on how to get short term cloud credentials and run commands without using local secrets using the "esc run" command. -weight: 6 +weight: 7 menu: esc: parent: esc-get-started From 3950013c3c8276c2ed2aabdcd6487117c0ae767d Mon Sep 17 00:00:00 2001 From: Cam Date: Mon, 10 Nov 2025 23:59:36 +0000 Subject: [PATCH 02/10] Implementing claude's feedback --- content/docs/esc/get-started/integrate-with-pulumi-iac.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/esc/get-started/integrate-with-pulumi-iac.md b/content/docs/esc/get-started/integrate-with-pulumi-iac.md index 973ed8e27f5d..f5a54e04698d 100644 --- a/content/docs/esc/get-started/integrate-with-pulumi-iac.md +++ b/content/docs/esc/get-started/integrate-with-pulumi-iac.md @@ -67,7 +67,7 @@ That's it! Your Pulumi program now retrieves configuration and secrets from ESC. ### Centralizing cloud credentials -Share AWS OIDC credentials across multiple stacks: +To share AWS OIDC credentials across multiple stacks, configure your ESC environment like this: ```yaml values: From 6f7f4e3aec9e7bd4540a0f2e06eb4e0cec00c1c4 Mon Sep 17 00:00:00 2001 From: Cam Date: Tue, 11 Nov 2025 00:59:41 +0000 Subject: [PATCH 03/10] wip --- .../esc/assets/esc-create-environment.png | Bin 101845 -> 43756 bytes content/docs/esc/get-started/_index.md | 6 ++-- content/docs/esc/get-started/begin.md | 10 +++--- .../esc/get-started/create-environment.md | 6 ++-- .../get-started/store-and-retrieve-secrets.md | 34 +++++++++--------- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/content/docs/esc/assets/esc-create-environment.png b/content/docs/esc/assets/esc-create-environment.png index 3d56457de72f27852bef32e466242fea6707e658..adab996f6e8931a6f3aec5dcc17fc41363c5d3bc 100644 GIT binary patch literal 43756 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⁣xqaiC&&H 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 diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index 4d418cac3a42..d7621b1d2fe7 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -14,9 +14,11 @@ aliases: In a typical application or infrastructure development workflow, there's often a need to maintain multiple environments such as development, staging, and production. Each of these environments might have its own set of configuration values: API endpoints, database connection strings, third-party secrets, and more. -Hardcoding these values or keeping them inside source code is a security risk and makes managing configurations complex. [Pulumi ESC (Environments, Secrets and Configuration)](/docs/esc/) offers a centralized store to manage configuration data, plain-text data, and secrets. +Hardcoding these values or keeping them inside source code is a security risk and makes managing configurations complex. -In this tutorial, we’ll demonstrate how to use Pulumi ESC as well as the power of this service in managing configuration and secrets. +[Pulumi ESC (Environments, Secrets and Configuration)](/docs/esc/) offers a centralized store to manage configuration data, plain-text data, and secrets. + +In this tutorial, you will learn how to use Pulumi ESC to manage configuration and secrets. Before you begin, you can watch the following video which provides a high level overview of how Pulumi ESC works: diff --git a/content/docs/esc/get-started/begin.md b/content/docs/esc/get-started/begin.md index 4eebd8f10484..f7a1b5628aac 100644 --- a/content/docs/esc/get-started/begin.md +++ b/content/docs/esc/get-started/begin.md @@ -11,11 +11,13 @@ menu: aliases: --- -Before you get started using Pulumi ESC, let's run through a few quick steps to ensure your environment is set up correctly. +Before you get started using Pulumi ESC, complete the following prerequisites to set up your environment. ### Create a Pulumi account -Pulumi ESC is a service of Pulumi Cloud, meaning you will need to create a Pulumi account to be able to use it. To do so, navigate to the [Pulumi Cloud console](https://app.pulumi.com) and create a new account. Once created, you can [optionally create an access token](/docs/administration/access-identity/access-tokens/). Doing so will provide you an alternative way to sign into the Pulumi Cloud via the CLI. The token can also be used to automate your usage of the Pulumi Cloud using the REST API. +Pulumi ESC is a service of Pulumi Cloud, meaning you will need to create a Pulumi account to be able to use it. To do so, navigate to the [Pulumi Cloud console](https://app.pulumi.com) and create a new account. + +Once created, you can [optionally create an access token](/docs/administration/access-identity/access-tokens/). Doing so will provide you an alternative way to sign into the Pulumi Cloud via the CLI. The token can also be used to automate your usage of the Pulumi Cloud using the REST API. ### Install the Pulumi ESC CLI @@ -47,7 +49,7 @@ $ curl -fsSL https://get.pulumi.com/esc/install.sh | sh
-

Windows Binary Download

+

Windows binary download

amd64

@@ -81,7 +83,7 @@ Logged in to https://api.pulumi.com/ as your-pulumi-org (https://app.pulumi.com/ ### [Optional] Configure OpenID Connect (OIDC) -Pulumi supports [OpenID Connect (OIDC) integration](/docs/esc/environments/configuring-oidc) across various services including Pulumi ESC. OIDC enables secure interactions between Pulumi and cloud providers by leveraging signed, short-lived tokens issued by the Pulumi Cloud. Use one of the following guides below to configure OIDC between Pulumi ESC and your chosen cloud provider: +Pulumi supports [OpenID Connect (OIDC) integration](/docs/esc/environments/configuring-oidc) across various services including Pulumi ESC. OIDC enables secure interactions between Pulumi and cloud providers by leveraging signed, short-lived tokens issued by the Pulumi Cloud. Use one of the following guides to configure OIDC between Pulumi ESC and your chosen cloud provider: - [OIDC Configuration for AWS](/docs/esc/environments/configuring-oidc/aws/) - [OIDC Configuration for Azure](/docs/esc/environments/configuring-oidc/azure/) diff --git a/content/docs/esc/get-started/create-environment.md b/content/docs/esc/get-started/create-environment.md index 0e1935d89075..dd2c0250879f 100644 --- a/content/docs/esc/get-started/create-environment.md +++ b/content/docs/esc/get-started/create-environment.md @@ -1,7 +1,7 @@ --- title_tag: Create a New Environment | Pulumi ESC title: Create environment -h1: "Pulumi ESC: Create A New Environment" +h1: "Pulumi ESC: Create a New Environment" meta_desc: This page provides an overview on how to create a new Pulumi ESC environment. weight: 3 menu: @@ -29,9 +29,9 @@ This tutorial will walk you through how to create a new environment. To create an environment via the console, navigate to [Pulumi Cloud](https://app.pulumi.com) and select the **Environments** link in the left-hand menu. -You will be directed to the Environments landing page. To create a new environment, click the **Create Environment** button. Enter a name for the project your environment should belong in (e.g. `my-project`) and a name for your environment (e.g., `dev-environment` for a development environment) and then click **Create Environment**. You will then be directed to the environment definition page. +You will be directed to the Environments landing page. Select the **Create Environment** button to open the Create Environment flyout panel. Ensure the **Start from scratch** tab is selected and the **New Environment** option is chosen. Enter a project name (e.g., `my-project`) and an environment name (e.g., `dev-environment`), then select **Create Environment**. You will be directed to the environment definition page. -![Creating a new environment in the Pulumi ESC console](/docs/esc/assets/esc-create-environment.png) +![Create Environment flyout panel showing Start from scratch tab with New Environment option selected, project name field containing 'my-project', and environment name field containing 'dev-environment'](/docs/esc/assets/esc-create-environment.png) ### Create via the CLI diff --git a/content/docs/esc/get-started/store-and-retrieve-secrets.md b/content/docs/esc/get-started/store-and-retrieve-secrets.md index 1665e690b81e..a9dd2dc30b21 100644 --- a/content/docs/esc/get-started/store-and-retrieve-secrets.md +++ b/content/docs/esc/get-started/store-and-retrieve-secrets.md @@ -30,11 +30,11 @@ You can store and retrieve values in an environment via one of the following met - the Pulumi Cloud console Table view - the ESC CLI -## Store Environment values +## Store environment values ### Store via the document view -To store values in your environment using the Document view, first click on the name of the environment to open it. You will be presented with a split pane view. The left side is the YAML-based code document view, and this is where you will write the definition of your environment configuration. The right side will show a preview of your configuration in JSON format. +To store values in your environment using the Document view, first select the name of the environment to open it. You will be presented with a split pane view. The left side is the YAML-based code document view, and this is where you will write the definition of your environment configuration. The right side will show a preview of your configuration in JSON format. ![Open environment in Pulumi ESC console](/docs/esc/assets/esc-open-env.png) @@ -47,23 +47,23 @@ values: fn::secret: "demo-password-123" ``` -As shown above, you can specify that a value should be stored as a secret by using the `fn::secret` function. Once you have added the configuration, click the **Save** button located at the bottom of the editor. +As shown above, you can specify that a value should be stored as a secret by using the `fn::secret` function. Once you have added the configuration, select the **Save** button located at the bottom of the editor. -{{< video title="Adding values to the environment in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-add-env-values.mp4" autoplay="true" loop="true" >}} +{{< video title="Adding values to an environment using Document view in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-add-env-values.mp4" autoplay="true" loop="true" >}} The **Environment preview** pane on the right-hand side will then update to show your added configuration in JSON format. You will notice that the value of "myPassword" has been hidden from view in both the definition and preview panes. -### Store via the Table view +### Store via the table view -To store values in your environment using the Document view, first click on the name of the environment to open it. From the **Editor** menu, click the **Table view** button to switch the editor from the document YAML view to the table view. +To store values in your environment using the Table view, first select the name of the environment to open it. From the **Editor** menu, select the **Table view** button to switch the editor from the document YAML view to the table view. -{{< video title="Adding values to the environment in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-open-env-table-view.mp4" autoplay="true" loop="true" >}} +{{< video title="Switching to Table view in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-open-env-table-view.mp4" autoplay="true" loop="true" >}} -Next, under the **Configuration** section, you will see fields labeled **Path** and **Value**. You will define your configuration values using these fields. In the **Path** field, type in `myEnvironment`, and in the **Value** field, type in `development`. Then click **Done** and **Save**. +Next, under the **Configuration** section, you will see fields labeled **Path** and **Value**. You will define your configuration values using these fields. In the **Path** field, type in `myEnvironment`, and in the **Value** field, type in `development`. Then select **Done** and **Save**. ![Adding values to the environment in the Pulumi ESC console](/docs/esc/assets/esc-add-env-values.png) -Next, click the **+Secret/config** button to create a new configuration. This time, you will create a configuration that will be stored as a secret. To do so, enter `myPassword` for the value of **Path** and `demo-password-123` for the value of **Value**. Select the **secret** option from the drop-down to indicate that this configuration will be stored as a secret, then click **Done** and **Save**. +Next, select the **+Secret/config** button to create a new configuration. This time, you will create a configuration that will be stored as a secret. To do so, enter `myPassword` for the value of **Path** and `demo-password-123` for the value of **Value**. Select the **secret** option from the drop-down to indicate that this configuration will be stored as a secret, then select **Done** and **Save**. ![Adding values to the environment in the Pulumi ESC console](/docs/esc/assets/esc-add-secret-value.png) @@ -92,25 +92,25 @@ Alternatively, you can directly [edit your environment file with a code editor]( esc env edit / ``` -Using this method enables you to add your configuration values in the same way that you would [via the console](/docs/esc/get-started/store-and-retrieve-secrets/#store-via-the-console). +Using this method enables you to add your configuration values in the same way that you would [via the document view](/docs/esc/get-started/store-and-retrieve-secrets/#store-via-the-document-view). -## Retrieve Environment values +## Retrieve environment values ### Retrieve via the Document view -To retrieve values using the Document view, click the **Open** button. This will return any statically defined plain-text values and definitions. +To retrieve values using the Document view, select the **Open** button. This will return any statically defined plain-text values and definitions. ![Clicking the open button in the Pulumi ESC console](/docs/esc/assets/esc-open-environment.png) -As shown above, it does not return the value of secrets defined, nor does it resolve values that are dynamically generated from a provider. To view these values, you will need to click the **Show secrets** slider. +As shown above, it does not return the value of secrets defined, nor does it resolve values that are dynamically generated from a provider. To view these values, you will need to select the **Show secrets** slider. -![Clicking the show secrets slider the Pulumi ESC console](/docs/esc/assets/esc-show-secret-document-view.png) +![Clicking the show secrets slider in the Pulumi ESC console](/docs/esc/assets/esc-show-secret-document-view.png) -### Retrieve via the Table view +### Retrieve via the table view -Non-secret configuration values remain visible in the Table view after their creation, but secret values are automatically hidden. To reveal the value of a secret using the Table view, click the small eye icon. +Non-secret configuration values remain visible in the Table view after their creation, but secret values are automatically hidden. To reveal the value of a secret using the Table view, select the small eye icon. -{{< video title="Clicking the show secrets slider the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-show-secret-table-view.mp4" autoplay="true" loop="true" >}} +{{< video title="Revealing secrets using the show secrets toggle in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-show-secret-table-view.mp4" autoplay="true" loop="true" >}} ### Retrieve via the CLI From c4e9c682507760d98ac24c31869b961fe5780cd0 Mon Sep 17 00:00:00 2001 From: Cam Date: Tue, 11 Nov 2025 20:52:52 +0000 Subject: [PATCH 04/10] Add guides for Pulumi ESC, including managing secrets, integrating with Pulumi IaC, and setting up OIDC - Introduced new "Get Started" - Created a new index page for guides on Pulumi ESC. - Added detailed guides for integrating external secrets from AWS, Azure, and GCP. - Introduced a guide on importing environments to share configuration across teams. - Developed a guide on managing secrets, including storing and retrieving them. - Added instructions for running commands with `esc run` to inject secrets into scripts. - Created a guide for setting up OIDC to generate dynamic cloud credentials. - Updated references in existing documentation to point to new guides. --- .../{get-started => assets}/esc-base-url.png | Bin content/docs/esc/concepts/_index.md | 131 +++++++--- content/docs/esc/concepts/how-esc-works.md | 59 ++++- content/docs/esc/environments/_index.md | 2 +- content/docs/esc/get-started/_index.md | 137 +++++++++-- content/docs/esc/get-started/begin.md | 96 -------- .../esc/get-started/create-environment.md | 61 ----- .../get-started/store-and-retrieve-secrets.md | 189 --------------- content/docs/esc/guides/_index.md | 34 +++ .../external-secrets.md} | 44 ++-- .../importing-environments.md} | 26 +- .../integrate-with-pulumi-iac.md | 71 ++++-- content/docs/esc/guides/managing-secrets.md | 194 +++++++++++++++ .../esc/guides/running-commands-with-esc.md | 225 ++++++++++++++++++ .../setting-up-oidc.md} | 30 ++- .../dynamic-login-credentials/gh-login.md | 2 +- .../integrations/infrastructure/cloudflare.md | 4 +- 17 files changed, 829 insertions(+), 476 deletions(-) rename content/docs/esc/{get-started => assets}/esc-base-url.png (100%) delete mode 100644 content/docs/esc/get-started/begin.md delete mode 100644 content/docs/esc/get-started/create-environment.md delete mode 100644 content/docs/esc/get-started/store-and-retrieve-secrets.md create mode 100644 content/docs/esc/guides/_index.md rename content/docs/esc/{get-started/retrieve-external-secrets.md => guides/external-secrets.md} (74%) rename content/docs/esc/{get-started/import-environments.md => guides/importing-environments.md} (79%) rename content/docs/esc/{get-started => guides}/integrate-with-pulumi-iac.md (53%) create mode 100644 content/docs/esc/guides/managing-secrets.md create mode 100644 content/docs/esc/guides/running-commands-with-esc.md rename content/docs/esc/{get-started/use-short-term-credentials.md => guides/setting-up-oidc.md} (86%) diff --git a/content/docs/esc/get-started/esc-base-url.png b/content/docs/esc/assets/esc-base-url.png similarity index 100% rename from content/docs/esc/get-started/esc-base-url.png rename to content/docs/esc/assets/esc-base-url.png diff --git a/content/docs/esc/concepts/_index.md b/content/docs/esc/concepts/_index.md index f81c53dd1726..a281140d0b36 100644 --- a/content/docs/esc/concepts/_index.md +++ b/content/docs/esc/concepts/_index.md @@ -2,7 +2,7 @@ title: Concepts title_tag: Pulumi ESC Concepts h1: Pulumi ESC Concepts -meta_desc: Pulumi ESC allows you to compose and manage hierarchical collections of configuration and secrets and consume them in various ways. +meta_desc: Learn the core concepts of Pulumi ESC including environments, providers, composition, and the evaluation model. menu: esc: parent: esc-home @@ -12,58 +12,131 @@ aliases: - /docs/concepts/environments/ --- -Pulumi ESC (Environments, Secrets, and Configuration) simplifies how organizations manage secrets and configurations across multiple environments. It enables teams to compose collections of configuration and secrets called *environments*, which can be consumed by various infrastructure and application services. ESC helps ensure security, consistency, and efficiency in handling secrets and configuration. +Pulumi ESC (Environments, Secrets, and Configuration) is a secrets and configuration management system built around four core concepts: environments, sources, targets, and management. Understanding these concepts will help you build a mental model of how ESC works. -Pulumi ESC is offered both as a fully managed cloud service in [Pulumi Cloud](/docs/pulumi-cloud/) and self-hosted for scenarios that require isolated environments. ESC has native integration with several products and other Pulumi products, including Pulumi Infrastructure as Code (IaC). The [pulumi/esc project](https://github.com/pulumi/esc) is open source, and contains the evaluation engine for environments, the `esc` CLI. +Pulumi ESC is available as a fully managed service in [Pulumi Cloud](/docs/pulumi-cloud/) and can be self-hosted for isolated environments. The [pulumi/esc project](https://github.com/pulumi/esc) is open source and contains the evaluation engine and CLI. {{< figure src="/docs/esc/assets/pulumi_esc.png" caption="Figure: The Pulumi ESC ecosystem.">}} -The diagram above shows four key concepts: +## Core concepts -1. ***Environments***: ESC environments are collections of secrets and configuration. Environments are composable from multiple environments and draw from both static and dynamic sources and can be shared to many targets. +### Environments -2. ***Sources***: ESC can *input* configuration and secrets from a variety of sources, and it has an extensible plugin model for integrating third-party sources. ESC's built-in support for dynamic secret providers, allows for best-practices like generating short-term credentials via OIDC, and dynamically pulling secret values at the time of use, for all major cloud providers. +An environment is a named collection of configuration values and secrets defined in YAML. Environments are the fundamental unit of organization in ESC. Each environment: -3. ***Targets***: ESC *outputs* configuration and secrets to a variety of popular targets. Pulumi ESC has a rich API that allows for easy integration, and provides standard output mechanisms like environment variables and key files. +- Has a unique name within a project (e.g., `my-org/my-project/production`) +- Contains a YAML document that defines values, imports other environments, and configures providers +- Is versioned—every change creates a new version +- Can be tagged for easier reference (e.g., `stable`, `v1.2.3`) +- Is evaluated when opened, resolving all dynamic values and imports -4. ***Management***: ESC environments are centrally managed in Pulumi Cloud, and can be permissioned with RBAC, versioned, tagged, and audited. ESC secrets are encrypted in flight and at rest. +Environments are composable: one environment can import others, inheriting and overriding their values. This enables organizing configuration hierarchically to match team boundaries and security requirements. -## The ESC Approach +### Sources -Pulumi ESC takes a distinct approach to managing secrets and configuration that is different from other secret managers. ESC emphasizes flexibility and an open-ecosystem approach to integrations and is specifically designed for managing secrets and configurations across complex multi-cloud environments. Whether used in conjunction with [Pulumi IaC](/docs/iac/) or as a standalone tool, ESC helps streamline operations, reduce duplication, and enhance security for teams across a wide range of use cases. +ESC pulls configuration and secrets from multiple sources through an extensible provider system: -### Centralized management, composability, and reusability +- **Static values** - Key-value pairs defined directly in the environment YAML +- **Dynamic providers** - Plugins that generate or retrieve values at evaluation time: + - OIDC providers generate short-lived cloud credentials (AWS, Azure, GCP, Vault) + - Secret providers retrieve values from external systems (AWS Secrets Manager, Azure Key Vault, 1Password) + - Login providers authenticate with cloud services -Pulumi ESC aggregates secrets and configuration from different sources into *environments*. These environments can be composed from other environments, allowing for flexible organization and reuse without duplication. +Dynamic providers execute when an environment is opened, not when it's defined. This ensures credentials and secrets are fresh and never stored. -Pulumi ESC provides fine-grained **Role-Based Access Control (RBAC)**, ensuring that only authorized users and teams can access specific environments and retrieve secrets. Audit logs track who accessed or changed the configurations, enhancing security and accountability. +### Targets + +ESC outputs configuration and secrets to multiple targets: + +- **Environment variables** - Inject secrets into processes via the `esc run` command +- **Configuration APIs** - Access values programmatically through SDKs (TypeScript, Python, Go) +- **Pulumi IaC** - Reference environments in `Pulumi..yaml` files +- **CLI output** - View values with `esc env open` or `esc env get` +- **Kubernetes** - Sync secrets to Kubernetes clusters via the ESC operator +- **Other tools** - Integrate with Terraform, Docker, and developer tools + +The same environment can output to multiple targets simultaneously, centralizing secrets management across different tools. + +### Management + +Environments are centrally managed in Pulumi Cloud with: + +- **Role-Based Access Control (RBAC)** - Control who can read, write, or delete environments +- **Audit logs** - Track all access and modifications to environments +- **Versioning** - Every change creates a new immutable version +- **Tagging** - Label versions for rollback or staged deployments +- **Encryption** - All secrets are encrypted at rest and in transit +- **Customer-managed keys** - Optionally encrypt with your own keys + +## Environment composition + +Environments support composition through imports, allowing you to build complex configurations from reusable pieces. Consider this example: {{< figure src="team_environments.png" caption="Figure: Composable ESC environments facilitate team-based organization.">}} -Pulumi ESC environments can be structured to reflect an organization’s team structure, security boundaries, or deployment targets. The above diagram shows an example of how a customer might organize and compose different security environments. +An organization might structure environments by team and security boundaries: + +- **Central platform team** - Owns common configuration like OIDC settings and feature flags +- **Billing service team** - Manages payment processor secrets +- **Communications team** - Manages secrets for mailing and texting services + +Each team's environment can be independently permissioned and versioned. Application environments import these base environments and add application-specific configuration. When environments import others, values are merged using JSON Merge Patch semantics—later values override earlier ones. + +This structure: + +- Reduces duplication by sharing common configuration +- Enforces security boundaries through separate permissions per environment +- Allows teams to update their environments without affecting others +- Enables complex applications to compose from multiple security contexts + +## Static vs. dynamic values + +ESC supports both static and dynamic values in the same environment: + +**Static values** are defined directly in the YAML and evaluated once: -Imagine a hypothetical development organization comprised of a few teams: +```yaml +values: + region: us-west-2 + apiEndpoint: https://api.example.com +``` -* The *billing service* team, that manages secrets/config for the payment processor -* The *communications* team, that manages secrets/config for the mailing service and texting service. -* The *central platform* team, that owns most common config, including OIDC config and the keys/config for the feature flag system. +**Dynamic values** are generated or retrieved when the environment is opened: -Permissions to these environments can be defined separately to minimize security exposure. They can be reused independently or composed into more complex application scenarios. +```yaml +values: + aws: + login: + fn::open::aws-login: + oidc: + roleArn: arn:aws:iam::123456789012:role/my-role + environmentVariables: + AWS_ACCESS_KEY_ID: ${aws.login.accessKeyId} +``` -### Dynamic vs static configurations +Dynamic providers execute during evaluation, generating fresh credentials or retrieving current values. This ensures credentials are short-lived and secrets are never stale. -Pulumi ESC supports both **static** configurations (e.g. simple key-value pairs) and **dynamic** configurations (values retrieved from third-party providers) in the same environment. This allows teams to mix-and-match the type of configuration they need. +## Configuration as code -Pulumi ESC also supports **dynamic secret providers**, such as AWS OIDC, Azure KeyVault, GCP Secrets Manager, and more. This allows teams to pull short-lived credentials or other secrets dynamically from external sources. +ESC environments are defined as YAML documents that can be: -More detail on dynamic secret providers is available in [Adding OIDC and secrets providers](/docs/esc/environments/working-with-environments/#using-secrets-providers-and-oidc). The [providers list](/docs/esc/integrations/) details the currently supported integrations. +- Edited directly in the Pulumi Cloud console +- Modified via the `esc` CLI +- Managed programmatically through SDKs (TypeScript, Python, Go) +- Automated in CI/CD pipelines via the API -### Configuration-as-Code, automation, and integration everywhere +Environments support: -Like our other products, Pulumi ESC uses an "as-code" approach to configuration and secrets. ESC environments can be composed, managed, and accessed using code written in TypeScript, JavaScript, Go, Python, or YAML. The `esc` CLI and our full-featured API allows for scripted use in automated environments like CI/CD. This reduces copy/paste style duplication of credentials and allows for management from a single source of truth. ESC is already deeply integrated into Pulumi IaC and Pulumi Cloud, and provides a number of third-party product integrations both as secrets providers and consumers. +- **Interpolation** - Reference other values with `${path.to.value}` syntax +- **Functions** - Transform values with built-in functions (`fn::secret`, `fn::toJSON`) +- **Type safety** - Values maintain their types (strings, numbers, objects, arrays) -## Learn More +## Learn more -* [How Pulumi ESC Works](/docs/esc/concepts/how-esc-works) -* The [ESC providers](/docs/esc/integrations/) list -* [Environments Overview](/docs/esc/environments/) +- [How Pulumi ESC works](/docs/esc/concepts/how-esc-works) - Architecture and evaluation model +- [Environment data model](/docs/esc/concepts/environment-data-model) - Structure and hierarchy +- [Composition and imports](/docs/esc/concepts/composition-and-imports) - How environments merge +- [Provider architecture](/docs/esc/concepts/provider-architecture) - Dynamic providers and OIDC +- [Security model](/docs/esc/concepts/security-model) - Encryption and threat model +- [ESC providers](/docs/esc/integrations/) - Full list of integrations +- [Environments reference](/docs/esc/environments/) - Complete syntax documentation diff --git a/content/docs/esc/concepts/how-esc-works.md b/content/docs/esc/concepts/how-esc-works.md index cfe722caf592..00e804526ef3 100644 --- a/content/docs/esc/concepts/how-esc-works.md +++ b/content/docs/esc/concepts/how-esc-works.md @@ -21,6 +21,49 @@ Using configuration-as-code, these secrets and configuration values are composed {{< figure src="/docs/esc/assets/esc-octopus-diagram.png" caption="Figure: A diagram showing the architecture of Pulumi ESC.">}} +### Deployment models + +**Pulumi Cloud (managed):** + +- Secrets encrypted at rest using AES-256-GCM +- Secrets encrypted in transit using TLS 1.2+ +- Optional customer-managed encryption keys +- Global availability with automatic scaling +- Built-in audit logs and compliance features + +**Self-hosted:** + +- Deploy ESC service on your own infrastructure +- Full control over data residency and network isolation +- Requires separate license and setup +- You manage encryption keys, backups, and scaling +- See [self-hosting documentation](/docs/support/faq/secrets-config/#can-i-self-host-pulumi-esc) for details + +### Evaluation engine + +When you open an environment (via `esc env open`, Pulumi IaC, or the API), ESC's evaluation engine: + +1. **Loads the environment definition** - Retrieves the YAML document and its version +1. **Resolves imports** - Recursively loads all imported environments +1. **Merges values** - Combines environments using JSON Merge Patch semantics (later values override earlier ones) +1. **Executes providers** - Runs dynamic provider plugins (OIDC, secret retrieval) +1. **Evaluates interpolations** - Resolves all `${variable}` references +1. **Applies functions** - Processes `fn::` function calls (e.g., `fn::secret`, `fn::toJSON`) +1. **Returns evaluated environment** - Outputs the final merged and evaluated configuration + +This evaluation happens **every time** an environment is opened, ensuring dynamic credentials are fresh and secrets are current. Provider credentials and secret values are never stored permanently—they exist only in memory during evaluation. + +### Composition mechanics + +Environments are merged using JSON Merge Patch ([RFC 7386](https://tools.ietf.org/html/rfc7386)) semantics: + +- **Objects** are merged recursively (keys from later environments override earlier ones) +- **Arrays** are replaced entirely (not merged element-by-element) +- **Primitives** are replaced by later values +- **Null** values delete keys from earlier environments + +This predictable merge behavior allows complex composition hierarchies while maintaining clarity about which values win. + ## Secrets and configuration sources By default, Pulumi ESC stores your configuration and secrets in Pulumi Cloud. However, ESC also integrates with a variety of third-party sources through an extensible *provider* plugin model. This allows teams to use their preferred providers without needing to manually copy or paste secrets across environments. The secrets will be dynamically fetched from the third-party API and integrated into your ESC environments. @@ -31,11 +74,11 @@ By aggregating secrets from these providers, Pulumi ESC provides a unified inter Pulumi ESC integrates with many popular cloud login providers and secrets managers, including: -* [AWS OIDC](/docs/esc/integrations/dynamic-login-credentials/aws-login/) and [AWS Secrets Manager](/docs/esc/integrations/dynamic-secrets/aws-secrets/) -* [Azure OIDC](/docs/esc/integrations/dynamic-login-credentials/azure-login) and [Azure KeyVault](/docs/esc/integrations/dynamic-secrets/azure-secrets/) -* [GCP OIDC](/docs/esc/integrations/dynamic-login-credentials/gcp-login/) and [GCP Secrets Manager](/docs/esc/integrations/dynamic-secrets/gcp-secrets/) -* [HashiCorp Vault OIDC](/docs/esc/integrations/dynamic-login-credentials/vault-login/) and [Vault Secrets](/docs/esc/integrations/dynamic-secrets/vault-secrets/) -* [1Password](/docs/esc/integrations/dynamic-secrets/1password-secrets/), [Kubernetes](/docs/esc/integrations/kubernetes/), among others. +- [AWS OIDC](/docs/esc/integrations/dynamic-login-credentials/aws-login/) and [AWS Secrets Manager](/docs/esc/integrations/dynamic-secrets/aws-secrets/) +- [Azure OIDC](/docs/esc/integrations/dynamic-login-credentials/azure-login) and [Azure KeyVault](/docs/esc/integrations/dynamic-secrets/azure-secrets/) +- [GCP OIDC](/docs/esc/integrations/dynamic-login-credentials/gcp-login/) and [GCP Secrets Manager](/docs/esc/integrations/dynamic-secrets/gcp-secrets/) +- [HashiCorp Vault OIDC](/docs/esc/integrations/dynamic-login-credentials/vault-login/) and [Vault Secrets](/docs/esc/integrations/dynamic-secrets/vault-secrets/) +- [1Password](/docs/esc/integrations/dynamic-secrets/1password-secrets/), [Kubernetes](/docs/esc/integrations/kubernetes/), among others. Teams can setup [OpenID Connect integration](/docs/esc/environments/configuring-oidc/) in their cloud providers to allow ESC environments to pull short-lived credentials via **OIDC** for secure, time-limited access to secrets. These credentials can then be used in both [Pulumi IaC](/docs/pulumi-cloud/esc/environments/#using-with-pulumi-iac) workflows and [external CLIs](/docs/pulumi-cloud/esc/environments/#running-third-party-commands-using-pulumi-esc-secrets-and-config) like `aws`, `kubectl`, etc. @@ -97,9 +140,9 @@ Every change to an ESC environment definition is recorded as a unique numeric ve ESC environments can be composed from other environments allowing for modularity and inheritance -- concepts usually only found in code: -* **Inheritance**: One environment can inherit values from another environment. -* **Overrides**: Values in child environments can override inherited values. -* **Nesting**: Environments can be arbitrarily nested for maximum flexibility, allowing complex hierarchies to be built out. +- **Inheritance**: One environment can inherit values from another environment. +- **Overrides**: Values in child environments can override inherited values. +- **Nesting**: Environments can be arbitrarily nested for maximum flexibility, allowing complex hierarchies to be built out. ## Managing access: RBAC and auditing diff --git a/content/docs/esc/environments/_index.md b/content/docs/esc/environments/_index.md index 2546b7810fd2..7c19eb04987c 100644 --- a/content/docs/esc/environments/_index.md +++ b/content/docs/esc/environments/_index.md @@ -7,7 +7,7 @@ menu: esc: parent: esc-home identifier: esc-environments - weight: 4 + weight: 5 --- Pulumi ESC (Environments, Secrets, and Configuration) lets you define collections of configuration settings and secrets called _environments_ and use them in any application or service. Environments are YAML documents composed of static key-value pairs, programmatic expressions, dynamically retrieved values from supported providers including all major clouds through OpenID Connect (OIDC), and other Pulumi ESC environments. diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index d7621b1d2fe7..97dcc78fae02 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -1,48 +1,137 @@ --- -title: Get started +title: Get Started title_tag: Get Started with Pulumi ESC (Environments, Secrets, and Configuration) -h1: Get Started with Pulumi ESC (Environments, Secrets, and Configuration) -meta_desc: Learn how to manage secrets and hierarchical configuration with Pulumi ESC. +h1: Get Started with Pulumi ESC +meta_desc: Get started with Pulumi ESC in 5 minutes. Create an environment, store a secret, and retrieve it programmatically. +weight: 1 menu: esc: parent: esc-home identifier: esc-get-started - weight: 2 aliases: - /docs/pulumi-cloud/esc/get-started/ + - /docs/esc/get-started/begin/ + - /docs/esc/get-started/create-environment/ + - /docs/pulumi-cloud/esc/get-started/begin/ + - /docs/pulumi-cloud/esc/get-started/create-environment/ --- -In a typical application or infrastructure development workflow, there's often a need to maintain multiple environments such as development, staging, and production. Each of these environments might have its own set of configuration values: API endpoints, database connection strings, third-party secrets, and more. +Pulumi ESC (Environments, Secrets, and Configuration) is a centralized secrets and configuration management service. In this quick start, you'll create your first environment, store a secret, and retrieve it programmatically—all in about 5 minutes. -Hardcoding these values or keeping them inside source code is a security risk and makes managing configurations complex. +## Prerequisites -[Pulumi ESC (Environments, Secrets and Configuration)](/docs/esc/) offers a centralized store to manage configuration data, plain-text data, and secrets. +1. **Create a Pulumi account** at [app.pulumi.com](https://app.pulumi.com) +1. **Install the ESC CLI** -In this tutorial, you will learn how to use Pulumi ESC to manage configuration and secrets. +{{< chooser os "macos,windows,linux" >}} -Before you begin, you can watch the following video which provides a high level overview of how Pulumi ESC works: +{{% choosable os macos %}} -
- +```bash +brew update && brew install pulumi/tap/esc +``` + +{{% /choosable %}} + +{{% choosable os linux %}} + +```bash +curl -fsSL https://get.pulumi.com/esc/install.sh | sh +``` + +{{% /choosable %}} + +{{% choosable os windows %}} + +
+
+

Windows binary download

+

+amd64 +

+
+ +{{% /choosable %}} + +{{% /chooser %}} + +See the [ESC installation docs](/docs/install/esc/) for more options. + +## Create your first environment + +1. **Log in** to the ESC CLI: + +```bash +esc login +``` + +You'll be prompted to log in via your browser or with an access token. + +1. **Create an environment**: + +```bash +esc env init my-project/dev +``` + +This creates a new environment named `dev` in a project called `my-project`. Environment names must be unique within a project. + +1. **Verify** your environment was created: + +```bash +esc env ls +``` + +You should see `/my-project/dev` in the list. + +## Store a secret + +Add a secret to your environment using the Pulumi Cloud console: + +1. Navigate to [Pulumi Cloud](https://app.pulumi.com) and log in +1. Select **Environments** in the left navigation +1. Select your `my-project/dev` environment +1. In the YAML editor, add the following: + + ```yaml + values: + apiKey: + fn::secret: demo-secret-123 + ``` + +1. Select **Save** + +The console encrypts the secret and stores it securely. The plaintext value is replaced with encrypted ciphertext in the YAML definition. + +## Retrieve your secret + +Open your environment to retrieve all values, including secrets: + +```bash +esc env open my-project/dev +``` + +You should see output like: -## Choose your path +```json +{ + "apiKey": "demo-secret-123" +} +``` -{{% notes "info" %}} +That's it! You've created an environment, stored a secret, and retrieved it programmatically. -**Already using Pulumi IaC?** +## What's next? -If you have existing Pulumi infrastructure as code projects and want to centralize your configuration and secrets, jump directly to [Integrate with Pulumi IaC](/docs/esc/get-started/integrate-with-pulumi-iac/) to add ESC to your projects in three steps. +### Use ESC in your infrastructure code -**New to Pulumi ESC?** +Most Pulumi users integrate ESC with their IaC workflows to centralize secrets and configuration across all stacks. Learn how to reference ESC environments in your Pulumi programs: -Continue with the tutorial below to learn ESC fundamentals, starting with account setup and creating your first environment. +**→ [Integrate ESC with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** -{{% /notes %}} +### Explore other use cases -{{< get-started-stepper >}} +- **[Understand the concepts](/docs/esc/concepts/)** - Learn how ESC works under the hood +- **[Set up OIDC](/docs/esc/guides/setting-up-oidc/)** - Generate short-lived cloud credentials dynamically +- **[Pull secrets from external sources](/docs/esc/guides/external-secrets/)** - Integrate with AWS Secrets Manager, Azure Key Vault, and more +- **[Compose environments](/docs/esc/guides/importing-environments/)** - Share configuration across teams and projects diff --git a/content/docs/esc/get-started/begin.md b/content/docs/esc/get-started/begin.md deleted file mode 100644 index f7a1b5628aac..000000000000 --- a/content/docs/esc/get-started/begin.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title_tag: Before You Begin | Pulumi ESC -title: Before you begin -h1: "Pulumi ESC: Before you begin" -meta_desc: This page provides an overview on how to get started with Pulumi ESC. -weight: 2 -menu: - esc: - parent: esc-get-started - identifier: esc-get-started-begin -aliases: ---- - -Before you get started using Pulumi ESC, complete the following prerequisites to set up your environment. - -### Create a Pulumi account - -Pulumi ESC is a service of Pulumi Cloud, meaning you will need to create a Pulumi account to be able to use it. To do so, navigate to the [Pulumi Cloud console](https://app.pulumi.com) and create a new account. - -Once created, you can [optionally create an access token](/docs/administration/access-identity/access-tokens/). Doing so will provide you an alternative way to sign into the Pulumi Cloud via the CLI. The token can also be used to automate your usage of the Pulumi Cloud using the REST API. - -### Install the Pulumi ESC CLI - -{{< notes type="info" >}} -Pulumi ESC can be used with or without Pulumi IaC. This means that if you already have the [Pulumi IaC CLI](/docs/cli/) installed, you do not need to install the Pulumi ESC CLI, and you may substitute `pulumi env` anywhere you see the `esc env` command in the rest of this tutorial. -{{< /notes >}} - -Use the below option to install the Pulumi ESC CLI based on your operating system. - -{{< chooser os "macos,windows,linux" >}} - -{{% choosable os macos %}} - -```bash -$ brew update && brew install pulumi/tap/esc -``` - -{{% /choosable %}} - -{{% choosable os linux %}} - -```bash -$ curl -fsSL https://get.pulumi.com/esc/install.sh | sh -``` - -{{% /choosable %}} - -{{% choosable os windows %}} - -
-
-

Windows binary download

-

-amd64 -

-
-
- -{{% /choosable %}} - -{{% /chooser %}} - -You can explore more installation options by visiting the [ESC installation docs](/docs/install/esc/). - -### Login to the ESC CLI - -Run the following command to log into the CLI: - -```bash -esc login -``` - -You will be prompted to log in to the Pulumi Cloud using either the browser or by optionally providing an access token. - -```bash -$ esc login -Manage your Pulumi ESC environments by logging in. -Run `esc --help` for alternative login options. -Enter your access token from https://app.pulumi.com/account/tokens - or hit to log in using your browser : -Logged in to https://api.pulumi.com/ as your-pulumi-org (https://app.pulumi.com/your-pulumi-org) -``` - -### [Optional] Configure OpenID Connect (OIDC) - -Pulumi supports [OpenID Connect (OIDC) integration](/docs/esc/environments/configuring-oidc) across various services including Pulumi ESC. OIDC enables secure interactions between Pulumi and cloud providers by leveraging signed, short-lived tokens issued by the Pulumi Cloud. Use one of the following guides to configure OIDC between Pulumi ESC and your chosen cloud provider: - -- [OIDC Configuration for AWS](/docs/esc/environments/configuring-oidc/aws/) -- [OIDC Configuration for Azure](/docs/esc/environments/configuring-oidc/azure/) -- [OIDC Configuration for Google Cloud](/docs/esc/environments/configuring-oidc/gcp/) - -This is an optional step that is not required to get started with Pulumi ESC. There are some steps in this series that will require OIDC configuration to complete, but that will be indicated on the relevant pages. - -In the next section, you will start your journey with Pulumi ESC by creating a new environment. - -{{< get-started-stepper >}} diff --git a/content/docs/esc/get-started/create-environment.md b/content/docs/esc/get-started/create-environment.md deleted file mode 100644 index dd2c0250879f..000000000000 --- a/content/docs/esc/get-started/create-environment.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title_tag: Create a New Environment | Pulumi ESC -title: Create environment -h1: "Pulumi ESC: Create a New Environment" -meta_desc: This page provides an overview on how to create a new Pulumi ESC environment. -weight: 3 -menu: - esc: - parent: esc-get-started - identifier: esc-get-started-create-environment -aliases: ---- - -## Overview - -In Pulumi ESC, an environment is a collection of configuration intended to capture the configuration values needed to work with a particular environment. -Environments belong to a Project, which is a collection of related environments. - -An environment can be created one of two ways: - -- via the Pulumi Cloud console -- via the CLI - -This tutorial will walk you through how to create a new environment. - -## Create an environment - -### Create via the console - -To create an environment via the console, navigate to [Pulumi Cloud](https://app.pulumi.com) and select the **Environments** link in the left-hand menu. - -You will be directed to the Environments landing page. Select the **Create Environment** button to open the Create Environment flyout panel. Ensure the **Start from scratch** tab is selected and the **New Environment** option is chosen. Enter a project name (e.g., `my-project`) and an environment name (e.g., `dev-environment`), then select **Create Environment**. You will be directed to the environment definition page. - -![Create Environment flyout panel showing Start from scratch tab with New Environment option selected, project name field containing 'my-project', and environment name field containing 'dev-environment'](/docs/esc/assets/esc-create-environment.png) - -### Create via the CLI - -To create an environment via the CLI, use the `esc env init` command as shown below, where `` is optional and defaults to your Pulumi Cloud username. - -```bash -esc env init [/]/ -``` - -Note that environment names must be unique within a project and may only contain alphanumeric characters, hyphens, underscores, and periods. If you specify -an existing project the new environment will be created within it, otherwise a new project will be created. - -```bash -$ esc env init my-project/dev-environment -Environment created. -``` - -You can validate that your environment was created by running the `esc env ls` command which will list all of the environments that you have access to. - -```bash -$ esc env ls -myorg/my-project/dev-environment -``` - -In the next section, you will learn how to store configuration values and secrets in your environment. - -{{< get-started-stepper >}} diff --git a/content/docs/esc/get-started/store-and-retrieve-secrets.md b/content/docs/esc/get-started/store-and-retrieve-secrets.md deleted file mode 100644 index a9dd2dc30b21..000000000000 --- a/content/docs/esc/get-started/store-and-retrieve-secrets.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -title_tag: Store and Retrieve Secrets | Pulumi ESC -title: Store and retrieve secrets -h1: "Pulumi ESC: Store and Retrieve Secrets" -meta_desc: This page provides an overview on how to store and retrieve secrets in Pulumi ESC. -weight: 5 -menu: - esc: - parent: esc-get-started - identifier: esc-get-started-store-retrieve-secrets -aliases: ---- - -In an environment file, values are defined as a series of key-value pairs in YAML format. All variables will be defined under a top-level key named `values`. These values can be strings, numbers, or arrays, and they can be manually provided, dynamically generated from external sources, or referenced from other values in the file. They can also be stored in plain-text or as secrets. - -```yaml -values: - myKey1: "myValue1" - myNestedKey: - myKey2: "myValue2" - myNumber: 1 - myPassword: - fn::secret: - ciphertext: ZXN.... -``` - -You can store and retrieve values in an environment via one of the following methods: - -- the Pulumi Cloud console Document view -- the Pulumi Cloud console Table view -- the ESC CLI - -## Store environment values - -### Store via the document view - -To store values in your environment using the Document view, first select the name of the environment to open it. You will be presented with a split pane view. The left side is the YAML-based code document view, and this is where you will write the definition of your environment configuration. The right side will show a preview of your configuration in JSON format. - -![Open environment in Pulumi ESC console](/docs/esc/assets/esc-open-env.png) - -Next, delete the placeholder text in the environment file and add the following simple configuration definition in its place: - -```yaml -values: - myEnvironment: "development" - myPassword: - fn::secret: "demo-password-123" -``` - -As shown above, you can specify that a value should be stored as a secret by using the `fn::secret` function. Once you have added the configuration, select the **Save** button located at the bottom of the editor. - -{{< video title="Adding values to an environment using Document view in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-add-env-values.mp4" autoplay="true" loop="true" >}} - -The **Environment preview** pane on the right-hand side will then update to show your added configuration in JSON format. You will notice that the value of "myPassword" has been hidden from view in both the definition and preview panes. - -### Store via the table view - -To store values in your environment using the Table view, first select the name of the environment to open it. From the **Editor** menu, select the **Table view** button to switch the editor from the document YAML view to the table view. - -{{< video title="Switching to Table view in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-open-env-table-view.mp4" autoplay="true" loop="true" >}} - -Next, under the **Configuration** section, you will see fields labeled **Path** and **Value**. You will define your configuration values using these fields. In the **Path** field, type in `myEnvironment`, and in the **Value** field, type in `development`. Then select **Done** and **Save**. - -![Adding values to the environment in the Pulumi ESC console](/docs/esc/assets/esc-add-env-values.png) - -Next, select the **+Secret/config** button to create a new configuration. This time, you will create a configuration that will be stored as a secret. To do so, enter `myPassword` for the value of **Path** and `demo-password-123` for the value of **Value**. Select the **secret** option from the drop-down to indicate that this configuration will be stored as a secret, then select **Done** and **Save**. - -![Adding values to the environment in the Pulumi ESC console](/docs/esc/assets/esc-add-secret-value.png) - -You will notice that the value of `myPassword` is hidden from view after saving. - -### Store via the CLI - -To store values or update an existing value via the CLI, use the `esc env set` command as shown below, where `` is optional and defaults to your Pulumi Cloud username: - -```bash -esc env set [/]/ -``` - -To demonstrate how this works, add the following simple configuration definition to your environment using the following command, making sure to replace the value of `my-project/dev-environment` with the name of your own environment: - -```bash -esc env set my-project/dev-environment myEnvironment development -esc env set my-project/dev-environment myPassword demo-password-123 --secret -``` - -As shown above, you can specify that a value should be stored as a secret by using the `--secret` flag. - -Alternatively, you can directly [edit your environment file with a code editor](/docs/pulumi-cloud/esc/environments/#with-the-pulumi-esc-cli) using the following command, making sure to replace `/` with the identifier of your own environment (e.g. `my-project/dev-environment`): - -```bash -esc env edit / -``` - -Using this method enables you to add your configuration values in the same way that you would [via the document view](/docs/esc/get-started/store-and-retrieve-secrets/#store-via-the-document-view). - -## Retrieve environment values - -### Retrieve via the Document view - -To retrieve values using the Document view, select the **Open** button. This will return any statically defined plain-text values and definitions. - -![Clicking the open button in the Pulumi ESC console](/docs/esc/assets/esc-open-environment.png) - -As shown above, it does not return the value of secrets defined, nor does it resolve values that are dynamically generated from a provider. To view these values, you will need to select the **Show secrets** slider. - -![Clicking the show secrets slider in the Pulumi ESC console](/docs/esc/assets/esc-show-secret-document-view.png) - -### Retrieve via the table view - -Non-secret configuration values remain visible in the Table view after their creation, but secret values are automatically hidden. To reveal the value of a secret using the Table view, select the small eye icon. - -{{< video title="Revealing secrets using the show secrets toggle in the Pulumi ESC console" src="https://www.pulumi.com/uploads/esc-show-secret-table-view.mp4" autoplay="true" loop="true" >}} - -### Retrieve via the CLI - -The CLI has a built-in `get` command that enables you to retrieve a single value from your environment. The format of the full command looks like the following: - -```bash -esc env get [/]/ -``` - -To retrieve the value of the `myEnvironment` variable you created earlier, the command to do so would look like the following, making sure to replace the value of `my-project/dev-environment` with the identifier of your own environment: - -```bash -esc env get my-project/dev-environment myEnvironment -``` - -Running this command should return the following response: - -```bash -$ esc env get my-project/dev-environment myEnvironment - - Value - - "development" - - Definition - - development - - Defined at - - • my-project/dev-environment:2:8 -``` - -It is also possible to retrieve all values in an environment. To do so, run the `esc env get` command without specifying a value as shown below: - -```bash -esc env get my-project/dev-environment -``` - -Running this command should return the following response: - -```bash -$ esc env get my-project/dev-environment - - Value - - { - "myEnvironment": "development", - "myPassword": "[secret]" - } - - Definition - - values: - myEnvironment: "development" - myPassword: - fn::secret: - ciphertext: ZXNjeAA.... - -``` - -The `esc env get` command only returns statically defined plain-text values and definitions. This means that it does not return the value of any defined secrets, nor does it resolve values that are dynamically generated from a provider. To view these values, you must run the `esc env open` command as shown below. This will open the environment and resolve any secrets or dynamically retrieved values: - -```bash -$ esc env open my-project/dev-environment - -{ - "myEnvironment": "development", - "myPassword": "demo-password-123" -} - -``` - -In the next section, you will learn how to import configuration values from other environments. - -{{< get-started-stepper >}} diff --git a/content/docs/esc/guides/_index.md b/content/docs/esc/guides/_index.md new file mode 100644 index 000000000000..1a09482f77d1 --- /dev/null +++ b/content/docs/esc/guides/_index.md @@ -0,0 +1,34 @@ +--- +title: Guides +title_tag: Pulumi ESC Guides +h1: Pulumi ESC Guides +meta_desc: Step-by-step guides for common Pulumi ESC tasks including IaC integration, OIDC setup, and secrets management. +menu: + esc: + parent: esc-home + identifier: esc-guides + weight: 4 +--- + +These guides walk you through common Pulumi ESC tasks. Each guide is self-contained and provides step-by-step instructions for accomplishing a specific goal. + +## Getting started guides + +- **[Integrate with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** - Use ESC environments in your Pulumi infrastructure code +- **[Managing secrets](/docs/esc/guides/managing-secrets/)** - Store, retrieve, and organize secrets in ESC environments +- **[Running commands with esc run](/docs/esc/guides/running-commands-with-esc/)** - Inject secrets into any command or script + +## Advanced configuration + +- **[Importing environments](/docs/esc/guides/importing-environments/)** - Compose environments and share configuration across teams +- **[Setting up OIDC](/docs/esc/guides/setting-up-oidc/)** - Generate short-lived cloud credentials dynamically +- **[Integrating external secrets](/docs/esc/guides/external-secrets/)** - Pull secrets from AWS Secrets Manager, Azure Key Vault, and more + +## Reference documentation + +For comprehensive syntax and feature documentation, see: + +- [Environments reference](/docs/esc/environments/) - Complete environment syntax and features +- [Integrations](/docs/esc/integrations/) - Provider-specific documentation +- [CLI reference](/docs/esc/cli/) - Command-line tool documentation +- [API and SDKs](/docs/esc/development/) - Programmatic access to ESC diff --git a/content/docs/esc/get-started/retrieve-external-secrets.md b/content/docs/esc/guides/external-secrets.md similarity index 74% rename from content/docs/esc/get-started/retrieve-external-secrets.md rename to content/docs/esc/guides/external-secrets.md index 0d4387320d64..20f8c4ee4a62 100644 --- a/content/docs/esc/get-started/retrieve-external-secrets.md +++ b/content/docs/esc/guides/external-secrets.md @@ -1,14 +1,16 @@ --- -title_tag: Retrieve External Secrets | Pulumi ESC -title: Retrieve secrets from external sources -h1: "Pulumi ESC: Retrieve Secrets from External Sources" -meta_desc: This page provides an overview on how to retrieve secrets from external sources. -weight: 8 +title_tag: Integrating External Secrets | Pulumi ESC +title: Integrating External Secrets +h1: Integrating External Secrets with Pulumi ESC +meta_desc: Learn how to integrate Pulumi ESC with external secret providers like AWS Secrets Manager, Azure Key Vault, and Google Cloud Secret Manager. menu: esc: - parent: esc-get-started - identifier: esc-get-started-retrieve-external-secrets + parent: esc-guides + identifier: esc-guides-external-secrets + weight: 6 aliases: + - /docs/esc/get-started/retrieve-external-secrets/ + - /docs/pulumi-cloud/esc/get-started/retrieve-external-secrets/ --- ## Overview @@ -23,7 +25,7 @@ This enables you to centralize both new and existing secrets and configurations ## Import external secrets -If you have not done so already, make sure you have [configured OIDC connectivity](/docs/esc/get-started/begin/#configure-openid-connect-oidc) between Pulumi and a supported provider listed below. During the configuration, you will need to make sure that you add the permissions necessary to interact with secrets in your chosen provider. +If you have not done so already, make sure you have [configured OIDC connectivity](/docs/esc/guides/setting-up-oidc/) between Pulumi and a supported provider listed below. During the configuration, you will need to make sure that you add the permissions necessary to interact with secrets in your chosen provider. {{% chooser cloud "aws,azure,gcp" / %}} @@ -76,14 +78,14 @@ values: secretId: my-app-secret ``` -You can validate this configuration by [opening the environment via the ESC console](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-via-the-console), clicking the **Open** button and then clicking the **Show secrets** slider. +You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#retrieve-via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. -Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. +Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. ```bash $ esc env open pulumi/demos/aws-secrets-example @@ -173,14 +175,14 @@ values: name: my-app-secret ``` -You can validate this configuration by [opening the environment via the ESC console](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-via-the-console), clicking the **Open** button and then clicking the **Show secrets** slider. +You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#retrieve-via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. -Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. +Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. ```bash $ esc env open pulumi/demos/azure-secrets-example @@ -269,14 +271,14 @@ values: name: my-app-secret ``` -You can validate this configuration by [opening the environment via the ESC console](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-via-the-console), clicking the **Open** button and then clicking the **Show secrets** slider. +You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#retrieve-via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. -Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. +Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. ```bash $ esc env open pulumi/demos/gcp-secrets-example @@ -315,4 +317,16 @@ values: {{% /choosable %}} -{{< get-started-stepper >}} +## Next steps + +- [Integrate with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/) - Use external secrets in your infrastructure code +- [Setting up OIDC](/docs/esc/guides/setting-up-oidc/) - Learn more about configuring OIDC for dynamic credentials +- [Managing secrets](/docs/esc/guides/managing-secrets/) - Understand how to organize and retrieve secrets + +### Provider-specific documentation + +For complete documentation on each secrets provider: + +- [AWS Secrets Manager integration](/docs/esc/integrations/dynamic-secrets/aws-secrets/) +- [Azure Key Vault integration](/docs/esc/integrations/dynamic-secrets/azure-secrets/) +- [Google Cloud Secret Manager integration](/docs/esc/integrations/dynamic-secrets/gcp-secrets/) diff --git a/content/docs/esc/get-started/import-environments.md b/content/docs/esc/guides/importing-environments.md similarity index 79% rename from content/docs/esc/get-started/import-environments.md rename to content/docs/esc/guides/importing-environments.md index d196bed8b7ae..ed1952497875 100644 --- a/content/docs/esc/get-started/import-environments.md +++ b/content/docs/esc/guides/importing-environments.md @@ -1,14 +1,16 @@ --- title_tag: Import Environments | Pulumi ESC -title: Import environments -h1: "Pulumi ESC: Import Environments" -meta_desc: This page provides an overview on how to import environments in Pulumi ESC. -weight: 6 +title: Importing Environments +h1: Importing Environments +meta_desc: Learn how to import and compose Pulumi ESC environments to share configuration across teams and projects. menu: esc: - parent: esc-get-started - identifier: esc-get-started-import-environments + parent: esc-guides + identifier: esc-guides-importing-environments + weight: 5 aliases: + - /docs/esc/get-started/import-environments/ + - /docs/pulumi-cloud/esc/get-started/import-environments/ --- ## Overview @@ -21,7 +23,7 @@ There may be scenarios where the value you need to retrieve is stored in a diffe In the development environment, you might be integrating with the sandbox or development endpoint of the third-party service, while in the testing environment, you might be integrating with the production endpoint. Both endpoints may share the same base URL. -![Image showing same base URL and different endpoints](/docs/esc/get-started/esc-base-url.png) +![Image showing same base URL and different endpoints](/docs/esc/assets/esc-base-url.png) Since this base URL would be the same across environments, it would be more efficient to define it once in one place rather than multiple times across multiple environment files. @@ -72,7 +74,7 @@ You should now see `"ENDPOINT_URL": "https://wordsapiv1.p.rapidapi.com/"` in the ![Importing the global config environment in the Pulumi Console](/docs/esc/assets/esc-import-environments2.png) {{% notes type="info" %}} -You can test this out by retrieving the imported value via the console or the CLI. Refer to the [Store and Retrieve Secrets guide](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-environment-values) for the steps on how to do this. +You can test this out by retrieving the imported value via the console or the CLI. See [Managing secrets](/docs/esc/guides/managing-secrets/#retrieving-secrets) for details on retrieving values. {{% /notes %}} ### Import via the Table view @@ -81,12 +83,14 @@ Alternatively, you can import environments using the Table view of the Pulumi co ![Importing the global config environment in the Pulumi Console](/docs/esc/assets/esc-import-pulumi-console.png) -To view the imported values, you will need to [open your environment](/docs/esc/get-started/store-and-retrieve-secrets/#retrieve-environment-values). +To view the imported values, you will need to [open your environment](/docs/esc/guides/managing-secrets/#retrieving-secrets). {{% notes type="info" %}} You can import multiple environments and reorder them. The order of the imported environments is important because if you have two environments that have the same name for a key/path, then the last imported environment will override the value of that key/paths for any environments that are imported before it. This behavior can be useful for scenarios where you need to intentionally override the value of a particular key/path. {{% /notes %}} -In the next section, you will learn how to run local commands without manually configuring local secrets. +## Next steps -{{< get-started-stepper >}} +- [Managing secrets](/docs/esc/guides/managing-secrets/) - Learn more about storing and retrieving values +- [Integrate with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/) - Use composed environments in your infrastructure code +- [Composition and imports reference](/docs/esc/environments/imports/) - Complete documentation on import behavior and JSON Merge Patch semantics diff --git a/content/docs/esc/get-started/integrate-with-pulumi-iac.md b/content/docs/esc/guides/integrate-with-pulumi-iac.md similarity index 53% rename from content/docs/esc/get-started/integrate-with-pulumi-iac.md rename to content/docs/esc/guides/integrate-with-pulumi-iac.md index f5a54e04698d..abd0b85b01db 100644 --- a/content/docs/esc/get-started/integrate-with-pulumi-iac.md +++ b/content/docs/esc/guides/integrate-with-pulumi-iac.md @@ -1,21 +1,28 @@ --- -title_tag: Integrate with Pulumi IaC | Pulumi ESC +title_tag: Integrate ESC with Pulumi IaC title: Integrate with Pulumi IaC -h1: "Pulumi ESC: Integrate with Pulumi IaC" -meta_desc: This page provides an overview on how to use Pulumi ESC with Pulumi IaC. -weight: 4 +h1: Integrate ESC with Pulumi IaC +meta_desc: Learn how to use Pulumi ESC environments in your Pulumi infrastructure as code projects to centralize secrets and configuration. menu: esc: - parent: esc-get-started - identifier: esc-get-started-integrate-with-pulumi-iac + parent: esc-guides + identifier: esc-guides-integrate-pulumi-iac + weight: 1 aliases: + - /docs/esc/get-started/integrate-with-pulumi-iac/ + - /docs/pulumi-cloud/esc/get-started/integrate-with-pulumi-iac/ --- -## Overview +This guide shows you how to integrate Pulumi ESC with your Pulumi IaC projects to centralize configuration and secrets across all your stacks. -Add Pulumi ESC to your existing Pulumi IaC projects in three steps to centrally manage configuration and secrets across all your stacks. This integration works seamlessly everywhere Pulumi runs, including locally, in CI/CD, Pulumi Deployments, and GitHub Actions. +## Prerequisites -## Add ESC to your Pulumi project +- [Pulumi CLI](/docs/install/) installed +- [Pulumi account](https://app.pulumi.com/signup) created +- An existing Pulumi project (or create one with `pulumi new`) +- An ESC environment with configuration values (see [Managing secrets](/docs/esc/guides/managing-secrets/) to create one) + +## Add ESC to your Pulumi stack ### Step 1: Reference your ESC environment @@ -33,7 +40,7 @@ environment: - my-org/aws-prod ``` -You can also reference multiple environments, which will be merged in order: +You can also reference multiple environments, which will be merged in order (later values override earlier ones): ```yaml environment: @@ -43,7 +50,22 @@ environment: ### Step 2: Define configuration in your ESC environment -In your ESC environment file, use the `pulumiConfig` block to expose values to Pulumi IaC: +ESC environments are YAML documents typically managed in Pulumi Cloud. To edit your environment: + +**Via the Pulumi Cloud console:** + +1. Navigate to [Pulumi Cloud](https://app.pulumi.com) +1. Select **Environments** in the left navigation +1. Select your environment to open the editor +1. Add configuration in the YAML editor + +**Via the CLI:** + +```bash +esc env edit / +``` + +In your ESC environment, use the `pulumiConfig` block to expose values to Pulumi IaC: ```yaml values: @@ -63,11 +85,11 @@ Use Pulumi's standard Configuration API to access these values in your infrastru That's it! Your Pulumi program now retrieves configuration and secrets from ESC. Run `pulumi preview` or `pulumi up` to see it in action. -## Practical examples +## Common patterns -### Centralizing cloud credentials +### Using dynamic cloud credentials -To share AWS OIDC credentials across multiple stacks, configure your ESC environment like this: +To share AWS OIDC credentials across multiple stacks, configure your ESC environment to generate short-lived credentials: ```yaml values: @@ -85,11 +107,13 @@ values: AWS_SESSION_TOKEN: ${aws.login.sessionToken} ``` -Learn more about [dynamic cloud credentials](/docs/esc/get-started/use-short-term-credentials/). +This pattern works everywhere Pulumi runs: locally, in CI/CD, Pulumi Deployments, and GitHub Actions. + +Learn more in [Setting up OIDC](/docs/esc/guides/setting-up-oidc/). ### Managing API keys and secrets -Store third-party API keys centrally and reference them across projects: +Pull third-party API keys from external secret stores: ```yaml values: @@ -102,7 +126,7 @@ values: secretId: https://my-keyvault.vault.azure.net/secrets/datadog-api-key ``` -Learn more about [retrieving secrets from external sources](/docs/esc/get-started/retrieve-external-secrets/). +Learn more in [Integrating external secrets](/docs/esc/guides/external-secrets/). ### Environment-specific configuration @@ -124,16 +148,11 @@ values: myApp:replicas: 3 # override for production ``` -Learn more about [importing and composing environments](/docs/esc/get-started/import-environments/). +Learn more in [Importing environments](/docs/esc/guides/importing-environments/). ## Next steps -Now that you've integrated ESC with your Pulumi IaC project, explore more ESC features: - -- [Store and retrieve secrets](/docs/esc/get-started/store-and-retrieve-secrets/) - Learn how to manage secrets in ESC -- [Import environments](/docs/esc/get-started/import-environments/) - Compose environments for team boundaries -- [Dynamic cloud credentials](/docs/esc/get-started/use-short-term-credentials/) - Generate short-lived OIDC credentials -- [External secret providers](/docs/esc/get-started/retrieve-external-secrets/) - Pull secrets from AWS, Azure, GCP, and more +- [Setting up OIDC](/docs/esc/guides/setting-up-oidc/) - Generate dynamic cloud credentials +- [Integrating external secrets](/docs/esc/guides/external-secrets/) - Pull from AWS, Azure, GCP vaults +- [Importing environments](/docs/esc/guides/importing-environments/) - Compose configuration hierarchies - [ESC + Pulumi IaC reference](/docs/esc/integrations/infrastructure/pulumi-iac/) - Complete integration documentation - -{{< get-started-stepper >}} diff --git a/content/docs/esc/guides/managing-secrets.md b/content/docs/esc/guides/managing-secrets.md new file mode 100644 index 000000000000..72b03bc7a418 --- /dev/null +++ b/content/docs/esc/guides/managing-secrets.md @@ -0,0 +1,194 @@ +--- +title_tag: Managing Secrets in Pulumi ESC +title: Managing Secrets +h1: Managing Secrets in Pulumi ESC +meta_desc: Learn how to store, retrieve, and organize secrets in Pulumi ESC environments using the CLI and Pulumi Cloud console. +menu: + esc: + parent: esc-guides + identifier: esc-guides-managing-secrets + weight: 2 +aliases: + - /docs/esc/get-started/store-and-retrieve-secrets/ + - /docs/pulumi-cloud/esc/get-started/store-and-retrieve-secrets/ +--- + +This guide shows you how to store and retrieve secrets in Pulumi ESC environments. Secrets are encrypted values that ESC stores securely and hides from view by default. + +## Prerequisites + +- [ESC CLI](/docs/install/esc/) installed +- [Pulumi account](https://app.pulumi.com/signup) created +- An ESC environment (create one with `esc env init //`) + +## Understanding ESC values + +ESC environments store configuration as key-value pairs in YAML format. All values are defined under a top-level `values` key: + +```yaml +values: + apiEndpoint: https://api.example.com + region: us-west-2 + apiKey: + fn::secret: my-secret-value +``` + +Values can be: + +- **Plain text** - Regular configuration values (region, endpoint URLs) +- **Secrets** - Encrypted values marked with `fn::secret` +- **Structured data** - Objects and arrays +- **Dynamic values** - Generated from providers (covered in other guides) + +## Storing secrets + +### Via the CLI + +Add a secret to your environment using the `--secret` flag: + +```bash +esc env set // apiKey my-secret-value --secret +``` + +For example: + +```bash +esc env set my-org/my-project/dev apiKey demo-secret-123 --secret +``` + +This encrypts the value before storing it. + +### Via the Pulumi Cloud console + +1. Navigate to [Pulumi Cloud](https://app.pulumi.com) +1. Select **Environments** in the left navigation +1. Select your environment +1. In the editor, add your secret using the `fn::secret` function: + +```yaml +values: + apiKey: + fn::secret: my-secret-value +``` + +1. Select **Save** + +The console will encrypt the secret and replace the plaintext value with a ciphertext reference: + +```yaml +values: + apiKey: + fn::secret: + ciphertext: ZXNjeAA... +``` + +## Retrieving secrets + +### Via the CLI + +Open your environment to retrieve all values, including secrets: + +```bash +esc env open // +``` + +This returns all values in JSON format with secrets revealed: + +```json +{ + "apiKey": "my-secret-value", + "region": "us-west-2" +} +``` + +To retrieve a single value: + +```bash +esc env get // apiKey +``` + +### Via the Pulumi Cloud console + +1. Select your environment in Pulumi Cloud +1. Select **Open** to evaluate the environment +1. Toggle **Show secrets** to reveal encrypted values + +## Organizing secrets + +### Nested structure + +Group related secrets using nested keys: + +```yaml +values: + database: + host: db.example.com + password: + fn::secret: db-password-123 + port: 5432 + api: + key: + fn::secret: api-key-456 + endpoint: https://api.example.com +``` + +Access nested values with dot notation: + +```bash +esc env get my-org/my-project/dev database.password +``` + +### Multiple environments + +Organize secrets by environment (dev, staging, production) using separate ESC environments: + +- `my-org/my-project/dev` - Development secrets +- `my-org/my-project/staging` - Staging secrets +- `my-org/my-project/prod` - Production secrets + +Each environment can have different RBAC permissions, ensuring production secrets are only accessible to authorized users. + +## Best practices + +### Use secrets for sensitive data + +Mark these values as secrets: + +- API keys and tokens +- Database passwords +- Private keys and certificates +- OAuth client secrets + +### Use plain text for non-sensitive data + +These can be plain text: + +- Region names +- Public endpoints +- Feature flags +- Port numbers + +### Rotate secrets regularly + +Update secrets by setting new values: + +```bash +esc env set my-org/my-project/prod apiKey new-secret-value --secret +``` + +ESC versions every change, allowing you to roll back if needed. + +### Control access with RBAC + +Use [Role-Based Access Control](/docs/esc/environments/access-control/) to limit who can read or write secrets: + +- Grant teams read-only access to production secrets +- Allow developers full access to development secrets +- Use service accounts for CI/CD access + +## Next steps + +- [Integrate with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/) - Use secrets in your infrastructure code +- [Integrating external secrets](/docs/esc/guides/external-secrets/) - Pull secrets from AWS, Azure, GCP vaults +- [Running commands with esc run](/docs/esc/guides/running-commands-with-esc/) - Inject secrets into any command +- [Access control reference](/docs/esc/environments/access-control/) - Complete RBAC documentation diff --git a/content/docs/esc/guides/running-commands-with-esc.md b/content/docs/esc/guides/running-commands-with-esc.md new file mode 100644 index 000000000000..fe4f3d022386 --- /dev/null +++ b/content/docs/esc/guides/running-commands-with-esc.md @@ -0,0 +1,225 @@ +--- +title_tag: Running Commands with ESC +title: Running Commands with esc run +h1: Running Commands with esc run +meta_desc: Learn how to use esc run to inject secrets and configuration from Pulumi ESC into any command or script. +menu: + esc: + parent: esc-guides + identifier: esc-guides-running-commands + weight: 3 +--- + +This guide shows you how to use `esc run` to inject secrets and configuration from ESC environments into any command or script as environment variables. + +## Prerequisites + +- [ESC CLI](/docs/install/esc/) installed +- [Pulumi account](https://app.pulumi.com/signup) created +- An ESC environment with values (see [Managing secrets](/docs/esc/guides/managing-secrets/)) + +## Basic usage + +The `esc run` command opens an ESC environment, exports values as environment variables, and runs a command with those variables: + +```bash +esc run // -- +``` + +For example, if your environment contains: + +```yaml +values: + environmentVariables: + DATABASE_URL: postgres://localhost/mydb + API_KEY: + fn::secret: my-api-key-123 +``` + +Run a script with these variables: + +```bash +esc run my-org/my-project/dev -- node app.js +``` + +The `app.js` script will have access to `DATABASE_URL` and `API_KEY` as environment variables. + +## Using the environmentVariables block + +ESC exports values to environment variables using the `environmentVariables` block: + +```yaml +values: + database: + host: db.example.com + password: + fn::secret: db-password-123 + + environmentVariables: + DB_HOST: ${database.host} + DB_PASSWORD: ${database.password} +``` + +The `environmentVariables` block: + +- Maps ESC values to environment variable names +- Uses interpolation (`${...}`) to reference other values +- Automatically includes secrets (they're revealed when the environment is opened) + +## Common patterns + +### Running cloud CLI commands + +Inject cloud credentials into CLI commands: + +```yaml +values: + aws: + login: + fn::open::aws-login: + oidc: + roleArn: arn:aws:iam::123456789012:role/my-role + sessionName: esc-session + + environmentVariables: + AWS_ACCESS_KEY_ID: ${aws.login.accessKeyId} + AWS_SECRET_ACCESS_KEY: ${aws.login.secretAccessKey} + AWS_SESSION_TOKEN: ${aws.login.sessionToken} +``` + +Run AWS CLI commands: + +```bash +esc run my-org/my-project/aws-prod -- aws s3 ls +esc run my-org/my-project/aws-prod -- aws ec2 describe-instances +``` + +The same pattern works for other cloud CLIs: + +```bash +esc run my-org/my-project/azure-prod -- az vm list +esc run my-org/my-project/gcp-prod -- gcloud compute instances list +``` + +### Running tests with secrets + +Configure test environments with secrets: + +```yaml +values: + environmentVariables: + TEST_DATABASE_URL: postgres://localhost/test_db + TEST_API_KEY: + fn::secret: test-api-key + TEST_WEBHOOK_SECRET: + fn::secret: test-webhook-secret +``` + +Run tests: + +```bash +esc run my-org/my-project/test -- npm test +esc run my-org/my-project/test -- pytest +esc run my-org/my-project/test -- go test ./... +``` + +### Running deployment scripts + +Inject credentials for deployment scripts: + +```yaml +values: + environmentVariables: + DEPLOY_TOKEN: + fn::secret: github-deploy-token + DOCKER_REGISTRY: myregistry.azurecr.io + DOCKER_USERNAME: myuser + DOCKER_PASSWORD: + fn::secret: registry-password +``` + +Run deployment: + +```bash +esc run my-org/my-project/prod -- ./deploy.sh +``` + +### Running interactive shells + +Start a shell session with environment variables loaded: + +```bash +esc run my-org/my-project/dev -- bash +``` + +All environment variables from the ESC environment are available in the shell. This is useful for: + +- Debugging issues locally with production-like configuration +- Running multiple commands without repeating `esc run` +- Interactive exploration of cloud resources + +Exit the shell to clear the environment variables. + +## Combining with other tools + +### Docker + +Run containers with secrets: + +```bash +esc run my-org/my-project/dev -- docker run --env DATABASE_URL myapp +``` + +Or use with Docker Compose: + +```bash +esc run my-org/my-project/dev -- docker-compose up +``` + +### Make + +Run Makefile targets with secrets: + +```bash +esc run my-org/my-project/dev -- make deploy +``` + +### CI/CD + +Use in CI/CD pipelines to inject secrets without storing them in CI configuration: + +```bash +# GitHub Actions +- run: esc run my-org/my-project/prod -- ./deploy.sh + +# GitLab CI +script: + - esc run my-org/my-project/prod -- ./deploy.sh +``` + +## Security considerations + +### Secrets are revealed during execution + +When you run `esc run`, secrets are revealed and passed as environment variables to the command. The command and any child processes can access these secrets. + +### Secrets are temporary + +Environment variables only exist for the duration of the command. Once the command exits, the secrets are no longer available. + +### Use appropriate environments + +Use separate environments for different security contexts: + +- Dev environment for local development +- CI environment for continuous integration +- Prod environment for production deployments + +Configure RBAC to control who can run commands with production secrets. + +## Next steps + +- [Managing secrets](/docs/esc/guides/managing-secrets/) - Store and organize secrets +- [Integrate with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/) - Use ESC in infrastructure code +- [Setting up OIDC](/docs/esc/guides/setting-up-oidc/) - Generate dynamic cloud credentials +- [CLI reference](/docs/esc/cli/commands/esc_run/) - Complete `esc run` documentation diff --git a/content/docs/esc/get-started/use-short-term-credentials.md b/content/docs/esc/guides/setting-up-oidc.md similarity index 86% rename from content/docs/esc/get-started/use-short-term-credentials.md rename to content/docs/esc/guides/setting-up-oidc.md index e14b61c1e9c1..0dcb6c389cc4 100644 --- a/content/docs/esc/get-started/use-short-term-credentials.md +++ b/content/docs/esc/guides/setting-up-oidc.md @@ -1,14 +1,16 @@ --- -title_tag: Use Short Term Cloud Credentials | Pulumi ESC -title: Use short term cloud credentials -h1: "Use Short Term Cloud Credentials to Run Commands Without Local Secrets" -meta_desc: This page provides an overview on how to get short term cloud credentials and run commands without using local secrets using the "esc run" command. -weight: 7 +title_tag: Setting Up OIDC | Pulumi ESC +title: Setting Up OIDC +h1: Setting Up OIDC with Pulumi ESC +meta_desc: Learn how to configure OpenID Connect (OIDC) with Pulumi ESC to generate short-lived cloud credentials dynamically. menu: esc: - parent: esc-get-started - identifier: esc-get-started-use-short-term-credentials + parent: esc-guides + identifier: esc-guides-setting-up-oidc + weight: 4 aliases: + - /docs/esc/get-started/use-short-term-credentials/ + - /docs/pulumi-cloud/esc/get-started/use-short-term-credentials/ --- Managing cloud credentials presents significant challenges for organizations of all sizes. Static, long-lived credentials, especially those stored in local environments introduce security risks and operational issues. Pulumi ESC’s built-in support for [dynamic login providers](/docs/esc/integrations/dynamic-login-credentials/), allows you to generate short-term, scoped credentials via OIDC. These credentials can then be used in your CLI workflows, CI/CD, Pulumi IaC, and more! @@ -139,15 +141,17 @@ ESC dynamic credentials and the `esc run` command can be used for various scenar - **Secure script execution**: Execute scripts that interact with AWS without embedding credentials - **Team collaboration**: Provide team members with secure, scoped access to resources -## Additional OIDC authentication configurations +## Next steps -See the following guides to set up OIDC between Pulumi ESC and your specific cloud provider: +- [Integrate with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/) - Use dynamic credentials in your infrastructure code +- [Running commands with esc run](/docs/esc/guides/running-commands-with-esc/) - Learn more about injecting secrets into commands +- [Integrating external secrets](/docs/esc/guides/external-secrets/) - Pull secrets from cloud vaults + +### Provider-specific OIDC configuration + +For detailed OIDC setup instructions for other cloud providers: - [Configuring OIDC for AWS](/docs/esc/environments/configuring-oidc/aws/) - [Configuring OIDC for Azure](/docs/esc/environments/configuring-oidc/azure/) - [Configuring OIDC for Google Cloud](/docs/esc/environments/configuring-oidc/gcp/) - [Configuring OIDC for Vault](/docs/esc/environments/configuring-oidc/vault/) - -In the next section, you will learn how to retrieve secret values from external sources. - -{{< get-started-stepper >}} diff --git a/content/docs/esc/integrations/dynamic-login-credentials/gh-login.md b/content/docs/esc/integrations/dynamic-login-credentials/gh-login.md index 561c225a4676..654a4512403b 100644 --- a/content/docs/esc/integrations/dynamic-login-credentials/gh-login.md +++ b/content/docs/esc/integrations/dynamic-login-credentials/gh-login.md @@ -48,7 +48,7 @@ for instructions on how to generate a private key (in PEM format) and download t Private keys do not expire and need to be manually revoked. You must keep private keys for GitHub Apps secure. Store the private key as a secret by using the `fn::secret` function. -See "[Pulumi ESC: Store and Retrieve Secrets](/docs/esc/get-started/store-and-retrieve-secrets/#store-environment-values)". +See "[Managing Secrets](/docs/esc/guides/managing-secrets/#storing-secrets)". ```yaml appId: 123456 diff --git a/content/docs/esc/integrations/infrastructure/cloudflare.md b/content/docs/esc/integrations/infrastructure/cloudflare.md index d676a3f14f89..cf0d68247521 100644 --- a/content/docs/esc/integrations/infrastructure/cloudflare.md +++ b/content/docs/esc/integrations/infrastructure/cloudflare.md @@ -42,7 +42,7 @@ Ensure you have: ### 1. Create an ESC Environment -Use the Pulumi ESC CLI to create and configure an Environment. Alternatively, to use the Pulumi Cloud console follow the [console instructions](https://www.pulumi.com/docs/esc/get-started/create-environment/#create-via-the-console). +Use the Pulumi ESC CLI to create and configure an Environment. ```bash esc login # if needed @@ -195,7 +195,7 @@ In addition to the [prerequisites above](#prerequisites), ensure you have: ### 1. Create (or Modify) an ESC Environment -Use the Pulumi ESC CLI to create and configure an Environment. Alternatively, to use the Pulumi Cloud console follow the [console instructions](https://www.pulumi.com/docs/esc/get-started/create-environment/#create-via-the-console). +Use the Pulumi ESC CLI to create and configure an Environment. ```bash esc login # if needed From 707e8ea3e0286b4ad7e05bddb7c4bd40b9c65700 Mon Sep 17 00:00:00 2001 From: Cam Date: Wed, 12 Nov 2025 17:59:57 +0000 Subject: [PATCH 05/10] Update links in documentation for Pulumi ESC and cloud credentials integration --- .../deployments/cloud-credentials.md | 2 +- content/docs/esc/concepts/how-esc-works.md | 59 +++---------------- content/docs/esc/guides/external-secrets.md | 12 ++-- content/docs/iac/concepts/resources/names.md | 2 +- .../insights/discovery/get-started/begin.md | 2 +- content/docs/support/faq/secrets-config.md | 2 +- 6 files changed, 18 insertions(+), 61 deletions(-) diff --git a/content/docs/deployments/deployments/cloud-credentials.md b/content/docs/deployments/deployments/cloud-credentials.md index 4546574115da..000d40407aa6 100644 --- a/content/docs/deployments/deployments/cloud-credentials.md +++ b/content/docs/deployments/deployments/cloud-credentials.md @@ -17,7 +17,7 @@ menu: In order for a Pulumi IaC operation like `update` or `preview` work, the Pulumi CLI must be able to access credentials that will allow it to perform the necessary CRUD operations on the resources in your stack. In order for Pulumi Deployments to access the necessary cloud credentials to run your Pulumi operation there are two common approaches you can take: 1. **Use [Pulumi Deployments' OIDC integration](/docs/deployments/deployments/oidc/)** where possible (we support [AWS](/docs/deployments/deployments/oidc/aws/), [Azure](/docs/deployments/deployments/oidc/azure/), and [Google Cloud](/docs/deployments/deployments/oidc/gcp/)), and store any remaining required secrets or configuration in [Pulumi Deployments Environment Variables](/docs/deployments/deployments/reference/#deployment-settings). -2. **Use [Pulumi ESC](/docs/esc/)** to define an Environment (or Environments), and [import the environment(s) into your stack](/docs/esc/get-started/integrate-with-pulumi-iac/). +2. **Use [Pulumi ESC](/docs/esc/)** to define an Environment (or Environments), and [import the environment(s) into your stack](/docs/esc/guides/integrate-with-pulumi-iac/). ## Choosing between Pulumi ESC Environments and Pulumi Deployments OIDC diff --git a/content/docs/esc/concepts/how-esc-works.md b/content/docs/esc/concepts/how-esc-works.md index 00e804526ef3..cfe722caf592 100644 --- a/content/docs/esc/concepts/how-esc-works.md +++ b/content/docs/esc/concepts/how-esc-works.md @@ -21,49 +21,6 @@ Using configuration-as-code, these secrets and configuration values are composed {{< figure src="/docs/esc/assets/esc-octopus-diagram.png" caption="Figure: A diagram showing the architecture of Pulumi ESC.">}} -### Deployment models - -**Pulumi Cloud (managed):** - -- Secrets encrypted at rest using AES-256-GCM -- Secrets encrypted in transit using TLS 1.2+ -- Optional customer-managed encryption keys -- Global availability with automatic scaling -- Built-in audit logs and compliance features - -**Self-hosted:** - -- Deploy ESC service on your own infrastructure -- Full control over data residency and network isolation -- Requires separate license and setup -- You manage encryption keys, backups, and scaling -- See [self-hosting documentation](/docs/support/faq/secrets-config/#can-i-self-host-pulumi-esc) for details - -### Evaluation engine - -When you open an environment (via `esc env open`, Pulumi IaC, or the API), ESC's evaluation engine: - -1. **Loads the environment definition** - Retrieves the YAML document and its version -1. **Resolves imports** - Recursively loads all imported environments -1. **Merges values** - Combines environments using JSON Merge Patch semantics (later values override earlier ones) -1. **Executes providers** - Runs dynamic provider plugins (OIDC, secret retrieval) -1. **Evaluates interpolations** - Resolves all `${variable}` references -1. **Applies functions** - Processes `fn::` function calls (e.g., `fn::secret`, `fn::toJSON`) -1. **Returns evaluated environment** - Outputs the final merged and evaluated configuration - -This evaluation happens **every time** an environment is opened, ensuring dynamic credentials are fresh and secrets are current. Provider credentials and secret values are never stored permanently—they exist only in memory during evaluation. - -### Composition mechanics - -Environments are merged using JSON Merge Patch ([RFC 7386](https://tools.ietf.org/html/rfc7386)) semantics: - -- **Objects** are merged recursively (keys from later environments override earlier ones) -- **Arrays** are replaced entirely (not merged element-by-element) -- **Primitives** are replaced by later values -- **Null** values delete keys from earlier environments - -This predictable merge behavior allows complex composition hierarchies while maintaining clarity about which values win. - ## Secrets and configuration sources By default, Pulumi ESC stores your configuration and secrets in Pulumi Cloud. However, ESC also integrates with a variety of third-party sources through an extensible *provider* plugin model. This allows teams to use their preferred providers without needing to manually copy or paste secrets across environments. The secrets will be dynamically fetched from the third-party API and integrated into your ESC environments. @@ -74,11 +31,11 @@ By aggregating secrets from these providers, Pulumi ESC provides a unified inter Pulumi ESC integrates with many popular cloud login providers and secrets managers, including: -- [AWS OIDC](/docs/esc/integrations/dynamic-login-credentials/aws-login/) and [AWS Secrets Manager](/docs/esc/integrations/dynamic-secrets/aws-secrets/) -- [Azure OIDC](/docs/esc/integrations/dynamic-login-credentials/azure-login) and [Azure KeyVault](/docs/esc/integrations/dynamic-secrets/azure-secrets/) -- [GCP OIDC](/docs/esc/integrations/dynamic-login-credentials/gcp-login/) and [GCP Secrets Manager](/docs/esc/integrations/dynamic-secrets/gcp-secrets/) -- [HashiCorp Vault OIDC](/docs/esc/integrations/dynamic-login-credentials/vault-login/) and [Vault Secrets](/docs/esc/integrations/dynamic-secrets/vault-secrets/) -- [1Password](/docs/esc/integrations/dynamic-secrets/1password-secrets/), [Kubernetes](/docs/esc/integrations/kubernetes/), among others. +* [AWS OIDC](/docs/esc/integrations/dynamic-login-credentials/aws-login/) and [AWS Secrets Manager](/docs/esc/integrations/dynamic-secrets/aws-secrets/) +* [Azure OIDC](/docs/esc/integrations/dynamic-login-credentials/azure-login) and [Azure KeyVault](/docs/esc/integrations/dynamic-secrets/azure-secrets/) +* [GCP OIDC](/docs/esc/integrations/dynamic-login-credentials/gcp-login/) and [GCP Secrets Manager](/docs/esc/integrations/dynamic-secrets/gcp-secrets/) +* [HashiCorp Vault OIDC](/docs/esc/integrations/dynamic-login-credentials/vault-login/) and [Vault Secrets](/docs/esc/integrations/dynamic-secrets/vault-secrets/) +* [1Password](/docs/esc/integrations/dynamic-secrets/1password-secrets/), [Kubernetes](/docs/esc/integrations/kubernetes/), among others. Teams can setup [OpenID Connect integration](/docs/esc/environments/configuring-oidc/) in their cloud providers to allow ESC environments to pull short-lived credentials via **OIDC** for secure, time-limited access to secrets. These credentials can then be used in both [Pulumi IaC](/docs/pulumi-cloud/esc/environments/#using-with-pulumi-iac) workflows and [external CLIs](/docs/pulumi-cloud/esc/environments/#running-third-party-commands-using-pulumi-esc-secrets-and-config) like `aws`, `kubectl`, etc. @@ -140,9 +97,9 @@ Every change to an ESC environment definition is recorded as a unique numeric ve ESC environments can be composed from other environments allowing for modularity and inheritance -- concepts usually only found in code: -- **Inheritance**: One environment can inherit values from another environment. -- **Overrides**: Values in child environments can override inherited values. -- **Nesting**: Environments can be arbitrarily nested for maximum flexibility, allowing complex hierarchies to be built out. +* **Inheritance**: One environment can inherit values from another environment. +* **Overrides**: Values in child environments can override inherited values. +* **Nesting**: Environments can be arbitrarily nested for maximum flexibility, allowing complex hierarchies to be built out. ## Managing access: RBAC and auditing diff --git a/content/docs/esc/guides/external-secrets.md b/content/docs/esc/guides/external-secrets.md index 20f8c4ee4a62..599689892ba1 100644 --- a/content/docs/esc/guides/external-secrets.md +++ b/content/docs/esc/guides/external-secrets.md @@ -78,14 +78,14 @@ values: secretId: my-app-secret ``` -You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#retrieve-via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. +You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. -Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. +Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. ```bash $ esc env open pulumi/demos/aws-secrets-example @@ -175,14 +175,14 @@ values: name: my-app-secret ``` -You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#retrieve-via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. +You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. -Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. +Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. ```bash $ esc env open pulumi/demos/azure-secrets-example @@ -271,14 +271,14 @@ values: name: my-app-secret ``` -You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#retrieve-via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. +You can validate this configuration by [opening the environment via the ESC console](/docs/esc/guides/managing-secrets/#via-the-pulumi-cloud-console), clicking the **Open** button and then clicking the **Show secrets** slider. -Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#retrieve-via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. +Alternatively, you can validate the configuration by [opening the environment via the ESC CLI](/docs/esc/guides/managing-secrets/#via-the-cli). Run the `esc env open //` command, making sure to replace the values of ``, ``, and `` with the names of your Pulumi organization, ESC project, and environment respectively. ```bash $ esc env open pulumi/demos/gcp-secrets-example diff --git a/content/docs/iac/concepts/resources/names.md b/content/docs/iac/concepts/resources/names.md index 061758de0564..eb9e790fbd1e 100644 --- a/content/docs/iac/concepts/resources/names.md +++ b/content/docs/iac/concepts/resources/names.md @@ -276,7 +276,7 @@ config: pattern: ${name}-${project}-${stack} ``` -And when configuring it in an [ESC environment](/docs/esc/get-started/integrate-with-pulumi-iac/), you can specify the configuration as such: +And when configuring it in an [ESC environment](/docs/esc/guides/integrate-with-pulumi-iac/), you can specify the configuration as such: ```yaml pulumiConfig: diff --git a/content/docs/insights/discovery/get-started/begin.md b/content/docs/insights/discovery/get-started/begin.md index ad4206eec41a..3544b29a7219 100644 --- a/content/docs/insights/discovery/get-started/begin.md +++ b/content/docs/insights/discovery/get-started/begin.md @@ -26,7 +26,7 @@ If you're new to Pulumi you can click here to [start a free trial](https://app.p ## Create an ESC environment -Pulumi Insights Account Discovery requires read-only access to your cloud accounts. This access is granted by [creating an ESC environment](/docs/esc/get-started/create-environment/) that generates valid credentials for the corresponding Pulumi provider when accessed. +Pulumi Insights Account Discovery requires read-only access to your cloud accounts. This access is granted by [creating an ESC environment](/docs/esc/get-started/) that generates valid credentials for the corresponding Pulumi provider when accessed. {{% notes "info" %}} Account Discovery leverages Pulumi ESC to securely manage the credentials required to discover and read infrastructure resources, aligning with enterprise best practices for managing application secrets. diff --git a/content/docs/support/faq/secrets-config.md b/content/docs/support/faq/secrets-config.md index 96d08a2fa849..2c17d203b90f 100644 --- a/content/docs/support/faq/secrets-config.md +++ b/content/docs/support/faq/secrets-config.md @@ -26,7 +26,7 @@ See our [pricing page](https://www.pulumi.com/pricing/) for details. ## What counts as a secret towards pricing? -Secrets include [static secrets](/docs/esc/get-started/store-and-retrieve-secrets/), [dynamic login credentials](/docs/esc/integrations/dynamic-login-credentials/) and [dynamic secrets](/docs/esc/integrations/dynamic-secrets/). +Secrets include [static secrets](/docs/esc/guides/managing-secrets/), [dynamic login credentials](/docs/esc/integrations/dynamic-login-credentials/) and [dynamic secrets](/docs/esc/integrations/dynamic-secrets/). In other words, when using Pulumi ESC's document editor, each definition of `fn::secret` and `fn::open::*` (except with the [pulumi-stacks provider](/docs/esc/integrations/infrastructure/pulumi-iac/pulumi-stacks/)) is counted as a secret. From 7b4572761aca5b1296d28191693681722c573867 Mon Sep 17 00:00:00 2001 From: Cam Date: Wed, 12 Nov 2025 22:56:08 +0000 Subject: [PATCH 06/10] Refine documentation for Pulumi ESC: update links, clarify prerequisites, and enhance instructions for OIDC setup and environment importing --- content/docs/esc/concepts/_index.md | 4 -- content/docs/esc/get-started/_index.md | 4 +- .../docs/esc/guides/importing-environments.md | 2 +- .../esc/guides/integrate-with-pulumi-iac.md | 14 +++++-- content/docs/esc/guides/managing-secrets.md | 2 +- content/docs/esc/guides/setting-up-oidc.md | 37 +++++++++++-------- 6 files changed, 36 insertions(+), 27 deletions(-) diff --git a/content/docs/esc/concepts/_index.md b/content/docs/esc/concepts/_index.md index a281140d0b36..db089d5d3b41 100644 --- a/content/docs/esc/concepts/_index.md +++ b/content/docs/esc/concepts/_index.md @@ -134,9 +134,5 @@ Environments support: ## Learn more - [How Pulumi ESC works](/docs/esc/concepts/how-esc-works) - Architecture and evaluation model -- [Environment data model](/docs/esc/concepts/environment-data-model) - Structure and hierarchy -- [Composition and imports](/docs/esc/concepts/composition-and-imports) - How environments merge -- [Provider architecture](/docs/esc/concepts/provider-architecture) - Dynamic providers and OIDC -- [Security model](/docs/esc/concepts/security-model) - Encryption and threat model - [ESC providers](/docs/esc/integrations/) - Full list of integrations - [Environments reference](/docs/esc/environments/) - Complete syntax documentation diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index 97dcc78fae02..a6fed758cea3 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -125,10 +125,12 @@ That's it! You've created an environment, stored a secret, and retrieved it prog ### Use ESC in your infrastructure code -Most Pulumi users integrate ESC with their IaC workflows to centralize secrets and configuration across all stacks. Learn how to reference ESC environments in your Pulumi programs: +Most Pulumi users integrate ESC with their IaC workflows to centralize secrets and configuration across all stacks. If you already use Pulumi IaC, learn how to reference ESC environments in your Pulumi programs: **→ [Integrate ESC with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** +New to Pulumi IaC? Start with the [Pulumi IaC Get Started guide](/docs/get-started/) first. + ### Explore other use cases - **[Understand the concepts](/docs/esc/concepts/)** - Learn how ESC works under the hood diff --git a/content/docs/esc/guides/importing-environments.md b/content/docs/esc/guides/importing-environments.md index ed1952497875..078f48a3311a 100644 --- a/content/docs/esc/guides/importing-environments.md +++ b/content/docs/esc/guides/importing-environments.md @@ -79,7 +79,7 @@ You can test this out by retrieving the imported value via the console or the CL ### Import via the Table view -Alternatively, you can import environments using the Table view of the Pulumi console. Navigate to the **Table view** of your environment and click the **Import** button under the **Imports** section. You will be presented with a dropdown list of environments that you can import. Search for the name of the environment you want to import and select it. Then click **Import**. +Alternatively, you can import environments using the Table view of the Pulumi console. Navigate to the **Table view** of your environment and select the **Import** button under the **Imports** section. You will be presented with a dropdown list of environments that you can import. Search for the name of the environment you want to import and select it. Then select **Import**. ![Importing the global config environment in the Pulumi Console](/docs/esc/assets/esc-import-pulumi-console.png) diff --git a/content/docs/esc/guides/integrate-with-pulumi-iac.md b/content/docs/esc/guides/integrate-with-pulumi-iac.md index abd0b85b01db..bc2c246ad29e 100644 --- a/content/docs/esc/guides/integrate-with-pulumi-iac.md +++ b/content/docs/esc/guides/integrate-with-pulumi-iac.md @@ -15,12 +15,18 @@ aliases: This guide shows you how to integrate Pulumi ESC with your Pulumi IaC projects to centralize configuration and secrets across all your stacks. +{{< notes type="info" >}} +**This guide is for existing Pulumi IaC users.** If you're new to Pulumi IaC, start with the [Pulumi IaC Get Started guide](/docs/get-started/) first. +{{< /notes >}} + +If you just completed the [ESC Get Started guide](/docs/esc/get-started/), you already have an environment. This guide shows you how to reference it from your Pulumi stack configuration. + ## Prerequisites - [Pulumi CLI](/docs/install/) installed - [Pulumi account](https://app.pulumi.com/signup) created - An existing Pulumi project (or create one with `pulumi new`) -- An ESC environment with configuration values (see [Managing secrets](/docs/esc/guides/managing-secrets/) to create one) +- An ESC environment with configuration values (see [Get Started](/docs/esc/get-started/) to create one) ## Add ESC to your Pulumi stack @@ -70,12 +76,12 @@ In your ESC environment, use the `pulumiConfig` block to expose values to Pulumi ```yaml values: pulumiConfig: - aws:region: us-west-2 - myApp:apiKey: + myEnvironment: production + myPassword: fn::secret: demo-api-key-123 ``` -The `pulumiConfig` block maps ESC values to Pulumi configuration keys. Values defined here become available to your Pulumi program through the standard Configuration API. +The `pulumiConfig` block is the bridge between ESC and Pulumi IaC. Any values you define under `pulumiConfig` become available in your Pulumi program through the standard Configuration API. This allows you to centralize all your configuration and secrets in ESC while accessing them through familiar Pulumi config patterns like `config.get()` or `config.require()`. ### Step 3: Access configuration in your code diff --git a/content/docs/esc/guides/managing-secrets.md b/content/docs/esc/guides/managing-secrets.md index 72b03bc7a418..a0ec878f917a 100644 --- a/content/docs/esc/guides/managing-secrets.md +++ b/content/docs/esc/guides/managing-secrets.md @@ -180,7 +180,7 @@ ESC versions every change, allowing you to roll back if needed. ### Control access with RBAC -Use [Role-Based Access Control](/docs/esc/environments/access-control/) to limit who can read or write secrets: +Use [Role-Based Access Control](/docs/esc/administration/access-control/) to limit who can read or write secrets: - Grant teams read-only access to production secrets - Allow developers full access to development secrets diff --git a/content/docs/esc/guides/setting-up-oidc.md b/content/docs/esc/guides/setting-up-oidc.md index 0dcb6c389cc4..855d3033d8f2 100644 --- a/content/docs/esc/guides/setting-up-oidc.md +++ b/content/docs/esc/guides/setting-up-oidc.md @@ -13,9 +13,16 @@ aliases: - /docs/pulumi-cloud/esc/get-started/use-short-term-credentials/ --- -Managing cloud credentials presents significant challenges for organizations of all sizes. Static, long-lived credentials, especially those stored in local environments introduce security risks and operational issues. Pulumi ESC’s built-in support for [dynamic login providers](/docs/esc/integrations/dynamic-login-credentials/), allows you to generate short-term, scoped credentials via OIDC. These credentials can then be used in your CLI workflows, CI/CD, Pulumi IaC, and more! +This guide shows you how to configure OpenID Connect (OIDC) between Pulumi ESC and AWS to generate short-lived credentials dynamically. Using [dynamic login providers](/docs/esc/integrations/dynamic-login-credentials/), you can eliminate static credentials and generate temporary, scoped credentials on demand. These credentials work with CLI workflows, CI/CD pipelines, Pulumi IaC, and any tool that uses AWS credentials. -In this example, you will use the `esc run` command to execute AWS CLI operations without having to manually configure AWS credentials in your local environment. +This guide demonstrates using `esc run` to execute AWS CLI commands with dynamically generated credentials, without configuring static AWS credentials locally. + +## Prerequisites + +- [Pulumi account](https://app.pulumi.com/signup) created +- [ESC CLI](/docs/esc-cli/) installed +- AWS account with administrative access to create IAM roles and OIDC providers +- [AWS CLI](https://aws.amazon.com/cli/) installed (for testing the integration) ## Create the AWS OIDC configuration @@ -31,29 +38,27 @@ To use dynamic credentials, you need to configure OpenID Connect (OIDC) between 3. Select **OpenID Connect** as the provider type 4. For the Provider URL, enter: `https://api.pulumi.com/oidc` 5. For the Audience, enter the name of your Pulumi organization prefixed with `aws:` (e.g. `aws:{org}`) -6. Click **Add provider** -{{< notes type="info" >}} -For legacy ESC Environments in the `default` project, the audience will use just the Pulumi organization name. -{{< /notes >}} + - **Note:** For legacy ESC environments in the `default` project, use just the Pulumi organization name without the `aws:` prefix +6. Select **Add provider** ### Create the IAM role -1. After creating the provider, click **Assign role** in the notification prompt +1. After creating the provider, select **Assign role** in the notification prompt 2. Select **Create a new role** 3. Ensure **Web identity** is selected, and verify that - `api.pulumi.com/oidc` provider is selected - Your Pulumi organization (prefixed with `aws:`) is selected as the audience -4. Click **Next** +4. Select **Next** 5. Select the permissions your role needs (e.g. **AmazonS3FullAccess** for S3 operations) -6. Click **Next** +6. Select **Next** 7. Name your role (e.g., `pulumi-esc-s3-role`) and add an optional description -8. Click **Edit** on the Select trusted entities' section -9. Ensure the "Condition" subject claim includes `aws:` before your organization name (i.e.`"api.pulumi.com/oidc:aud": "aws:myorg"` ) -10. Review and click **Create role** +8. Select **Edit** on the Select trusted entities' section +9. Ensure the Condition checks the audience claim with `aws:` before your organization name (i.e. `"api.pulumi.com/oidc:aud": "aws:myorg"`, or just `myorg` for legacy default project environments) +10. Review and select **Create role** Example trust policy: -```yaml +```json { "Version": "2012-10-17", "Statement": [ @@ -82,9 +87,9 @@ If you want to set environment level or even granular permissions in your trust ## Create a Pulumi ESC environment 1. Navigate to the [Pulumi Cloud Console](https://app.pulumi.com/) -2. Click **Environments** and then **Create environment** +2. Select **Environments** and then **Create environment** 3. Enter a name for your environment (e.g., `aws-s3-access`) -4. Click **Create environment** +4. Select **Create environment** ## Configure the AWS Provider integration @@ -109,7 +114,7 @@ Be sure to replace `` with the ARN of the IAM role you c ![An image of the ESC environment editor role trust policy](/docs/esc/assets/esc-environment-editor.png) -Click **Save** to store your environment configuration. +Select **Save** to store your environment configuration. ## Use esc run to execute AWS commands From 8e964bf0ea237784299b53d86cfa4a2087d65dd5 Mon Sep 17 00:00:00 2001 From: Cam Date: Fri, 14 Nov 2025 00:32:57 +0000 Subject: [PATCH 07/10] Add script to add borders to PNG images in markdown files - Created a new script `add_borders.py` that adds 1px #CCCCCC borders to PNG images referenced in markdown files. - Implemented functionality to check for existing borders and avoid duplication. - Added metadata to processed images to track border addition. - Included a `Pipfile` for dependency management, requiring `pillow` and `click`. - Added command-line interface for user interaction, supporting dry-run mode. --- .claude/commands/add-borders.md | 104 +++++++ .claude/commands/glow-up.md | 13 +- Pipfile | 11 + STYLE-GUIDE.md | 8 + .../esc/assets/esc-create-environment.png | Bin 43756 -> 0 bytes content/docs/esc/get-started/_index.md | 55 ++-- .../images/esc-create-environment.png | Bin 0 -> 36696 bytes .../images/esc-env-edit-post-save.png | Bin 0 -> 40658 bytes .../images/esc-env-edit-pre-save.png | Bin 0 -> 33835 bytes scripts/image-borders/Pipfile | 13 + scripts/image-borders/add_borders.py | 269 ++++++++++++++++++ 11 files changed, 444 insertions(+), 29 deletions(-) create mode 100644 .claude/commands/add-borders.md create mode 100644 Pipfile delete mode 100644 content/docs/esc/assets/esc-create-environment.png create mode 100644 content/docs/esc/get-started/images/esc-create-environment.png create mode 100644 content/docs/esc/get-started/images/esc-env-edit-post-save.png create mode 100644 content/docs/esc/get-started/images/esc-env-edit-pre-save.png create mode 100644 scripts/image-borders/Pipfile create mode 100755 scripts/image-borders/add_borders.py diff --git a/.claude/commands/add-borders.md b/.claude/commands/add-borders.md new file mode 100644 index 000000000000..761cfad232cf --- /dev/null +++ b/.claude/commands/add-borders.md @@ -0,0 +1,104 @@ +--- +description: Add 1px grey borders to PNG images in a documentation file. +--- + +# Usage + +`/add-borders ` + +Analyze PNG images referenced in the specified markdown file at {{arg}} and add 1px #999999 (medium grey) borders to any images that don't already have them. This improves visual clarity and consistency of screenshots and diagrams in documentation. + +--- + +## Process + +### 1. Verify prerequisites + +Before running the border tool, ensure dependencies are installed: + +```bash +cd /workspaces/src/pulumi/docs/scripts/image-borders && pipenv install +``` + +If this is the first run or if Pillow is not yet installed, the installation will complete automatically. + +### 2. Run the border addition tool + +Execute the Python script with the provided documentation file: + +```bash +cd /workspaces/src/pulumi/docs && pipenv run python scripts/image-borders/add_borders.py {{arg}} +``` + +The script will: +- Parse the markdown file to find all PNG image references +- Check each image's edge pixels to detect existing borders +- Add a 1px #999999 border to images that don't have one +- Skip images that already have a grey border (within tolerance) +- Display a summary of modified and skipped images + +### 3. Review the results + +The script outputs: +- **Modified**: Images that received new borders +- **Skipped**: Images that already had borders + +Example output: +``` +Found 3 PNG image(s) + +✓ Added border: content/docs/esc/assets/create-environment.png +✓ Added border: content/docs/esc/assets/editor-before-save.png +⊘ Skipped (has border): content/docs/esc/assets/editor-after-save.png + +Summary: + Modified: 2 + Skipped: 1 +``` + +### 4. Verify the changes + +After borders are added: +1. View the modified images to ensure borders look correct +2. Check that border width and color (#CCCCCC) are appropriate +3. Verify the images still display correctly in the documentation + +You can preview the documentation locally: +```bash +make serve +``` + +Then navigate to the affected page at http://localhost:1313 + +### 5. Commit the changes (if appropriate) + +If the borders improve the documentation quality, commit the modified images: + +```bash +git add +git commit -m "Add 1px borders to documentation images for visual clarity" +``` + +--- + +## Options + +The script supports additional options: + +- `--dry-run` - Show what would be done without making changes +- `--repo-root ` - Specify repository root (auto-detected by default) + +Example with dry run: +```bash +pipenv run python scripts/image-borders/add_borders.py {{arg}} --dry-run +``` + +--- + +## Notes + +- The script uses edge pixel analysis to detect existing borders with 80% confidence threshold +- Handles RGBA images (preserves transparency) +- Uses #999999 (medium grey) for visibility on both white and light backgrounds +- Only processes PNG files (ignores JPG, GIF, SVG, etc.) +- Modifies images in place (use git to revert if needed) diff --git a/.claude/commands/glow-up.md b/.claude/commands/glow-up.md index c1aeffbe8f3f..e84c3f651aff 100644 --- a/.claude/commands/glow-up.md +++ b/.claude/commands/glow-up.md @@ -76,8 +76,13 @@ Read the entire target file and perform comprehensive analysis: For each image or diagram referenced in the document: -1. Use the Read tool to view the image -2. Analyze the image for the following issues: +1. **Check for missing borders on PNG images**: Run the border detection script with dry-run mode to deterministically identify which PNG images need borders: + ```bash + cd /workspaces/src/pulumi/docs/scripts/image-borders && pipenv run python add_borders.py --dry-run + ``` + The script will report which images would be modified vs skipped. + +2. Regardless of existing borders, use the Read tool to view the image and analyze the image for the following issues: **Screenshots:** - Missing or inadequate alt text (accessibility requirement) @@ -163,6 +168,7 @@ Develop a detailed plan organized by issue category: - Images to convert to Mermaid/GoAT - Unnecessary images to remove - File format or size optimizations + - PNG images that need 1px grey borders for visual clarity **7. Content enhancements** — List specific recommendations: - Unclear sections that need rewriting @@ -204,7 +210,8 @@ Once approved, implement the changes in logical order: 4. **Style improvements** (remove filler, simplify sentences, active voice) 5. **Link improvements** (improve link text, add cross-references) 6. **Image improvements** (add alt text, remove unnecessary images, flag outdated screenshots) -7. **Content enhancements** (rewrite unclear sections, add context) +7. **Add borders to PNG images** (run `/add-borders ` if PNG images need borders) +8. **Content enhancements** (rewrite unclear sections, add context) Use the TodoWrite tool to track progress through the improvements. diff --git a/Pipfile b/Pipfile new file mode 100644 index 000000000000..0757494bb360 --- /dev/null +++ b/Pipfile @@ -0,0 +1,11 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] + +[requires] +python_version = "3.11" diff --git a/STYLE-GUIDE.md b/STYLE-GUIDE.md index 6f4b53073e9f..837277dd9df6 100644 --- a/STYLE-GUIDE.md +++ b/STYLE-GUIDE.md @@ -77,6 +77,14 @@ The symbol is not needed in regular in-text links within documentation pages. --- +## Images and Media + +- Use relative paths for images stored in the same directory or a subdirectory. +- Provide descriptive alt text for all images. +- For partial screenshots where the image may be hard to distinguish from the page background, add a 1px gray #999999 border. + +--- + ## Notes / Callouts Use the `{{ notes }}` shortcode sparingly. Supported levels: diff --git a/content/docs/esc/assets/esc-create-environment.png b/content/docs/esc/assets/esc-create-environment.png deleted file mode 100644 index adab996f6e8931a6f3aec5dcc17fc41363c5d3bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43756 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/my-project/dev` in the list. +## Store configuration and secrets -## Store a secret +Add both plaintext configuration and encrypted secrets to your environment: -Add a secret to your environment using the Pulumi Cloud console: - -1. Navigate to [Pulumi Cloud](https://app.pulumi.com) and log in -1. Select **Environments** in the left navigation -1. Select your `my-project/dev` environment -1. In the YAML editor, add the following: +1. In the **Environment definition** editor, erase the contents and replace them with the following YAML: ```yaml values: + region: us-west-2 apiKey: fn::secret: demo-secret-123 ``` + This defines two values: `region` (a plaintext value) and `apiKey` (a secret value, marked with `fn::secret`). + +![ESC environment editor showing YAML definition with region and apiKey values before saving](./images/esc-env-edit-pre-save.png) + 1. Select **Save** -The console encrypts the secret and stores it securely. The plaintext value is replaced with encrypted ciphertext in the YAML definition. +Watch what happens: ESC automatically encrypts the secret value. The plaintext `demo-secret-123` is replaced with `[secret]` in the editor, showing that your secret is now encrypted and stored securely. + +![ESC environment editor showing encrypted secret value displayed as [secret] after saving](./images/esc-env-edit-post-save.png) -## Retrieve your secret +## Retrieve your configuration and secrets -Open your environment to retrieve all values, including secrets: +Open your environment to retrieve all values, including decrypted secrets: ```bash esc env open my-project/dev @@ -115,19 +117,20 @@ You should see output like: ```json { + "region": "us-west-2", "apiKey": "demo-secret-123" } ``` -That's it! You've created an environment, stored a secret, and retrieved it programmatically. +That's it! You've created an environment, stored configuration and secrets, and retrieved them programmatically. Notice that the secret is automatically decrypted when you open the environment via the CLI. ## What's next? ### Use ESC in your infrastructure code -Most Pulumi users integrate ESC with their IaC workflows to centralize secrets and configuration across all stacks. If you already use Pulumi IaC, learn how to reference ESC environments in your Pulumi programs: +Pulumi users typically integrate ESC with their IaC workflows to centralize secrets and configuration across all stacks. If you already use Pulumi IaC, learn how to reference ESC environments in your Pulumi programs: -**→ [Integrate ESC with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** +**[Integrate ESC with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** New to Pulumi IaC? Start with the [Pulumi IaC Get Started guide](/docs/get-started/) first. diff --git a/content/docs/esc/get-started/images/esc-create-environment.png b/content/docs/esc/get-started/images/esc-create-environment.png new file mode 100644 index 0000000000000000000000000000000000000000..d59d6fe58a7806f0e8e156f58a6f03b2328940d1 GIT binary patch literal 36696 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

s5l3l;6?M(Qej>t<1_>9Z4wV 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 LtDnm{r-UW|%g0_n literal 0 HcmV?d00001 diff --git a/content/docs/esc/get-started/images/esc-env-edit-post-save.png b/content/docs/esc/get-started/images/esc-env-edit-post-save.png new file mode 100644 index 0000000000000000000000000000000000000000..aafa175b51f8fd8cb320b87842d5e13686f6dcba GIT binary patch literal 40658 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 CWa>Qt literal 0 HcmV?d00001 diff --git a/content/docs/esc/get-started/images/esc-env-edit-pre-save.png b/content/docs/esc/get-started/images/esc-env-edit-pre-save.png new file mode 100644 index 0000000000000000000000000000000000000000..a76dc409cb5b189d3ec6b012e72ea425f29ffe0c GIT binary patch literal 33835 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 Oe-va@WOAjR`28=;1fO;Q literal 0 HcmV?d00001 diff --git a/scripts/image-borders/Pipfile b/scripts/image-borders/Pipfile new file mode 100644 index 000000000000..0c970cee2f5c --- /dev/null +++ b/scripts/image-borders/Pipfile @@ -0,0 +1,13 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +pillow = "*" +click = "*" + +[dev-packages] + +[requires] +python_version = "3" diff --git a/scripts/image-borders/add_borders.py b/scripts/image-borders/add_borders.py new file mode 100755 index 000000000000..6e5709fe4f4a --- /dev/null +++ b/scripts/image-borders/add_borders.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python3 +""" +Add 1px #CCCCCC borders to PNG images referenced in markdown files. + +This script parses markdown files, finds PNG image references, checks if they +already have a grey border, and adds one if needed. +""" + +import os +import re +import sys +from pathlib import Path +from typing import List, Tuple + +try: + from PIL import Image, ImageDraw, PngImagePlugin + import click +except ImportError: + print("Error: Required packages not installed.", file=sys.stderr) + print("Please run: pipenv install", file=sys.stderr) + sys.exit(1) + +# Border color (medium grey for visibility on both white and light backgrounds) +BORDER_COLOR = "#999999" +BORDER_WIDTH = 1 + +# Tolerance for exact pixel matching (accounts for compression artifacts) +# Much tighter than before - we're checking ALL pixels, not sampling +PIXEL_TOLERANCE = 2 + +# Metadata key for tracking processed images +METADATA_KEY = "X-Border-Added" + + +def rgb_from_hex(hex_color: str) -> Tuple[int, int, int]: + """Convert hex color to RGB tuple.""" + hex_color = hex_color.lstrip('#') + return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) + + +def color_distance(c1: Tuple[int, int, int], c2: Tuple[int, int, int]) -> float: + """Calculate Euclidean distance between two RGB colors.""" + return sum((a - b) ** 2 for a, b in zip(c1, c2)) ** 0.5 + + +def has_border(image_path: Path, border_color: str) -> bool: + """Check if an image already has a border of the specified color. + + Uses a hybrid approach: + 1. First checks PNG metadata for X-Border-Added marker (deterministic). + 2. For images **without** that marker, examines a single-pixel-wide frame + around the image and compares its color to the target border color. + + For previously processed images that are later cropped or edited, this + still behaves conservatively: it only reports a positive border match + when the entire outer frame is within tolerance of the expected color. + """ + try: + img = Image.open(image_path) + + # Step 1: Check metadata for our marker + if hasattr(img, 'info') and METADATA_KEY in img.info: + metadata_color = img.info[METADATA_KEY] + if metadata_color == border_color: + return True + + # Step 2: Examine outer edge pixels (fallback for legacy images) + width, height = img.size + target_rgb = rgb_from_hex(border_color) + + if img.mode != 'RGB': + img = img.convert('RGB') + + # Helper to test whether all pixels along a line match the target + def edge_matches(coords): + for x, y in coords: + pixel = img.getpixel((x, y)) + if color_distance(pixel[:3], target_rgb) > PIXEL_TOLERANCE: + return False + return True + + top = [(x, 0) for x in range(width)] + bottom = [(x, height - 1) for x in range(width)] + left = [(0, y) for y in range(1, height - 1)] + right = [(width - 1, y) for y in range(1, height - 1)] + + if not edge_matches(top): + return False + if not edge_matches(bottom): + return False + if height > 2 and not edge_matches(left): + return False + if height > 2 and not edge_matches(right): + return False + + return True + + except Exception as e: + print(f"Error checking border for {image_path}: {e}", file=sys.stderr) + return False + + +def add_border(image_path: Path, border_color: str, border_width: int) -> bool: + """ + Add a border to an image and mark it with metadata. + + Returns True if border was added, False if image already had a border. + """ + try: + # Check if border already exists + if has_border(image_path, border_color): + return False + + img = Image.open(image_path) + + # Create new image with border + new_width = img.width + 2 * border_width + new_height = img.height + 2 * border_width + + # Create new image with border color background + bordered_img = Image.new('RGB', (new_width, new_height), rgb_from_hex(border_color)) + + # Convert original image to RGB if needed (preserve transparency in paste) + if img.mode == 'RGBA': + # Paste with alpha channel as mask + bordered_img.paste(img, (border_width, border_width), img) + else: + if img.mode != 'RGB': + img = img.convert('RGB') + bordered_img.paste(img, (border_width, border_width)) + + # Create PNG metadata to mark this image as processed + pnginfo = PngImagePlugin.PngInfo() + pnginfo.add_text(METADATA_KEY, border_color) + + # Save with metadata + bordered_img.save(image_path, 'PNG', optimize=True, pnginfo=pnginfo) + return True + + except Exception as e: + print(f"Error processing {image_path}: {e}", file=sys.stderr) + return False + + +def extract_png_images(markdown_path: Path, repo_root: Path) -> List[Path]: + """ + Extract PNG image references from a markdown file. + + Returns a list of absolute paths to PNG files. + """ + images = [] + + try: + with open(markdown_path, 'r', encoding='utf-8') as f: + content = f.read() + + # Match markdown image syntax: ![alt text](/path/to/image.png) + pattern = r'!\[.*?\]\((.*?\.png)\)' + matches = re.findall(pattern, content, re.IGNORECASE) + + for match in matches: + # Convert markdown path to filesystem path + # Paths can be: + # - Absolute: /docs/esc/assets/image.png -> content/docs/esc/assets/image.png + # - Relative: ./images/image.png -> relative to markdown file location + + if match.startswith('/docs/'): + # Absolute path from site root + rel_path = 'content' + match + abs_path = repo_root / rel_path + elif match.startswith('docs/'): + # Absolute path without leading slash + rel_path = 'content/' + match + abs_path = repo_root / rel_path + else: + # Relative path - resolve relative to markdown file's directory + abs_path = (markdown_path.parent / match).resolve() + + if abs_path.exists(): + images.append(abs_path) + else: + print(f"Warning: Image not found: {abs_path}", file=sys.stderr) + + except Exception as e: + print(f"Error reading markdown file: {e}", file=sys.stderr) + + return images + + +@click.command() +@click.argument('markdown_file', type=click.Path(exists=True)) +@click.option('--repo-root', type=click.Path(exists=True), + help='Repository root directory (auto-detected if not specified)') +@click.option('--dry-run', is_flag=True, help='Show what would be done without making changes') +def main(markdown_file: str, repo_root: str, dry_run: bool): + """ + Add 1px #CCCCCC borders to PNG images referenced in MARKDOWN_FILE. + + Detects existing borders by checking edge pixels. Only modifies images + that don't already have a grey border. + """ + md_path = Path(markdown_file).resolve() + + # Auto-detect repo root if not specified + if repo_root: + root = Path(repo_root).resolve() + else: + # Find repo root by looking for content/ directory + root = md_path.parent + while root != root.parent: + if (root / 'content').exists(): + break + root = root.parent + else: + print("Error: Could not find repository root. Please specify --repo-root.", + file=sys.stderr) + sys.exit(1) + + print(f"Processing: {md_path}") + print(f"Repository root: {root}") + print() + + # Extract images from markdown + images = extract_png_images(md_path, root) + + if not images: + print("No PNG images found in markdown file.") + return + + print(f"Found {len(images)} PNG image(s)") + print() + + # Process each image + modified = [] + skipped = [] + + for img_path in images: + rel_path = img_path.relative_to(root) + + if dry_run: + # In dry-run mode, still honor border detection so output + # reflects what would actually happen. + if has_border(img_path, BORDER_COLOR): + print(f"Would skip (has border): {rel_path}") + skipped.append(rel_path) + else: + print(f"Would add border: {rel_path}") + modified.append(rel_path) + else: + if add_border(img_path, BORDER_COLOR, BORDER_WIDTH): + modified.append(rel_path) + print(f"✓ Added border: {rel_path}") + else: + skipped.append(rel_path) + print(f"⊘ Skipped (has border): {rel_path}") + + # Summary + print() + print("Summary:") + print(f" Modified: {len(modified)}") + print(f" Skipped: {len(skipped)}") + + if dry_run: + print() + print("DRY RUN - No changes were made") + + +if __name__ == '__main__': + main() From e4fbcbe7a5ff5e5868095482b4c1fc9b2a9bb918 Mon Sep 17 00:00:00 2001 From: Cam Date: Fri, 14 Nov 2025 00:53:21 +0000 Subject: [PATCH 08/10] Enhance "Create your first environment" section: improve clarity and formatting of steps, update YAML example, and refine secret handling explanation --- content/docs/esc/get-started/_index.md | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index 2253098981f0..007cc4f5ef71 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -69,18 +69,18 @@ esc login You'll be prompted to log in via your browser (which opens automatically) or with an access token. 1. **Create an environment** in the Pulumi Cloud console: + + 1. Open [Pulumi Cloud](https://app.pulumi.com) and log in + 1. Select **Environments** in the left navigation + 1. Select **Create environment** + 1. Choose **New Environment** + 1. For **Project name**, enter: `my-project` + 1. For **Environment name**, enter: `dev` + 1. Select **Create Environment** - 1. Open [Pulumi Cloud](https://app.pulumi.com) and log in - 1. Select **Environments** in the left navigation - 1. Select **Create environment** - 1. Choose **New Environment** - 1. For **Project name**, enter: `my-project` - 1. For **Environment name**, enter: `dev` - 1. Select **Create Environment** + ![Create Environment dialog in Pulumi Cloud showing fields for project name (my-project) and environment name (dev)](./images/esc-create-environment.png) -![Create Environment dialog in Pulumi Cloud showing fields for project name (my-project) and environment name (dev)](./images/esc-create-environment.png) - -Your environment is now created and ready to store configuration and secrets. + Your environment is now created and ready to store configuration and secrets. ## Store configuration and secrets @@ -88,22 +88,22 @@ Add both plaintext configuration and encrypted secrets to your environment: 1. In the **Environment definition** editor, erase the contents and replace them with the following YAML: - ```yaml - values: - region: us-west-2 - apiKey: - fn::secret: demo-secret-123 - ``` + ```yaml + values: + region: us-west-2 + apiKey: + fn::secret: demo-secret-123 + ``` - This defines two values: `region` (a plaintext value) and `apiKey` (a secret value, marked with `fn::secret`). + This defines two values: `region` (a plaintext value) and `apiKey` (a secret value, denoted with `fn::secret`). -![ESC environment editor showing YAML definition with region and apiKey values before saving](./images/esc-env-edit-pre-save.png) + ![ESC environment editor showing YAML definition with region and apiKey values before saving](./images/esc-env-edit-pre-save.png) 1. Select **Save** -Watch what happens: ESC automatically encrypts the secret value. The plaintext `demo-secret-123` is replaced with `[secret]` in the editor, showing that your secret is now encrypted and stored securely. + Watch what happens: ESC automatically encrypts the secret value. The plaintext `demo-secret-123` is replaced with an encrypted value, and the preview shows `[secret]` to indicate that this is a secret value. -![ESC environment editor showing encrypted secret value displayed as [secret] after saving](./images/esc-env-edit-post-save.png) + ![ESC environment editor showing encrypted secret value and preview displayed as [secret] after saving](./images/esc-env-edit-post-save.png) ## Retrieve your configuration and secrets @@ -122,7 +122,7 @@ You should see output like: } ``` -That's it! You've created an environment, stored configuration and secrets, and retrieved them programmatically. Notice that the secret is automatically decrypted when you open the environment via the CLI. +That's it! You've created an environment, stored configuration and secrets, and retrieved them interactively with the CLI. Notice that the secret is automatically decrypted when you open the environment. ## What's next? From d99adb9decd0d5fc97455b781160321f5ec95a41 Mon Sep 17 00:00:00 2001 From: Cam Date: Fri, 14 Nov 2025 23:48:38 +0000 Subject: [PATCH 09/10] Refactor configuration retrieval in examples: update to use 'region' and 'apiKey' instead of 'myEnvironment' and 'myPassword' across multiple languages --- content/docs/esc/get-started/_index.md | 18 +++++----- .../esc/guides/integrate-with-pulumi-iac.md | 34 +++++++++++-------- .../Program.cs | 10 +++--- .../main.go | 10 +++--- .../src/main/java/myproject/App.java | 10 +++--- .../index.js | 10 +++--- .../__main__.py | 10 +++--- .../index.ts | 10 +++--- 8 files changed, 58 insertions(+), 54 deletions(-) diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index 007cc4f5ef71..a14640887fd5 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -66,13 +66,13 @@ See the [ESC installation docs](/docs/install/esc/) for more options. esc login ``` -You'll be prompted to log in via your browser (which opens automatically) or with an access token. +You'll be prompted to log in via your browser or with an access token. Follow the instructions to authenticate. 1. **Create an environment** in the Pulumi Cloud console: 1. Open [Pulumi Cloud](https://app.pulumi.com) and log in 1. Select **Environments** in the left navigation - 1. Select **Create environment** + 1. Select **+ Create Environment** 1. Choose **New Environment** 1. For **Project name**, enter: `my-project` 1. For **Environment name**, enter: `dev` @@ -90,9 +90,9 @@ Add both plaintext configuration and encrypted secrets to your environment: ```yaml values: - region: us-west-2 - apiKey: - fn::secret: demo-secret-123 + region: us-west-2 + apiKey: + fn::secret: demo-secret-123 ``` This defines two values: `region` (a plaintext value) and `apiKey` (a secret value, denoted with `fn::secret`). @@ -101,7 +101,7 @@ Add both plaintext configuration and encrypted secrets to your environment: 1. Select **Save** - Watch what happens: ESC automatically encrypts the secret value. The plaintext `demo-secret-123` is replaced with an encrypted value, and the preview shows `[secret]` to indicate that this is a secret value. + Watch what happens: ESC automatically encrypts the secret value. The plaintext `demo-secret-123` is replaced with an encrypted value. ![ESC environment editor showing encrypted secret value and preview displayed as [secret] after saving](./images/esc-env-edit-post-save.png) @@ -117,8 +117,8 @@ You should see output like: ```json { - "region": "us-west-2", - "apiKey": "demo-secret-123" + "apiKey": "demo-secret-123", + "region": "us-west-2" } ``` @@ -130,7 +130,7 @@ That's it! You've created an environment, stored configuration and secrets, and Pulumi users typically integrate ESC with their IaC workflows to centralize secrets and configuration across all stacks. If you already use Pulumi IaC, learn how to reference ESC environments in your Pulumi programs: -**[Integrate ESC with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** +- **[Integrate ESC with Pulumi IaC](/docs/esc/guides/integrate-with-pulumi-iac/)** New to Pulumi IaC? Start with the [Pulumi IaC Get Started guide](/docs/get-started/) first. diff --git a/content/docs/esc/guides/integrate-with-pulumi-iac.md b/content/docs/esc/guides/integrate-with-pulumi-iac.md index bc2c246ad29e..bf128b65bd65 100644 --- a/content/docs/esc/guides/integrate-with-pulumi-iac.md +++ b/content/docs/esc/guides/integrate-with-pulumi-iac.md @@ -19,7 +19,7 @@ This guide shows you how to integrate Pulumi ESC with your Pulumi IaC projects t **This guide is for existing Pulumi IaC users.** If you're new to Pulumi IaC, start with the [Pulumi IaC Get Started guide](/docs/get-started/) first. {{< /notes >}} -If you just completed the [ESC Get Started guide](/docs/esc/get-started/), you already have an environment. This guide shows you how to reference it from your Pulumi stack configuration. +If you completed the [ESC Get Started guide](/docs/esc/get-started/), you already have an environment with values like `region` and `apiKey`. This guide shows you how to reference that same environment from your Pulumi stack configuration. ## Prerequisites @@ -39,49 +39,53 @@ environment: - / ``` -For example, if your ESC environment is `my-org/aws-prod`: +For example, if your ESC environment is `my-project/dev`: ```yaml environment: - - my-org/aws-prod + - my-project/dev ``` You can also reference multiple environments, which will be merged in order (later values override earlier ones): ```yaml environment: - - my-org/common - - my-org/aws-prod + - my-project/common + - my-project/dev ``` ### Step 2: Define configuration in your ESC environment ESC environments are YAML documents typically managed in Pulumi Cloud. To edit your environment: -**Via the Pulumi Cloud console:** +#### Via the Pulumi Cloud console 1. Navigate to [Pulumi Cloud](https://app.pulumi.com) 1. Select **Environments** in the left navigation 1. Select your environment to open the editor 1. Add configuration in the YAML editor -**Via the CLI:** +#### Via the CLI ```bash esc env edit / ``` -In your ESC environment, use the `pulumiConfig` block to expose values to Pulumi IaC: +In your ESC environment, use the `pulumiConfig` block to expose values to Pulumi IaC. If you're using the environment from the Get Started guide, wrap your existing values in a `pulumiConfig` block: ```yaml values: pulumiConfig: - myEnvironment: production - myPassword: - fn::secret: demo-api-key-123 + region: us-west-2 + apiKey: + fn::secret: demo-secret-123 ``` -The `pulumiConfig` block is the bridge between ESC and Pulumi IaC. Any values you define under `pulumiConfig` become available in your Pulumi program through the standard Configuration API. This allows you to centralize all your configuration and secrets in ESC while accessing them through familiar Pulumi config patterns like `config.get()` or `config.require()`. +Values in `pulumiConfig` can be strings, numbers, booleans, or secrets (using `fn::secret`). + +The `pulumiConfig` block is the bridge between ESC and Pulumi IaC. Any values you define under `pulumiConfig` become available in your Pulumi program through the standard Configuration API. + +This allows you to centralize all your configuration and secrets in ESC while accessing them through familiar Pulumi config patterns like `config.get()` or `config.require()`. ### Step 3: Access configuration in your code @@ -89,7 +93,7 @@ Use Pulumi's standard Configuration API to access these values in your infrastru {{< example-program path="aws-import-export-pulumi-config" >}} -That's it! Your Pulumi program now retrieves configuration and secrets from ESC. Run `pulumi preview` or `pulumi up` to see it in action. +Your Pulumi program now retrieves configuration and secrets from ESC. Run `pulumi preview` or `pulumi up` to see it in action. ## Common patterns @@ -113,7 +117,7 @@ values: AWS_SESSION_TOKEN: ${aws.login.sessionToken} ``` -This pattern works everywhere Pulumi runs: locally, in CI/CD, Pulumi Deployments, and GitHub Actions. +This pattern works everywhere Pulumi runs: locally, in CI/CD, Pulumi Deployments, and GitHub Actions. Similar patterns are available for Azure (`fn::open::azure-login`) and GCP (`fn::open::gcp-login`). Learn more in [Setting up OIDC](/docs/esc/guides/setting-up-oidc/). @@ -161,4 +165,4 @@ Learn more in [Importing environments](/docs/esc/guides/importing-environments/) - [Setting up OIDC](/docs/esc/guides/setting-up-oidc/) - Generate dynamic cloud credentials - [Integrating external secrets](/docs/esc/guides/external-secrets/) - Pull from AWS, Azure, GCP vaults - [Importing environments](/docs/esc/guides/importing-environments/) - Compose configuration hierarchies -- [ESC + Pulumi IaC reference](/docs/esc/integrations/infrastructure/pulumi-iac/) - Complete integration documentation +- [Pulumi IaC integration reference](/docs/esc/integrations/infrastructure/pulumi-iac/) - Complete integration documentation diff --git a/static/programs/aws-import-export-pulumi-config-csharp/Program.cs b/static/programs/aws-import-export-pulumi-config-csharp/Program.cs index c14414b1a5b3..065ebb25727f 100644 --- a/static/programs/aws-import-export-pulumi-config-csharp/Program.cs +++ b/static/programs/aws-import-export-pulumi-config-csharp/Program.cs @@ -11,15 +11,15 @@ static async Task Main(string[] args) // Import the configuration values var config = new Config(); - // Retrieve the value of "myEnvironment" and "myPassword" - var environment = config.Get("myEnvironment"); - var password = config.GetSecret("myPassword"); + // Retrieve the value of "region" and "apiKey" + var region = config.Get("region"); + var apiKey = config.GetSecret("apiKey"); // Return a dictionary of outputs return new Dictionary { - ["Environment"] = environment, - ["Password"] = password + ["Region"] = region, + ["ApiKey"] = apiKey }; }); } diff --git a/static/programs/aws-import-export-pulumi-config-go/main.go b/static/programs/aws-import-export-pulumi-config-go/main.go index 87715afe6b87..2d8011da77b3 100644 --- a/static/programs/aws-import-export-pulumi-config-go/main.go +++ b/static/programs/aws-import-export-pulumi-config-go/main.go @@ -10,13 +10,13 @@ func main() { // Create a Pulumi Config config := config.New(ctx, "") - // Retrieve the value of "myEnvironment" and "myPassword" - environment := config.Get("myEnvironment") - password := config.GetSecret("myPassword") + // Retrieve the value of "region" and "apiKey" + region := config.Get("region") + apiKey := config.GetSecret("apiKey") // Export values as outputs - ctx.Export("Environment", pulumi.String(environment)) - ctx.Export("Password", pulumi.StringOutput(password)) + ctx.Export("Region", pulumi.String(region)) + ctx.Export("ApiKey", pulumi.StringOutput(apiKey)) return nil }) } diff --git a/static/programs/aws-import-export-pulumi-config-java/src/main/java/myproject/App.java b/static/programs/aws-import-export-pulumi-config-java/src/main/java/myproject/App.java index 08d73725ace7..1dba9d1550ce 100644 --- a/static/programs/aws-import-export-pulumi-config-java/src/main/java/myproject/App.java +++ b/static/programs/aws-import-export-pulumi-config-java/src/main/java/myproject/App.java @@ -9,13 +9,13 @@ public static void main(String[] args) { // Create a Pulumi Config var config = ctx.config(); - // Retrieve the values of "myEnvironment" and "myPassword" - var environment = config.get("myEnvironment"); - var password = config.getSecret("myPassword"); + // Retrieve the values of "region" and "apiKey" + var region = config.get("region"); + var apiKey = config.getSecret("apiKey"); // Export the values as a stack outputs - ctx.export("Environment", Output.of(environment)); - ctx.export("Password", Output.of(password)); + ctx.export("Region", Output.of(region)); + ctx.export("ApiKey", Output.of(apiKey)); }); } } \ No newline at end of file diff --git a/static/programs/aws-import-export-pulumi-config-javascript/index.js b/static/programs/aws-import-export-pulumi-config-javascript/index.js index 58d2f4f53079..bd6f82be2106 100644 --- a/static/programs/aws-import-export-pulumi-config-javascript/index.js +++ b/static/programs/aws-import-export-pulumi-config-javascript/index.js @@ -4,12 +4,12 @@ const pulumi = require("@pulumi/pulumi"); // Create a new Pulumi Config const config = new pulumi.Config(); -// Retrieve the values of "myEnvironment" and "myPassword" -const environment = config.get("myEnvironment"); -const password = config.getSecret("myPassword"); +// Retrieve the values of "region" and "apiKey" +const region = config.get("region"); +const apiKey = config.getSecret("apiKey"); // Export values as stack outputs module.exports = { - Environment: environment, - Password: password, + Region: region, + ApiKey: apiKey, }; diff --git a/static/programs/aws-import-export-pulumi-config-python/__main__.py b/static/programs/aws-import-export-pulumi-config-python/__main__.py index 3dd4304d652a..4f673bbab6cf 100644 --- a/static/programs/aws-import-export-pulumi-config-python/__main__.py +++ b/static/programs/aws-import-export-pulumi-config-python/__main__.py @@ -3,10 +3,10 @@ # Import the configuration values config = pulumi.Config() -# Retrieve the values of "myEnvironment" and "myPassword" -environment = config.get("myEnvironment") -password = config.get_secret("myPassword") +# Retrieve the values of "region" and "apiKey" +region = config.get("region") +api_key = config.get_secret("apiKey") # Export the values as an output -pulumi.export('Environment', environment) -pulumi.export("Password", password) \ No newline at end of file +pulumi.export('Region', region) +pulumi.export("ApiKey", api_key) \ No newline at end of file diff --git a/static/programs/aws-import-export-pulumi-config-typescript/index.ts b/static/programs/aws-import-export-pulumi-config-typescript/index.ts index b64c56ac6ff5..bec747751f35 100644 --- a/static/programs/aws-import-export-pulumi-config-typescript/index.ts +++ b/static/programs/aws-import-export-pulumi-config-typescript/index.ts @@ -3,10 +3,10 @@ import * as pulumi from "@pulumi/pulumi"; // Create a new Pulumi Config const config = new pulumi.Config(); -// Retrieve the values of "myEnvironment" and "myPassword" -const environment = config.get("myEnvironment"); -const password = config.getSecret("myPassword"); +// Retrieve the values of "region" and "apiKey" +const region = config.get("region"); +const apiKey = config.getSecret("apiKey"); // Export values as stack output -export const Environment = environment; -export const Password = password; +export const Region = region; +export const ApiKey = apiKey; From f61e64a9801f80d7a6c83d77965079ed622c99bd Mon Sep 17 00:00:00 2001 From: Cam Date: Sat, 15 Nov 2025 01:34:39 +0000 Subject: [PATCH 10/10] Refine documentation for ESC integration: streamline environment editing instructions and enhance clarity on using CLI and Pulumi Cloud console --- content/docs/esc/get-started/_index.md | 2 +- .../docs/esc/guides/integrate-with-pulumi-iac.md | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/content/docs/esc/get-started/_index.md b/content/docs/esc/get-started/_index.md index a14640887fd5..be045e837165 100644 --- a/content/docs/esc/get-started/_index.md +++ b/content/docs/esc/get-started/_index.md @@ -122,7 +122,7 @@ You should see output like: } ``` -That's it! You've created an environment, stored configuration and secrets, and retrieved them interactively with the CLI. Notice that the secret is automatically decrypted when you open the environment. +You've created an environment, stored configuration and secrets, and retrieved them interactively with the CLI. Notice that the secret is automatically decrypted when you open the environment. ## What's next? diff --git a/content/docs/esc/guides/integrate-with-pulumi-iac.md b/content/docs/esc/guides/integrate-with-pulumi-iac.md index bf128b65bd65..6afc56deac03 100644 --- a/content/docs/esc/guides/integrate-with-pulumi-iac.md +++ b/content/docs/esc/guides/integrate-with-pulumi-iac.md @@ -56,21 +56,14 @@ environment: ### Step 2: Define configuration in your ESC environment -ESC environments are YAML documents typically managed in Pulumi Cloud. To edit your environment: - -#### Via the Pulumi Cloud console - -1. Navigate to [Pulumi Cloud](https://app.pulumi.com) -1. Select **Environments** in the left navigation -1. Select your environment to open the editor -1. Add configuration in the YAML editor - -#### Via the CLI +ESC environments are YAML documents that you can edit using the CLI or Pulumi Cloud console. Use the CLI to edit your environment: ```bash esc env edit / ``` +You can also edit environments in the [Pulumi Cloud console](https://app.pulumi.com) if you prefer a visual editor. + In your ESC environment, use the `pulumiConfig` block to expose values to Pulumi IaC. If you're using the environment from the Get Started guide, wrap your existing values in a `pulumiConfig` block: ```yaml