---
title: Create project
url: /docs/iac/get-started/azure/create-project/
---
## 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:

<!-- chooser: os -->
<!-- option: linux -->

```bash
$ mkdir quickstart
```

<!-- /option -->

<!-- option: windows -->

```powershell
> mkdir quickstart
```

<!-- /option -->
<!-- /chooser -->

Change into the new directory:

<!-- chooser: os -->
<!-- option: linux -->

```bash
$ cd quickstart
```

<!-- /option -->

<!-- option: windows -->

```powershell
> cd quickstart
```

<!-- /option -->
<!-- /chooser -->

Now initialize a new Pulumi project for Azure using the `pulumi new` command:

<!-- chooser: language -->
<!-- option: typescript -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new azure-typescript

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new azure-typescript

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: python -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new azure-python

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new azure-python

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: csharp -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new azure-csharp

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new azure-csharp

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: go -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new azure-go

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new azure-go

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: java -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new azure-java

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new azure-java

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->

<!-- option: yaml -->

<!-- chooser: os -->
<!-- option: linux -->
```bash
$ pulumi new azure-yaml

```

<!-- /option -->

<!-- option: windows -->
```powershell
> pulumi new azure-yaml

```

<!-- /option -->
<!-- /chooser -->

<!-- /option -->
<!-- /chooser -->

The `pulumi new` command interactively walks through initializing a new project, as well as creating a
[**stack**](/docs/iac/concepts/stacks) and [**configuring**](/docs/iac/concepts/config) it. A stack is an instance of your
project and you may have many of them -- like `dev`, `staging`, and `prod` -- each with different configuration settings.

You will be prompted for configuration values such as an Azure location. You can hit ENTER to accept the default of `WestUS2`,
or can type in another value such as `eastus`:

```
azure-native:location: The Azure location to use: (WestUS2) eastus
```

> **Note:** If this is your first time running Pulumi, you will be prompted to log into Pulumi Cloud. This is a free but optional service that makes IaC easy by safely and securely managing state for you. [This guide](/docs/iac/guides/basics/pulumi-cloud-vs-oss/) explains what Pulumi Cloud is and [this topic](/docs/iac/concepts/state-and-backends) describes alternative Pulumi backend options.

<!-- chooser: language -->
<!-- option: typescript -->

After some dependency installations from `npm`, the project and stack will be ready.

<!-- /option -->

<!-- option: python -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: go -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: csharp -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: java -->

After the command completes, the project and stack will be ready.

<!-- /option -->

<!-- option: yaml -->

After the command completes, the project and stack will be ready.

<!-- /option -->
<!-- /chooser -->

### Review your new project's contents

If you list the contents of your directory, you'll see some key files:

<!-- chooser: language -->
<!-- option: java -->

- `src/main/java/myproject` is the project's Java package root

<!-- /option -->

<!-- option: typescript -->

- <!-- chooser: language -->
<!-- option: javascript -->
`index.js`
<!-- /option -->
<!-- option: typescript -->
`index.ts`
<!-- /option -->
<!-- option: python -->
`__main__.py`
<!-- /option -->
<!-- option: go -->
`main.go`
<!-- /option -->
<!-- option: csharp -->
`Program.cs`
<!-- /option -->
<!-- option: fsharp -->
`Program.fs`
<!-- /option -->
<!-- option: visualbasic -->
`Program.vb`
<!-- /option -->
<!-- option: java -->
`App.java`
<!-- /option -->
<!-- option: yaml -->
`Pulumi.yaml`
<!-- /option -->
<!-- /chooser -->
 contains your project's main code that declares an Azure resource group and storage account

- `Pulumi.yaml` is a [project file](/docs/iac/concepts/projects/project-file) containing metadata about your project like its name

<!-- /option -->

<!-- option: yaml -->

- `Pulumi.yaml` is a [project file](/docs/iac/concepts/projects/project-file) containing metadata about your project, like its name, as well as declaring your project's resources

<!-- /option -->
<!-- /chooser -->

- `Pulumi.dev.yaml` contains configuration values for the stack you just initialized

Now examine the code in <!-- chooser: language -->
<!-- option: javascript -->
`index.js`
<!-- /option -->
<!-- option: typescript -->
`index.ts`
<!-- /option -->
<!-- option: python -->
`__main__.py`
<!-- /option -->
<!-- option: go -->
`main.go`
<!-- /option -->
<!-- option: csharp -->
`Program.cs`
<!-- /option -->
<!-- option: fsharp -->
`Program.fs`
<!-- /option -->
<!-- option: visualbasic -->
`Program.vb`
<!-- /option -->
<!-- option: java -->
`App.java`
<!-- /option -->
<!-- option: yaml -->
`Pulumi.yaml`
<!-- /option -->
<!-- /chooser -->
:

<!-- chooser: language -->
<!-- option: typescript -->

```typescript
import * as pulumi from "@pulumi/pulumi";
import * as resources from "@pulumi/azure-native/resources";
import * as storage from "@pulumi/azure-native/storage";

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("resourceGroup");

// Create an Azure resource (Storage Account)
const storageAccount = new storage.StorageAccount("sa", {
    resourceGroupName: resourceGroup.name,
    sku: {
        name: storage.SkuName.Standard_LRS,
    },
    kind: storage.Kind.StorageV2,
});

// Export the storage account name
export const storageAccountName = storageAccount.name;
```

<!-- /option -->

<!-- option: python -->

```python
"""An Azure RM Python Pulumi program"""

import pulumi
from pulumi_azure_native import storage
from pulumi_azure_native import resources

# Create an Azure Resource Group
resource_group = resources.ResourceGroup("resource_group")

# Create an Azure Storage Account
account = storage.StorageAccount(
    "sa",
    resource_group_name=resource_group.name,
    sku={
        "name": storage.SkuName.STANDARD_LRS,
    },
    kind=storage.Kind.STORAGE_V2,
)

# Export the storage account name
pulumi.export("storage_account_name", account.name)
```

<!-- /option -->

<!-- option: go -->

```go
package main

import (
	"github.com/pulumi/pulumi-azure-native-sdk/resources/v2"
	"github.com/pulumi/pulumi-azure-native-sdk/storage/v2"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		// Create an Azure Resource Group
		resourceGroup, err := resources.NewResourceGroup(ctx, "resourceGroup", nil)
		if err != nil {
			return err
		}

		// Create an Azure resource (Storage Account)
		storageAccount, err := storage.NewStorageAccount(ctx, "sa", &storage.StorageAccountArgs{
			ResourceGroupName: resourceGroup.Name,
			Sku: &storage.SkuArgs{
				Name: pulumi.String("Standard_LRS"),
			},
			Kind: pulumi.String("StorageV2"),
		})
		if err != nil {
			return err
		}

		// Export the storage account name
		ctx.Export("storageAccountName", storageAccount.Name)
		return nil
	})
}
```

<!-- /option -->

<!-- option: csharp -->

```csharp
using Pulumi;
using Pulumi.AzureNative.Resources;
using Pulumi.AzureNative.Storage;
using Pulumi.AzureNative.Storage.Inputs;
using System.Collections.Generic;

return await Pulumi.Deployment.RunAsync(() =>
{
    // Create an Azure Resource Group
    var resourceGroup = new ResourceGroup("resourceGroup");

    // Create an Azure resource (Storage Account)
    var storageAccount = new StorageAccount("sa", new StorageAccountArgs
    {
        ResourceGroupName = resourceGroup.Name,
        Sku = new SkuArgs
        {
            Name = SkuName.Standard_LRS
        },
        Kind = Kind.StorageV2
    });

    // Export the storage account name
    return new Dictionary<string, object?>
    {
        ["storageAccountName"] = storageAccount.Name
    };
});
```

<!-- /option -->

<!-- option: java -->

```java
package myproject;

import com.pulumi.Pulumi;
import com.pulumi.azurenative.resources.ResourceGroup;
import com.pulumi.azurenative.storage.StorageAccount;
import com.pulumi.azurenative.storage.StorageAccountArgs;
import com.pulumi.azurenative.storage.enums.Kind;
import com.pulumi.azurenative.storage.enums.SkuName;
import com.pulumi.azurenative.storage.inputs.SkuArgs;

public class App {
    public static void main(String[] args) {
        Pulumi.run(ctx -> {
            var resourceGroup = new ResourceGroup("resourceGroup");
            var storageAccount = new StorageAccount("sa", StorageAccountArgs.builder()
                    .resourceGroupName(resourceGroup.name())
                    .sku(SkuArgs.builder()
                            .name(SkuName.Standard_LRS)
                            .build())
                    .kind(Kind.StorageV2)
                    .build());

            ctx.export("storageAccountName", storageAccount.name());
        });
    }
}
```

<!-- /option -->

<!-- option: yaml -->

```yaml
name: quickstart
runtime: yaml
description: A minimal Azure Native Pulumi YAML program

resources:
  # Create an Azure Resource Group
  resourceGroup:
    type: azure-native:resources:ResourceGroup
  # Create an Azure Storage Account
  sa:
    type: azure-native:storage:StorageAccount
    properties:
      resourceGroupName: ${resourceGroup.name}
      sku:
        name: Standard_LRS
      kind: StorageV2

outputs:
  # Export the storage account name
  storageAccountName: ${sa.name}
```

<!-- /option -->
<!-- /chooser -->

The program declares an Azure Resource Group and Storage Account [resources](/docs/iac/concepts/resources) and exports the storage account's name as a [stack output](/docs/iac/concepts/stacks/#outputs). Notice that the storage account name is an output property that Azure assigns at deployment time. Now you're ready for your first deployment!

---
[← Previous step](/docs/iac/get-started/azure/configure/)
[Next: Deploy to Azure →](/docs/iac/get-started/azure/deploy-stack/)


