--- title_tag: Review the New Project | Azure meta_desc: This page provides an overview on how to a review a new Azure project. title: Review project h1: "Pulumi & Azure: Review project" weight: 4 menu: clouds: parent: azure-get-started identifier: azure-review-project aliases: - /docs/quickstart/azure/review-project/ - /docs/get-started/azure/review-project/ --- Let's review some of the generated project files: {{% choosable language "javascript,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/) you initialized. {{% choosable language java %}} - `src/main/java/myproject` defines the project's Java package root. {{% /choosable %}} {{% choosable language "javascript,typescript,python,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 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 primary key of the Storage Account const storageAccountKeys = storage.listStorageAccountKeysOutput({ resourceGroupName: resourceGroup.name, accountName: storageAccount.name }); export const primaryStorageKey = storageAccountKeys.keys[0].value; ``` {{% /choosable %}} {{% choosable language 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 resource (Storage Account) account = storage.StorageAccount( "sa", resource_group_name=resource_group.name, sku=storage.SkuArgs( name=storage.SkuName.STANDARD_LRS, ), kind=storage.Kind.STORAGE_V2, ) # Export the primary key of the Storage Account primary_key = ( pulumi.Output.all(resource_group.name, account.name) .apply( lambda args: storage.list_storage_account_keys( resource_group_name=args[0], account_name=args[1] ) ) .apply(lambda accountKeys: accountKeys.keys[0].value) ) pulumi.export("primary_storage_key", primary_key) ``` {{% /choosable %}} {{% choosable language 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) account, err := storage.NewStorageAccount(ctx, "sa", &storage.StorageAccountArgs{ ResourceGroupName: resourceGroup.Name, AccessTier: storage.AccessTierHot, Sku: &storage.SkuArgs{ Name: storage.SkuName_Standard_LRS, }, Kind: storage.KindStorageV2, }) if err != nil { return err } // Export the primary key of the Storage Account ctx.Export("primaryStorageKey", pulumi.All(resourceGroup.Name, account.Name).ApplyT( func(args []interface{}) (string, error) { resourceGroupName := args[0].(string) accountName := args[1].(string) accountKeys, err := storage.ListStorageAccountKeys(ctx, &storage.ListStorageAccountKeysArgs{ ResourceGroupName: resourceGroupName, AccountName: accountName, }) if err != nil { return "", err } return accountKeys.Keys[0].Value, nil }, )) return nil }) } ``` {{% /choosable %}} {{% choosable language 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 }); var storageAccountKeys = ListStorageAccountKeys.Invoke(new ListStorageAccountKeysInvokeArgs { ResourceGroupName = resourceGroup.Name, AccountName = storageAccount.Name }); var primaryStorageKey = storageAccountKeys.Apply(accountKeys => { var firstKey = accountKeys.Keys[0].Value; return Output.CreateSecret(firstKey); }); // Export the primary key of the Storage Account return new Dictionary { ["primaryStorageKey"] = primaryStorageKey }; }); ``` {{% /choosable %}} {{% choosable language 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.StorageFunctions; import com.pulumi.azurenative.storage.enums.Kind; import com.pulumi.azurenative.storage.enums.SkuName; import com.pulumi.azurenative.storage.inputs.ListStorageAccountKeysArgs; import com.pulumi.azurenative.storage.inputs.SkuArgs; import com.pulumi.core.Either; import com.pulumi.core.Output; import com.pulumi.deployment.InvokeOptions; 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()); var primaryStorageKey = getStorageAccountPrimaryKey( resourceGroup.name(), storageAccount.name()); ctx.export("primaryStorageKey", primaryStorageKey); }); } private static Output getStorageAccountPrimaryKey(Output resourceGroupName, Output accountName) { return Output.tuple(resourceGroupName, accountName).apply(tuple -> { var actualResourceGroupName = tuple.t1; var actualAccountName = tuple.t2; var invokeResult = StorageFunctions.listStorageAccountKeys(ListStorageAccountKeysArgs.builder() .resourceGroupName(actualResourceGroupName) .accountName(actualAccountName) .build(), InvokeOptions.Empty); return Output.of(invokeResult) .applyValue(r -> r.keys().get(0).value()) .asSecret(); }); } } ``` {{% /choosable %}} {{% choosable language yaml %}} ```yaml name: quickstart runtime: yaml description: A minimal Azure Native Pulumi YAML program resources: resourceGroup: type: azure-native:resources:ResourceGroup sa: type: azure-native:storage:StorageAccount properties: resourceGroupName: ${resourceGroup.name} sku: name: Standard_LRS kind: StorageV2 variables: storageAccountKeys: Fn::Invoke: Function: azure-native:storage:listStorageAccountKeys Arguments: resourceGroupName: ${resourceGroup.name} accountName: ${sa.name} outputs: primaryStorageKey: ${storageAccountKeys.keys[0].value} ``` {{% /choosable %}} This Pulumi program creates an Azure resource group and storage account and then exports the storage account's primary key. {{% notes %}} In this program, the location of the resource group is set in the configuration setting `azure-native:location` (check the `Pulumi.dev.yaml` file). This is an easy way to set a global location for your program so you don't have to specify the location for each resource manually. The location for the storage account is automatically derived from the location of the resource group. To override the location for a resource, set the location property to one of Azure's [supported locations](https://azure.microsoft.com/en-us/global-infrastructure/locations/). {{% /notes %}} Next, you'll deploy your stack, which will provision a resource group and your storage account. {{< get-started-stepper >}}