Understanding Stack Outputs
Now let’s explore stack outputs. Stack outputs are values exported by a given stack. These values are shown during an update, can be retrieved with the Pulumi CLI, and are displayed in Pulumi Cloud once you’ve exported them. Examples include resource IDs, computed IP addresses, and DNS names. They’re useful in many ways, such as when you want to run CLI commands that reference those values.
To illustrate how stack outputs work, let’s set one programmatically. At the end of index.tsindex.js__main__.pymain.goProgram.csProgram.fsProgram.vbApp.javaPulumi.yaml in my-first-app, add the following line:
export const url = pulumi.interpolate`http://localhost:${frontendPort}`;pulumi.export("url", pulumi.Output.format("http://localhost:{0}", frontend_port))Now, run pulumi up:
pulumi up
Previewing update (dev)
View in Browser: https://app.pulumi.com/***/my-first-app/dev/previews/......
Updating (dev)
View in Browser: https://app.pulumi.com/***/my-first-app/dev/updates/3...
pulumi:pulumi:Stack my-first-app-dev running pulumi:pulumi:Stack my-first-app-dev
Outputs: url: "http://localhost:3001"...Notice that there is now a stack output for the value of the key url.
We can get this value by running pulumi stack output <key> on any particular stack.
pulumi stack output urlhttp://localhost:3001We can use it to open our website in a browser:
open $(pulumi stack output url)Before moving on, destroy the dev stack, as we’ll no longer need it for this tutorial:
pulumi destroy --yes...
Destroying (dev)
Type Name Status - pulumi:pulumi:Stack my-first-app-staging deleted (0.16s) - ├─ docker:index:Container backendContainer deleted (0.43s) - ├─ docker:index:Container mongoContainer deleted (0.51s) - ├─ docker:index:Container frontendContainer deleted (0.31s) - ├─ docker:index:RemoteImage mongoImage deleted (0.60s) - ├─ docker:index:RemoteImage frontendImage deleted (1s) - ├─ docker:index:RemoteImage backendImage deleted (1s) - └─ docker:index:Network network deleted (2s)
Outputs: - url: "http://localhost:3001"
Resources: - 8 deleted
Duration: 6sMaking a stack configurable#
One of the benefits of using Pulumi stacks is being able to configure each one independently. In this example, you’ll learn how to do so by applying different settings to the dev and staging stacks.
For the dev stack, your work is already done; the stack itself may be empty (we just destroyed it above), but its configuration settings are still there in Pulumi.dev.yaml in case you need them again. Let’s take a look. First, make sure the dev stack is still active:
pulumi stack select devThen run the following command to show all of its configuration values:
pulumi configKEY VALUEbackendPort 3000database cartfrontendPort 3001mongoHost mongodb://mongo:27017mongoPort 27017nodeEnvironment developmentprotocol http://Now let’s set the configuration for the staging stack — only this time, we’ll use a different value for the frontendPort:
pulumi stack select staging
pulumi config set frontendPort 3002pulumi config set backendPort 3000pulumi config set mongoPort 27017pulumi config set mongoHost mongodb://mongo:27017pulumi config set database cartpulumi config set nodeEnvironment developmentpulumi config set protocol http://You should now have two stack-configuration files in your project folder: Pulumi.dev.yaml and Pulumi.staging.yaml. If you take a look at them, you’ll see each one has the value for frontendPort set (along with some other values we set in the Fundamentals tutorial):
cat Pulumi.staging.yaml
config: my-first-app:backendPort: "3000" my-first-app:database: cart my-first-app:frontendPort: "3002" my-first-app:mongoHost: mongodb://mongo:27017 my-first-app:mongoPort: "27017" my-first-app:nodeEnvironment: development my-first-app:protocol: http://Now, if you run pulumi up on the staging stack, you’ll see that the frontend port is 3002:
pulumi up
Previewing update (staging)......
Outputs: url: "http://localhost:3002"...Next up, we’ll explore how to share outputs with other stacks. Let’s go!