diff --git a/content/docs/iac/get-started/aws/modify-program.md b/content/docs/iac/get-started/aws/modify-program.md
index 3d24782ae415..595401497ad6 100644
--- a/content/docs/iac/get-started/aws/modify-program.md
+++ b/content/docs/iac/get-started/aws/modify-program.md
@@ -570,6 +570,6 @@ This will reveal your new website!
Feel free to experiment, such as changing the contents of `index.html` and redeploying.
-Next, let's wrap this website up into an infrastructure abstraction.
+Next, wrap the website into an infrastructure abstraction.
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/azure/_index.md b/content/docs/iac/get-started/azure/_index.md
index 6bacb90e76b3..6a52045bbb14 100644
--- a/content/docs/iac/get-started/azure/_index.md
+++ b/content/docs/iac/get-started/azure/_index.md
@@ -1,8 +1,8 @@
---
-title_tag: Get Started with Azure
-meta_desc: This page provides an overview and guide on how to get started with Azure.
title: Azure
-h1: Get started with Pulumi & Azure
+title_tag: Get started with Pulumi and Azure
+h1: Get started with Pulumi and Azure
+meta_desc: This page provides an overview and guide on how to get started with Azure.
menu:
iac:
name: Azure
@@ -17,8 +17,55 @@ aliases:
- /docs/get-started/azure/
- /docs/quickstart/azure/
- /docs/clouds/azure/get-started/
+ - /docs/iac/get-started/azure/deploy-changes/
+ - /docs/iac/get-started/azure/review-project/
---
-{{< cloud-intro "Microsoft Azure" >}}
+**Infrastructure as code (IaC)** lets you deploy, change, and manage infrastructure safely, consistently,
+and repeatably using code rather than a graphical user interface.
+
+Complete this step-by-step tutorial to deploy an Azure Blob Storage-based website using IaC.
+
+## Before you begin
+
+Make sure you have the Azure CLI installed and signed in to the Azure subscription you plan to use (for example, `az login`). Then choose your language and ensure you've performed any prerequisites:
+
+{{< chooser language "typescript,python,go,csharp,java,yaml" / >}}
+
+{{% choosable language "typescript" %}}
+
+* Node.js and npm installed locally
+
+{{% /choosable %}}
+
+{{% choosable language "python" %}}
+
+* Python and pip, Poetry or uv installed locally
+
+{{% /choosable %}}
+
+{{% choosable language "go" %}}
+
+* Go installed locally
+
+{{% /choosable %}}
+
+{{% choosable language "csharp" %}}
+
+* .NET installed locally
+
+{{% /choosable %}}
+
+{{% choosable language "java" %}}
+
+* Java 11+ and Maven 3.6.1+ installed locally
+
+{{% /choosable %}}
+
+{{% choosable language "yaml" %}}
+
+* A text editor
+
+{{% /choosable %}}
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/azure/begin.md b/content/docs/iac/get-started/azure/begin.md
index 2c502f059cef..40b8a1c506c8 100644
--- a/content/docs/iac/get-started/azure/begin.md
+++ b/content/docs/iac/get-started/azure/begin.md
@@ -1,8 +1,9 @@
---
-title_tag: Before You Begin | Azure
+title_tag: Install Pulumi | Azure
meta_desc: This page provides an overview on how to get started with Pulumi when starting an Azure project.
-title: Before you begin
-h1: "Pulumi & Azure: Before you begin"
+title: Install Pulumi
+h1: "Get started with Pulumi and Azure"
+stepper_link: "I'm ready to begin"
weight: 2
menu:
iac:
@@ -14,78 +15,9 @@ aliases:
- /docs/quickstart/azure/begin/
- /docs/quickstart/azure/install-pulumi/
- /docs/quickstart/azure/install-language-runtime/
- - /docs/quickstart/azure/configure/
- /docs/clouds/azure/get-started/begin/
---
-Before you get started using Pulumi, let's run through a few quick steps to ensure your environment is set up correctly.
-
-### Install Pulumi
-
-{{< install-pulumi >}}
-{{% notes "info" %}}
-All Windows examples in this tutorial assume you are running in PowerShell.
-{{% /notes %}}
-{{< /install-pulumi >}}
-
-Next, install the required language runtime, if you have not already.
-
-### Install Language Runtime
-
-#### Choose Your Language
-
-{{< chooser language "typescript,python,go,csharp,java,yaml" / >}}
-
-{{% choosable language "typescript" %}}
-{{< install-node >}}
-{{% /choosable %}}
-
-{{% choosable language python %}}
-{{< install-python >}}
-{{% /choosable %}}
-
-{{% choosable language go %}}
-{{< install-go >}}
-{{% /choosable %}}
-
-{{% choosable language "csharp,fsharp,visualbasic" %}}
-{{< install-dotnet >}}
-{{% /choosable %}}
-
-{{% choosable language java %}}
-{{< install-java >}}
-{{% /choosable %}}
-
-{{% choosable language yaml %}}
-{{< install-yaml >}}
-{{% /choosable %}}
-
-Finally, configure Pulumi with Microsoft Azure.
-
-### Configure Pulumi to access your Microsoft Azure account
-
-Pulumi requires cloud credentials to manage and provision resources. Pulumi can authenticate to Azure using a user account or service principal that has **Programmatic access** with rights to deploy and manage your Azure resources.
-
-{{% notes type="info" %}}
-Pulumi relies on the Azure SDK to authenticate requests from your computer to Azure. Your credentials are never sent to pulumi.com.
-{{% /notes %}}
-
-In this guide, you will need a user account with permissions to create and populate Blob storage containers and provide anonymous access to a Blob file.
-
-When developing locally, we recommend that you install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) and then authorize access with a user account.
-
-```bash
-az login
-```
-
-After successfully logging in, you are ready to go.
-
-{{% notes type="info" %}}
-The Azure CLI, and thus Pulumi, will use the default subscription for the account. You can change the active subscription with the [`az account set`](https://docs.microsoft.com/en-us/cli/azure/account?view=azure-cli-latest#az_account_set) command.
-{{% /notes %}}
-
-For additional information on authenticating with Azure, or to login with a service principal, see [Azure Setup](/registry/packages/azure-native/installation-configuration/).
-
-Next, you'll create a new Pulumi project.
+{{< get-started-install-body >}}
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/azure/configure.md b/content/docs/iac/get-started/azure/configure.md
new file mode 100644
index 000000000000..af893593cc52
--- /dev/null
+++ b/content/docs/iac/get-started/azure/configure.md
@@ -0,0 +1,96 @@
+---
+title_tag: Configure access | Azure
+title: Configure access
+h1: "Get started with Pulumi and Azure"
+meta_desc: This page provides an overview on how to get started with Pulumi when starting an Azure project.
+weight: 3
+menu:
+ iac:
+ name: Configure access
+ parent: azure-get-started
+ weight: 3
+ identifier: azure-get-started.configure
+aliases:
+ - /docs/quickstart/azure/configure/
+ - /docs/clouds/azure/get-started/configure/
+---
+
+## Configure access to Azure
+
+Pulumi's CLI needs access to your Azure account to manage cloud resources.
+
+If you've already installed and configured the Azure CLI, Pulumi will respect and use your configuration settings.
+
+You must use an Azure account that has rights to deploy and manage resources, such as storage accounts and blob containers.
+
+### Testing access
+
+To test that your Azure access is configured properly, run:
+
+{{% choosable os "linux,macos" %}}
+
+```bash
+$ az account show
+```
+
+{{% /choosable %}}
+
+{{% choosable os "windows" %}}
+
+```powershell
+> az account show
+```
+
+{{% /choosable %}}
+
+If your Azure subscription details are printed, your configuration is correct. If not, read on:
+
+```json
+{
+ "environmentName": "AzureCloud",
+ "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
+ "isDefault": true,
+ "name": "My Subscription",
+ "state": "Enabled",
+ "tenantId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
+ "user": {
+ "name": "user@example.com",
+ "type": "user"
+ }
+}
+```
+
+### Alternative approaches
+
+If you don't have the Azure CLI installed, or you plan on using Pulumi in a CI/CD pipeline, you can create a service principal and set the following environment variables on your workstation:
+
+{{% choosable os "linux,macos" %}}
+
+```bash
+$ export ARM_CLIENT_ID="
+
-Now that your storage account has been provisioned, let's modify it to host a static website.
+Now that the storage account has been provisioned, you'll update it to host a static website.
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/azure/destroy-stack.md b/content/docs/iac/get-started/azure/destroy-stack.md
index 96b30537d228..fbbbd54d4a6f 100644
--- a/content/docs/iac/get-started/azure/destroy-stack.md
+++ b/content/docs/iac/get-started/azure/destroy-stack.md
@@ -1,12 +1,12 @@
---
title_tag: Destroy the Stack | Azure
-meta_desc: This page provides an overview of how to destroy a Pulumi stack of an Azure project.
title: Destroy stack
-h1: "Pulumi & Azure: Destroy stack"
+h1: "Get started with Pulumi and Azure"
+meta_desc: This page provides an overview of how to destroy a Pulumi stack of an Azure project.
weight: 8
menu:
iac:
- name: Destroy stack
+ name: Cleanup & destroy
identifier: azure-get-started.destroy-stack
parent: azure-get-started
weight: 8
@@ -15,15 +15,27 @@ aliases:
- /docs/clouds/azure/get-started/destroy-stack/
---
-Now that you've seen how to deploy changes to our program, let's clean up and tear down the resources that are part of your stack.
+## Cleanup & destroy the stack
+
+Our final step is to clean up all of the resources we've provisioned. This is as simple as running `pulumi destroy`:
-To destroy resources, run the following:
+{{% choosable os "linux,macos" %}}
```bash
-pulumi destroy
+$ pulumi destroy
+```
+
+{{% /choosable %}}
+
+{{% choosable os "windows" %}}
+
+```powershell
+> pulumi destroy
```
-You'll be prompted to make sure you really want to delete these resources. This can take a minute or two; Pulumi waits until all resources are shut down and deleted before it considers the destroy operation to be complete.
+{{% /choosable %}}
+
+Just like `pulumi up`, `pulumi destroy` shows you a preview before performing any changes:
```
Previewing destroy (dev):
@@ -36,13 +48,20 @@ Previewing destroy (dev):
- └─ azure-native:resources:ResourceGroup resourceGroup delete
Outputs:
- - primaryStorageKey: "
+
-Now that your bucket has been provisioned, let's modify the bucket to host a static website.
+Now that the storage bucket has been provisioned, you'll update it to host a static website.
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/gcp/destroy-stack.md b/content/docs/iac/get-started/gcp/destroy-stack.md
index 86fd709b9680..8bb1bfa816a2 100644
--- a/content/docs/iac/get-started/gcp/destroy-stack.md
+++ b/content/docs/iac/get-started/gcp/destroy-stack.md
@@ -1,33 +1,47 @@
---
title_tag: Destroy the Stack | Google Cloud
-meta_desc: This page provides an overview of how to destroy a Pulumi stack of a Google Cloud (GCP) project.
title: Destroy stack
-h1: "Pulumi & Google Cloud: Destroy stack"
+h1: "Get started with Pulumi and Google Cloud"
+meta_desc: This page provides an overview of how to destroy a Pulumi stack of a Google Cloud project.
weight: 8
menu:
- iac:
- name: Destroy stack
- identifier: gcp-get-started.destroy-stack
- parent: gcp-get-started
- weight: 8
+ iac:
+ name: Cleanup & destroy
+ identifier: gcp-get-started.destroy-stack
+ parent: gcp-get-started
+ weight: 8
aliases:
- /docs/quickstart/gcp/destroy-stack/
- /docs/clouds/gcp/get-started/destroy-stack/
---
-Now that you've seen how to deploy and manage cloud resources with Pulumi, let's clean up by tearing down all of the resources that belong to this stack.
+## Cleanup & destroy the stack
-To do so, run the following:
+Our final step is to clean up all of the resources we've allocated in this tutorial.
+
+Run the `pulumi destroy` command to delete all cloud resources in this project/stack:
+
+{{% choosable os "linux,macos" %}}
```bash
$ pulumi destroy
```
-Again you'll be presented with a preview of the changes to be made. Choose `yes`. The destroy operation may take few moments, as Pulumi waits for all resources are to be deleted before considering the operation complete:
+{{% /choosable %}}
+
+{{% choosable os "windows" %}}
+
+```powershell
+> pulumi destroy
+```
+
+{{% /choosable %}}
+
+Just like `pulumi up`, you'll be shown a preview to ensure that you want to proceed:
```
-Previewing destroy (dev)
+Previewing destroy (dev):
Type Name Plan
- pulumi:pulumi:Stack quickstart-dev delete
@@ -36,24 +50,30 @@ Previewing destroy (dev)
- └─ gcp:storage:Bucket my-bucket delete
Outputs:
- - bucketEndpoint: "http://storage.googleapis.com/my-bucket-daa12be/index.html-a52debd"
- - bucketName : "gs://my-bucket-daa12be"
+ - url : "http://storage.googleapis.com/my-bucket-daa12be/index.html"
Resources:
- 4 to delete
-Do you want to perform this destroy? yes
-Destroying (dev)
+Do you want to perform this destroy?
+> yes
+ no
+ details
+```
+
+As with an update, we can choose `no` or `details`; select `yes` to proceed:
+
+```
+Destroying (dev):
Type Name Status
- - pulumi:pulumi:Stack quickstart-dev deleted
+ - pulumi:pulumi:Stack quickstart-dev deleted (0.31s)
- ├─ gcp:storage:BucketIAMBinding my-bucket-binding deleted (6s)
- ├─ gcp:storage:BucketObject index.html deleted (0.78s)
- └─ gcp:storage:Bucket my-bucket deleted (1s)
Outputs:
- - bucketEndpoint: "http://storage.googleapis.com/my-bucket-daa12be/index.html-a52debd"
- - bucketName : "gs://my-bucket-daa12be"
+ - url : "http://storage.googleapis.com/my-bucket-daa12be/index.html"
Resources:
- 4 deleted
@@ -61,16 +81,29 @@ Resources:
Duration: 9s
```
-Optionally, to delete the stack itself, you can also run [`pulumi stack rm`](/docs/cli/commands/pulumi_stack_rm). Doing so removes the stack entirely from the Pulumi Cloud, along with all of its update history.
+At this stage, your stack still exists, but all cloud resources have been deleted from it.
+
+## Remove the stack
+
+The final step is to remove the stack itself. Destroy keeps the stack around so that you still have the full
+history of what happened to the stack. Running [`pulumi stack rm`](/docs/cli/commands/pulumi_stack_rm) will
+delete it entirely, including all history and state snapshots. Be careful, this step cannot be undone!
-Congratulations! You've successfully provisioned some cloud resources using Pulumi. By completing this guide you have successfully:
+{{% choosable "os" "macos,linux" %}}
+
+```bash
+$ pulumi stack rm
+```
+
+{{% /choosable %}}
+{{% choosable "os" "windows" %}}
+
+```powershell
+> pulumi stack rm
+```
-- Created a Pulumi new project.
-- Provisioned a new storage bucket.
-- Added an `index.html` file to your bucket.
-- Served the file as a static website.
-- Destroyed the resources you've provisioned.
+{{% /choosable %}}
-On the next page, we have a collection of examples and tutorials that you can deploy as they are or use them as a foundation for your own applications and infrastructure projects.
+You'll be prompted to confirm the removal. Confirm it to successfully complete this tutorial.
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/gcp/modify-program.md b/content/docs/iac/get-started/gcp/modify-program.md
index d4df8165d842..c463c8d661f8 100644
--- a/content/docs/iac/get-started/gcp/modify-program.md
+++ b/content/docs/iac/get-started/gcp/modify-program.md
@@ -1,12 +1,12 @@
---
-title_tag: Modify the Program | Google Cloud
-meta_desc: This page provides an overview on how to update Google Cloud (GCP) project from a Pulumi program.
-title: Modify program
-h1: "Pulumi & Google Cloud: Modify program"
+title_tag: Make an Update | Google Cloud
+title: Make an update
+h1: "Get started with Pulumi and Google Cloud"
+meta_desc: This page provides an overview on how to update a Google Cloud project from a Pulumi program.
weight: 6
menu:
iac:
- name: Modify program
+ name: Make an update
identifier: gcp-get-started.modify-program
parent: gcp-get-started
weight: 6
@@ -14,9 +14,30 @@ menu:
aliases:
- /docs/quickstart/gcp/modify-program/
- /docs/clouds/gcp/get-started/modify-program/
+ - /docs/quickstart/gcp/deploy-changes/
+ - /docs/clouds/gcp/get-started/deploy-changes/
---
-Now that your storage bucket is provisioned, let's add an object to it. First, from within your project directory, create a new `index.html` file with some content in it.
+## Make an update
+
+Now you will update your project to serve a static website out of your Google Cloud Storage bucket. You will change
+your code and then re-run `pulumi up` which will update your infrastructure.
+
+### Add new resources
+
+Pulumi knows how to evolve your current infrastructure to your project's new desired state, both for
+the first deployment as well as subsequent updates.
+
+To turn your bucket into a static website, you will add two new Google Cloud Storage resources:
+
+1. [`BucketObject`](/registry/packages/gcp/api-docs/storage/bucketobject/):
+ uploads your website content to the bucket
+2. [`BucketIAMBinding`](/registry/packages/gcp/api-docs/storage/bucketiambinding/):
+ makes the bucket publicly accessible
+
+### Add an index.html
+
+First, from within your project directory, create a new `index.html` file with some content in it.
{{< chooser os "macos,linux,windows" / >}}
@@ -66,15 +87,15 @@ Now that you have an `index.html` file with some content, open {{< langfile >}}
For this, you'll use Pulumi's `FileAsset` class to assign the content of the file to a new `BucketObject`.
-{{< chooser language "typescript,python,go,csharp,java,yaml" / >}}
-
{{% choosable language typescript %}}
-In `index.ts`, create the `BucketObject` right after creating the bucket itself:
+In `index.ts`, create the `BucketObject` by adding this code immediately following the bucket definition:
```typescript
+// Upload the file
const bucketObject = new gcp.storage.BucketObject("index.html", {
bucket: bucket.name,
+ name: "index.html",
source: new pulumi.asset.FileAsset("index.html")
});
```
@@ -83,11 +104,15 @@ const bucketObject = new gcp.storage.BucketObject("index.html", {
{{% choosable language python %}}
-In `__main__.py`, create a new bucket object by adding the following right after creating the bucket itself:
+In `__main__.py`, create a new bucket object by adding this code immediately following the bucket definition:
```python
+# Upload the file
bucket_object = storage.BucketObject(
- "index.html", bucket=bucket.name, source=pulumi.FileAsset("index.html")
+ "index.html",
+ bucket=bucket.name,
+ name="index.html",
+ source=pulumi.FileAsset("index.html")
)
```
@@ -95,11 +120,13 @@ bucket_object = storage.BucketObject(
{{% choosable language go %}}
-In `main.go`, create the `BucketObject` right after creating the bucket itself:
+In `main.go`, create the `BucketObject` by adding this code immediately following the bucket definition:
```go
+// Upload the file
_, err = storage.NewBucketObject(ctx, "index.html", &storage.BucketObjectArgs{
Bucket: bucket.Name,
+ Name: pulumi.String("index.html"),
Source: pulumi.NewFileAsset("index.html"),
})
if err != nil {
@@ -111,12 +138,14 @@ if err != nil {
{{% choosable language csharp %}}
-In `Program.cs`, create the `BucketObject` right after creating the bucket itself:
+In `Program.cs`, create the `BucketObject` by adding this code immediately following the bucket definition:
```csharp
+// Upload the file
var bucketObject = new BucketObject("index.html", new BucketObjectArgs
{
Bucket = bucket.Name,
+ Name = "index.html",
Source = new FileAsset("./index.html")
});
```
@@ -125,7 +154,7 @@ var bucketObject = new BucketObject("index.html", new BucketObjectArgs
{{% choosable language java %}}
-In {{< langfile >}}, import the following additional classes, then create the `BucketObject` right after creating the bucket itself:
+In {{< langfile >}}, import the following additional classes, then create the `BucketObject` immediately following the bucket definition by adding this code:
```java
// ...
@@ -138,11 +167,15 @@ import com.pulumi.gcp.storage.BucketObjectArgs;
public class App {
public static void main(String[] args) {
Pulumi.run(ctx -> {
- // ...
+ // Create a Google Cloud resource (Storage Bucket)
+ var bucket = new Bucket("my-bucket", BucketArgs.builder()
+ // existing bucket configuration
+ .build());
- // Create a Bucket object
+ // Upload the file
var bucketObject = new BucketObject("index.html", BucketObjectArgs.builder()
.bucket(bucket.name())
+ .name("index.html")
.source(new FileAsset("index.html"))
.build()
);
@@ -160,14 +193,14 @@ public class App {
In {{< langfile >}}, create the `BucketObject` right below the bucket itself.
```yaml
-resources:
- # ...
- index-html:
+# Upload the file
+index-html:
type: gcp:storage:BucketObject
properties:
- bucket: ${my-bucket}
- source:
- fn::fileAsset: ./index.html
+ bucket: ${my-bucket}
+ name: index.html
+ source:
+ fn::fileAsset: ./index.html
```
{{% /choosable %}}
@@ -260,6 +293,266 @@ my-bucket-binding:
{{% /choosable %}}
-Next, you'll deploy your changes.
+{{% notes type="info" %}}
+
+If you encounter permission errors when uploading files, the IAM binding may still be propagating. The component
+examples later in this tutorial show how to add explicit dependencies between resources to ensure proper ordering.
+
+{{% /notes %}}
+
+Now that `index.html` exists in the bucket, modify the bucket to serve the file as a static website.
+
+To do that, update the bucket definition to configure its website property. Then, to align with Google Cloud Storage recommendations, set its uniform bucket-level access property to `true`:
+
+{{% choosable language typescript %}}
+
+```typescript
+const bucket = new gcp.storage.Bucket("my-bucket", {
+ location: "US",
+ website: {
+ mainPageSuffix: "index.html"
+ },
+ uniformBucketLevelAccess: true
+});
+```
+
+### Export the website URL
+
+Now to export the website's public URL for easy access, add the `url` export as shown in this example:
+
+```typescript
+// Export the DNS name of the bucket
+export const bucketName = bucket.url;
+
+// Export the bucket's public URL
+export const url = pulumi.concat("http://storage.googleapis.com/", bucket.name, "/", bucketObject.name);
+```
+
+{{% /choosable %}}
+
+{{% choosable language python %}}
+
+```python
+bucket = storage.Bucket(
+ "my-bucket",
+ location="US",
+ website={
+ "main_page_suffix": "index.html"
+ },
+ uniform_bucket_level_access=True,
+)
+```
+
+### Export the website URL
+
+Now to export the website's public URL for easy access, add the `url` export as shown in this example:
+
+```python
+# Export the DNS name of the bucket
+pulumi.export("bucket_name", bucket.url)
+
+# Export the bucket's public URL
+pulumi.export(
+ "url",
+ pulumi.Output.concat(
+ "http://storage.googleapis.com/", bucket.id, "/", bucket_object.name
+ ),
+)
+```
+
+{{% /choosable %}}
+
+{{% choosable language go %}}
+
+```go
+bucket, err := storage.NewBucket(ctx, "my-bucket", &storage.BucketArgs{
+ Location: pulumi.String("US"),
+ Website: storage.BucketWebsiteArgs{
+ MainPageSuffix: pulumi.String("index.html"),
+ },
+ UniformBucketLevelAccess: pulumi.Bool(true),
+})
+if err != nil {
+ return err
+}
+```
+
+### Export the website URL
+
+Now to export the website's public URL for easy access, add the `url` export as shown in this example:
+
+```go
+// Export the DNS name of the bucket
+ctx.Export("bucketName", bucket.Url)
+
+// Export the bucket's public URL
+ctx.Export("url", pulumi.Sprintf("http://storage.googleapis.com/%s/%s", bucket.Name, bucketObject.Name))
+```
+
+{{% /choosable %}}
+
+{{% choosable language csharp %}}
+
+```csharp
+var bucket = new Bucket("my-bucket", new BucketArgs
+{
+ Location = "US",
+ Website = new Pulumi.Gcp.Storage.Inputs.BucketWebsiteArgs
+ {
+ MainPageSuffix = "index.html"
+ },
+ UniformBucketLevelAccess = true
+});
+```
+
+### Export the website URL
+
+Now to export the website's public URL for easy access, add the `url` export to your return `Dictionary` as shown in this example:
+
+```csharp
+return new DictionaryIf you see this page, the nginx web server is successfully installed and +working. Further configuration is required.
+ +For online documentation and support please refer to
+nginx.org.
+Commercial support is available at
+nginx.com.
Thank you for using nginx.
+ + +``` + +Once you are ready to move on, destroy everything you've provisioned in this tutorial. + +{{< get-started-stepper >}} diff --git a/content/docs/iac/get-started/kubernetes/create-project.md b/content/docs/iac/get-started/kubernetes/create-project.md index a10a8f541c45..33514cceb650 100644 --- a/content/docs/iac/get-started/kubernetes/create-project.md +++ b/content/docs/iac/get-started/kubernetes/create-project.md @@ -3,99 +3,173 @@ title_tag: Create a New Project | Kubernetes meta_desc: This page provides an overview of how to create a new Kubernetes + Pulumi project. title: Create project h1: "Pulumi & Kubernetes: Create project" -weight: 3 +weight: 4 menu: iac: name: Create project identifier: kubernetes-get-started.create-project parent: kubernetes-get-started - weight: 3 + weight: 4 aliases: - /docs/quickstart/kubernetes/create-project/ + - /docs/quickstart/kubernetes/review-project/ --- -Now that you have set up your environment let's create your first Pulumi program. -{{< chooser language "typescript,python,go,csharp,java,yaml" / >}} +## Create a new project + +A [**project**](/docs/iac/concepts/projects) is a program in your chosen language that defines a collection of related cloud resources. In this step, you will create a new project. + +### Initializing your project + +Each project lives in its own directory. Create a new one: + +{{% choosable os "linux,macos" %}} + +```bash +$ mkdir quickstart +``` + +{{% /choosable %}} +{{% choosable os "windows" %}} + +```powershell +> mkdir quickstart +``` + +{{% /choosable %}} + +Change into the new directory: + +{{% choosable os "linux,macos" %}} + +```bash +$ cd quickstart +``` + +{{% /choosable %}} +{{% choosable os "windows" %}} + +```powershell +> cd quickstart +``` + +{{% /choosable %}} + +Now initialize a new Pulumi project for Kubernetes using the `pulumi new` command: {{% choosable language typescript %}} +{{% choosable os "linux,macos" %}} + ```bash -$ mkdir quickstart && cd quickstart $ pulumi new kubernetes-typescript ``` +{{% /choosable %}} +{{% choosable os "windows" %}} + +```powershell +> pulumi new kubernetes-typescript +``` + +{{% /choosable %}} + {{% /choosable %}} {{% choosable language python %}} +{{% choosable os "linux,macos" %}} + ```bash -$ mkdir quickstart && cd quickstart $ pulumi new kubernetes-python ``` +{{% /choosable %}} +{{% choosable os "windows" %}} + +```powershell +> pulumi new kubernetes-python +``` + +{{% /choosable %}} + {{% /choosable %}} {{% choosable language go %}} +{{% choosable os "linux,macos" %}} + ```bash -$ mkdir quickstart && cd quickstart $ pulumi new kubernetes-go ``` +{{% /choosable %}} +{{% choosable os "windows" %}} + +```powershell +> pulumi new kubernetes-go +``` + +{{% /choosable %}} + {{% /choosable %}} {{% choosable language csharp %}} +{{% choosable os "linux,macos" %}} + ```bash -$ mkdir quickstart && cd quickstart $ pulumi new kubernetes-csharp ``` +{{% /choosable %}} +{{% choosable os "windows" %}} + +```powershell +> pulumi new kubernetes-csharp +``` + {{% /choosable %}} +{{% /choosable %}} {{% choosable language java %}} +{{% choosable os "linux,macos" %}} + ```bash -$ mkdir quickstart && cd quickstart $ pulumi new kubernetes-java ``` {{% /choosable %}} +{{% choosable os "windows" %}} -{{% choosable language yaml %}} - -```bash -$ mkdir quickstart && cd quickstart -$ pulumi new kubernetes-yaml +```powershell +> pulumi new kubernetes-java ``` {{% /choosable %}} -{{< cli-note >}} - -After logging in, the CLI will proceed with walking you through creating a new project. +{{% /choosable %}} +{{% choosable language yaml %}} -First, you will be asked for a **project name** and **project description**. Hit `ENTER` to accept the default values or specify new values. +{{% choosable os "linux,macos" %}} +```bash +$ pulumi new kubernetes-yaml ``` -This command will walk you through creating a new Pulumi project. -Enter a value or leave blank to accept the (default), and pressIf you see this page, the nginx web server is successfully installed and -working. Further configuration is required.
- -For online documentation and support please refer to
-nginx.org.
-Commercial support is available at
-nginx.com.
Thank you for using nginx.
- - -``` - -Next, we'll destroy the stack. - -{{< get-started-stepper >}} diff --git a/content/docs/iac/get-started/kubernetes/deploy-stack.md b/content/docs/iac/get-started/kubernetes/deploy-stack.md index 289e273bb99f..4ece3588e0d1 100644 --- a/content/docs/iac/get-started/kubernetes/deploy-stack.md +++ b/content/docs/iac/get-started/kubernetes/deploy-stack.md @@ -1,12 +1,12 @@ --- title_tag: Deploy the Stack | Kubernetes -meta_desc: This page provides an overview of how to deploy a Kubernetes project as a Pulumi Stack. -title: Deploy stack -h1: "Pulumi & Kubernetes: Deploy stack" +meta_desc: Learn how to deploy your stack to a Kubernetes project in this guide. +title: Deploy to Kubernetes +h1: "Get started with Pulumi and Kubernetes" weight: 5 menu: iac: - name: Deploy stack + name: Deploy identifier: kubernetes-get-started.deploy-stack parent: kubernetes-get-started weight: 5 @@ -15,38 +15,53 @@ aliases: - /docs/quickstart/kubernetes/deploy-stack/ --- -Deploy the stack: +## Deploy to Kubernetes + +Now run `pulumi up` to start deploying your NGINX deployment: + +{{% choosable "os" "macos,linux" %}} ```bash $ pulumi up ``` -This command instructs Pulumi to determine the resources needed to create the stack. A preview is shown of the changes that will be made: +{{% /choosable %}} +{{% choosable "os" "windows" %}} -```bash -Previewing update (dev) +```powershell +> pulumi up +``` + +{{% /choosable %}} + +This command first shows you a **preview** of the changes that will be made: + +``` +Previewing update (dev): Type Name Plan + pulumi:pulumi:Stack quickstart-dev create + └─ kubernetes:apps/v1:Deployment nginx create -Outputs: - name: "nginx-516e16fd" - Resources: + 2 to create -Do you want to perform this update? [Use arrows to move, type to filter] +Do you want to perform this update? > yes no details ``` -Select `yes` using the arrows and hit enter to create the resources in Kubernetes. +No changes have been made yet. You may decline to proceed by selecting `no` or choose `details` to see more information about the proposed update like your deployment's properties. -```bash +### Performing the update + +To proceed and deploy your NGINX deployment, select `yes`. This begins an **update**: + +``` Do you want to perform this update? yes Updating (dev): + Type Name Status + pulumi:pulumi:Stack quickstart-dev created (3s) + └─ kubernetes:apps/v1:Deployment nginx created (2s) @@ -60,16 +75,30 @@ Resources: Duration: 4s ``` -The `name` of the deployment that we exported is shown as a [stack output](/docs/concepts/stack#outputs). +Updates can take some time since they wait for the Kubernetes resources to finish being created. The deployment will finish in just a few seconds. {{< auto-naming-note resource="deployment" suffix="bec13562" >}} -{{< console-note >}} +{{% notes type="warning" %}} +If you get the error `configured Kubernetes cluster is unreachable` or +`unable to load schema information from the API server`, verify your cluster access: -{{% notes type="info" %}} -If you get the error `configured Kubernetes cluster is unreachable: unable to load schema information from the API server: the server has asked for the client to provide credentials`, you may need to configure valid AWS credentials. +1. Check your kubeconfig: `kubectl config view` +2. Test cluster connectivity: `kubectl cluster-info` +3. Verify authentication: `kubectl auth can-i get pods` + +If these commands fail, return to the [Configure access](/docs/iac/get-started/kubernetes/configure/) +step to set up your Kubernetes cluster and kubectl. {{% /notes %}} -Next, we'll make some modifications to the program. +### View your update on Pulumi Cloud + +If you are logged into [Pulumi Cloud](/docs/pulumi-cloud), you'll see "View Live" hyperlinks in the CLI output during your update. These go to [a page](https://app.pulumi.com) with detailed information about your stack including resources, configuration, a full history of updates, and more. Navigate to it to review the details of your update: + + +
+
+
+Now that the NGINX deployment has been provisioned, you'll update it to do something more interesting.
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/kubernetes/destroy-stack.md b/content/docs/iac/get-started/kubernetes/destroy-stack.md
index c936bb638226..b331a6802e76 100644
--- a/content/docs/iac/get-started/kubernetes/destroy-stack.md
+++ b/content/docs/iac/get-started/kubernetes/destroy-stack.md
@@ -2,11 +2,11 @@
title_tag: Destroy the Stack | Kubernetes
meta_desc: This page provides an overview of how to destroy a Pulumi stack of a Kubernetes project.
title: Destroy stack
-h1: "Pulumi & Kubernetes: Destroy stack"
+h1: "Get started with Pulumi and Kubernetes"
weight: 8
menu:
iac:
- name: Destroy stack
+ name: Cleanup & destroy
identifier: kubernetes-get-started.destroy-stack
parent: kubernetes-get-started
weight: 8
@@ -15,28 +15,44 @@ aliases:
- /docs/quickstart/kubernetes/destroy-stack/
---
-Now that we've seen how to deploy changes to our program, let's clean up and tear down the resources that are part of our stack.
+## Cleanup & destroy the stack
-To destroy resources, run the following:
+Our final step is to clean up all of the resources we've allocated in this tutorial.
+
+Run the `pulumi destroy` command to delete all cloud resources in this project/stack:
+
+{{% choosable os "linux,macos" %}}
```bash
$ pulumi destroy
```
-You'll be prompted to make sure you really want to delete these resources.
+{{% /choosable %}}
+
+{{% choosable os "windows" %}}
+
+```powershell
+> pulumi destroy
+```
+
+{{% /choosable %}}
+
+Just like `pulumi up`, you'll be shown a preview to ensure that you want to proceed:
```bash
Previewing destroy (dev):
- Type Name Plan
- - pulumi:pulumi:Stack quickstart-dev delete
- - ├─ kubernetes:core/v1:Service nginx delete
- - └─ kubernetes:apps/v1:Deployment nginx delete
+
+ Type Name Plan
+ - pulumi:pulumi:Stack quickstart-dev delete
+ - └─ quickstart:index:KubernetesNginxService my-nginx delete
+ - ├─ kubernetes:core/v1:Service nginx delete
+ - └─ kubernetes:apps/v1:Deployment nginx delete
Outputs:
- - ip: "10.110.183.208"
+ - ip: "172.183.217.156"
Resources:
- - 3 to delete
+ - 4 to delete
Do you want to perform this destroy? [Use arrows to move, type to filter]
> yes
@@ -44,44 +60,50 @@ Do you want to perform this destroy? [Use arrows to move, type to filter]
details
```
-Select `yes` using the arrows and hit enter to delete the resources in Kubernetes.
+As with an update, we can choose `no` or `details`; select `yes` to proceed:
-```bash
+```
Do you want to perform this destroy? yes
-Destroying (dev):
- Type Name Status
- - pulumi:pulumi:Stack quickstart-dev deleted (0.00s)
- - ├─ kubernetes:core/v1:Service nginx deleted (0.94s)
- - └─ kubernetes:apps/v1:Deployment nginx deleted (4s)
+Destroying (dev)
+
+ Type Name Status
+ - pulumi:pulumi:Stack quickstart-dev deleted (0.08s)
+ - └─ quickstart:index:KubernetesNginxService my-nginx deleted (0.08s)
+ - ├─ kubernetes:core/v1:Service nginx deleted (16s)
+ - └─ kubernetes:apps/v1:Deployment nginx deleted (0.59s)
Outputs:
- - ip: "10.110.183.208"
+ - ip: "172.183.217.156"
Resources:
- - 3 deleted
+ - 4 deleted
-Duration: 6s
-
-The resources in the stack have been deleted, but the history and configuration associated with the stack are still maintained.
-If you want to remove the stack completely, run `pulumi stack rm dev`.
+Duration: 18s
```
-To delete the stack itself, run [`pulumi stack rm`](/docs/cli/commands/pulumi_stack_rm). Note that this removes the stack
-entirely from Pulumi Cloud, along with all of its update history.
+At this stage, your stack still exists, but all cloud resources have been deleted from it.
+
+## Remove the stack
+
+The final step is to remove the stack itself. Destroy keeps the stack around so that you still have the full
+history of what happened to the stack. Running [`pulumi stack rm`](/docs/cli/commands/pulumi_stack_rm) will
+delete it entirely, including all history and state snapshots. Be careful, this step cannot be undone!
+
+{{% choosable "os" "macos,linux" %}}
```bash
$ pulumi stack rm
-This will permanently remove the 'dev' stack!
-Please confirm that this is what you`d like to do by typing `dev`:
```
-Type `dev` and hit enter to remove the stack.
+{{% /choosable %}}
+{{% choosable "os" "windows" %}}
-```bash
-Please confirm that this is what you`d like to do by typing `dev`: dev
-Stack 'dev' has been removed!
+```powershell
+> pulumi stack rm
```
-Next, we'll look at some next steps.
+{{% /choosable %}}
+
+You'll be prompted to confirm the removal. Confirm it to successfully complete this tutorial.
{{< get-started-stepper >}}
diff --git a/content/docs/iac/get-started/kubernetes/modify-program.md b/content/docs/iac/get-started/kubernetes/modify-program.md
index 3e2b5a2955fd..fe4c54c80e9c 100644
--- a/content/docs/iac/get-started/kubernetes/modify-program.md
+++ b/content/docs/iac/get-started/kubernetes/modify-program.md
@@ -1,21 +1,22 @@
---
-title_tag: Modify the Program | Kubernetes
-meta_desc: This page provides an overview on how to update Kubernetes project from a Pulumi program.
-title: Modify program
-h1: "Pulumi & Kubernetes: Modify program"
+title_tag: Make an Update | Kubernetes
+meta_desc: This page provides an overview on how to update a Kubernetes project from a Pulumi program.
+title: Make an update
+h1: "Get started with Pulumi and Kubernetes"
weight: 6
menu:
iac:
- name: Modify program
+ name: Make an update
identifier: kubernetes-get-started.modify-program
parent: kubernetes-get-started
weight: 6
aliases:
- /docs/quickstart/kubernetes/modify-program/
+ - /docs/quickstart/kubernetes/deploy-changes/
---
-Now that we have an instance of our Pulumi program deployed, let's update it to do something a little more interesting.
+Now that you have an instance of your Pulumi program deployed, update it to do something a little more interesting.
Replace the entire contents of {{< langfile >}} with the following:
@@ -328,15 +329,15 @@ package myproject;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
-import com.pulumi.kubernetes.apps_v1.Deployment;
-import com.pulumi.kubernetes.apps_v1.DeploymentArgs;
-import com.pulumi.kubernetes.apps_v1.inputs.DeploymentSpecArgs;
-import com.pulumi.kubernetes.core_v1.*;
-import com.pulumi.kubernetes.core_v1.ServiceArgs;
-import com.pulumi.kubernetes.core_v1.enums.ServiceSpecType;
-import com.pulumi.kubernetes.core_v1.inputs.*;
-import com.pulumi.kubernetes.meta_v1.inputs.LabelSelectorArgs;
-import com.pulumi.kubernetes.meta_v1.inputs.ObjectMetaArgs;
+import com.pulumi.kubernetes.apps.v1.Deployment;
+import com.pulumi.kubernetes.apps.v1.DeploymentArgs;
+import com.pulumi.kubernetes.apps.v1.inputs.DeploymentSpecArgs;
+import com.pulumi.kubernetes.core.v1.*;
+import com.pulumi.kubernetes.core.v1.ServiceArgs;
+import com.pulumi.kubernetes.core.v1.enums.ServiceSpecType;
+import com.pulumi.kubernetes.core.v1.inputs.*;
+import com.pulumi.kubernetes.meta.v1.inputs.LabelSelectorArgs;
+import com.pulumi.kubernetes.meta.v1.inputs.ObjectMetaArgs;
import java.util.Map;
public class App {
@@ -369,12 +370,9 @@ public class App {
.build())
.build());
- var name = deployment.metadata()
- .applyValue(m -> m.orElseThrow().name().orElse(""));
-
var frontend = new Service("nginx", ServiceArgs.builder()
.metadata(ObjectMetaArgs.builder()
- .labels(deployment.spec().applyValue(spec -> spec.get().template().metadata().get().labels()))
+ .labels(labels)
.build())
.spec(ServiceSpecArgs.builder()
.type(isMinikube ? ServiceSpecType.ClusterIP : ServiceSpecType.LoadBalancer)
@@ -387,15 +385,8 @@ public class App {
.build())
.build());
- ctx.export("ip", isMinikube
- ? frontend.spec().applyValue(spec -> spec.get().clusterIP())
- : Output.tuple(frontend.status(), frontend.spec()).applyValue(t -> {
- var status = t.t1;
- var spec = t.t2;
- var ingress = status.get().loadBalancer().get().ingress().get(0);
- return ingress.ip().orElse(ingress.hostname().orElse(spec.get().clusterIP().get()));
- })
- );
+ // Export the service cluster IP (available for both ClusterIP and LoadBalancer types)
+ ctx.export("ip", frontend.spec().applyValue(spec -> spec.clusterIP().orElse("pending")));
});
}
}
@@ -458,6 +449,151 @@ If you are currently using Minikube, set `isMinikube` to `true`, otherwise, set
$ pulumi config set isMinikube false
```
-Next, we'll deploy the changes.
+### Deploy the changes
+
+To deploy the changes, run `pulumi up` again:
+
+{{% choosable "os" "macos,linux" %}}
+
+```bash
+$ pulumi up
+```
+
+{{% /choosable %}}
+{{% choosable "os" "windows" %}}
+
+```powershell
+> pulumi up
+```
+
+{{% /choosable %}}
+
+Pulumi computes the minimally disruptive change to achieve the desired state described by the program.
+
+```
+Previewing update (dev):
+ Type Name Plan
+ pulumi:pulumi:Stack quickstart-dev
+ + └─ kubernetes:core/v1:Service nginx create
+
+Outputs:
+ + ip : "10.96.0.0"
+ - name: "nginx-bec13562"
+
+Resources:
+ + 1 to create
+ 2 unchanged
+
+Do you want to perform this update?
+> yes
+ no
+ details
+```
+
+Select `yes` to proceed. Pulumi will create the new service resource:
+
+```
+Do you want to perform this update? yes
+Updating (dev):
+ Type Name Status
+ pulumi:pulumi:Stack quickstart-dev
+ + └─ kubernetes:core/v1:Service nginx created (10s)
+
+Outputs:
+ + ip : "10.110.183.208"
+ - name: "nginx-bec13562"
+
+Resources:
+ + 1 created
+ 2 unchanged
+
+Duration: 12s
+```
+
+### Verify the deployment
+
+View the `ip` [stack output](/docs/concepts/stack#outputs) from the NGINX service:
+
+{{% choosable "os" "macos,linux" %}}
+
+```bash
+$ pulumi stack output ip
+```
+
+{{% /choosable %}}
+{{% choosable "os" "windows" %}}
+
+```powershell
+> pulumi stack output ip
+```
+
+{{% /choosable %}}
+
+{{% notes type="info" %}}
+**If using Minikube:** Minikube does not support type `LoadBalancer`. Instead, forward the NGINX service:
+
+```bash
+$ kubectl get service
+NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+kubernetes ClusterIP 10.96.0.1 If you see this page, the nginx web server is successfully installed and +working. Further configuration is required.
+ +For online documentation and support please refer to
+nginx.org.
+Commercial support is available at
+nginx.com.
Thank you for using nginx.
+ + +``` + +Now that you have successfully updated your stack, you'll destroy the resources. {{< get-started-stepper >}} diff --git a/content/docs/iac/get-started/kubernetes/review-project.md b/content/docs/iac/get-started/kubernetes/review-project.md deleted file mode 100644 index 60e73ad5cd54..000000000000 --- a/content/docs/iac/get-started/kubernetes/review-project.md +++ /dev/null @@ -1,313 +0,0 @@ ---- -title_tag: Review the New Project | Kubernetes -meta_desc: This page provides an overview on how to review a new Kubernetes project. -title: Review project -h1: "Pulumi & Kubernetes: Review project" -weight: 4 -menu: - iac: - name: Review project - identifier: kubernetes-get-started.review-project - parent: kubernetes-get-started - weight: 4 - -aliases: - - /docs/quickstart/kubernetes/review-project/ ---- - -Let's review some of the generated project files: - -{{% choosable language "typescript,python,go,csharp,java" %}} - -- `Pulumi.yaml` defines the [project](/docs/concepts/projects/). - -{{% /choosable %}} - -{{% choosable language yaml %}} - -- `Pulumi.yaml` defines both the [project](/docs/concepts/projects/) and the program that manages your stack resources. - -{{% /choosable %}} - -- `Pulumi.dev.yaml` contains [configuration](/docs/concepts/config/) values for the [stack](/docs/concepts/stack/) we initialized. - -{{% choosable language java %}} - -- `src/main/java/myproject` defines the project's Java package root. - -{{% /choosable %}} - -{{% choosable language python %}} - -- `__main__.py` is the Pulumi program that defines your stack resources. - -{{% /choosable %}} - -{{% choosable language "typescript,go,csharp,java" %}} - -- {{< langfile >}} is the Pulumi program that defines your stack resources. - -{{% /choosable %}} - -Let's examine {{< langfile >}}. - -{{< chooser language "typescript,python,go,csharp,java,yaml" / >}} - -{{% choosable language typescript %}} - -```typescript -import * as k8s from "@pulumi/kubernetes"; - -const appLabels = { app: "nginx" }; -const deployment = new k8s.apps.v1.Deployment("nginx", { - spec: { - selector: { matchLabels: appLabels }, - replicas: 1, - template: { - metadata: { labels: appLabels }, - spec: { containers: [{ name: "nginx", image: "nginx" }] } - } - } -}); -export const name = deployment.metadata.name; -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -"""A Kubernetes Python Pulumi program""" - -import pulumi -from pulumi_kubernetes.apps.v1 import Deployment, DeploymentSpecArgs -from pulumi_kubernetes.meta.v1 import LabelSelectorArgs, ObjectMetaArgs -from pulumi_kubernetes.core.v1 import ContainerArgs, PodSpecArgs, PodTemplateSpecArgs - -app_labels = { "app": "nginx" } - -deployment = Deployment( - "nginx", - spec={ - "selector": { "match_labels": app_labels }, - "replicas": 1, - "template": { - "metadata": { "labels": app_labels }, - "spec": { "containers": [{ "name": "nginx", "image": "nginx" }] } - }, - }) - -pulumi.export("name", deployment.metadata["name"]) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -package main - -import ( - appsv1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apps/v1" - corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1" - metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1" - "github.com/pulumi/pulumi/sdk/v3/go/pulumi" -) - -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - - appLabels := pulumi.StringMap{ - "app": pulumi.String("nginx"), - } - deployment, err := appsv1.NewDeployment(ctx, "app-dep", &appsv1.DeploymentArgs{ - Spec: appsv1.DeploymentSpecArgs{ - Selector: &metav1.LabelSelectorArgs{ - MatchLabels: appLabels, - }, - Replicas: pulumi.Int(1), - Template: &corev1.PodTemplateSpecArgs{ - Metadata: &metav1.ObjectMetaArgs{ - Labels: appLabels, - }, - Spec: &corev1.PodSpecArgs{ - Containers: corev1.ContainerArray{ - corev1.ContainerArgs{ - Name: pulumi.String("nginx"), - Image: pulumi.String("nginx"), - }}, - }, - }, - }, - }) - if err != nil { - return err - } - - ctx.Export("name", deployment.Metadata.Name()) - - return nil - }) -} - -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using Pulumi; -using Pulumi.Kubernetes.Types.Inputs.Core.V1; -using Pulumi.Kubernetes.Types.Inputs.Apps.V1; -using Pulumi.Kubernetes.Types.Inputs.Meta.V1; -using System.Collections.Generic; - -return await Deployment.RunAsync(() => -{ - var appLabels = new InputMapDownload and install Pulumi for your platform:
+ +{{ .Page.RenderString "{{< install-pulumi >}}\n{{% notes info %}}\nAll Windows examples in this tutorial assume you are running in PowerShell.\n{{% /notes %}}\n{{< /install-pulumi >}}" }} diff --git a/static/images/getting-started/console-update.png b/static/images/getting-started/console-update.png index 3cd4b0c6a4bc..00ecfde1d68c 100644 Binary files a/static/images/getting-started/console-update.png and b/static/images/getting-started/console-update.png differ