Partilhar via


.NET .NET Aspire formato de manifesto para construtores de ferramentas de implantação

Neste artigo, você aprenderá sobre o formato de manifesto .NET.NET Aspire. Este artigo serve como um guia de referência para construtores de ferramentas de implantação, auxiliando na criação de ferramentas para implantar projetos .NET.NET Aspire em plataformas de hospedagem específicas, seja no local ou na nuvem.

.NET .NET Aspire simplifica a experiência de desenvolvimento local, ajudando a gerenciar interdependências entre integrações de aplicativos. Para ajudar a simplificar a implantação de aplicativos, .NET Aspire projetos podem gerar um manifesto de todos os recursos definidos como um arquivo formatado JSON.

Gerar um manifesto

Um projeto .NET.NET Aspire válido é necessário para gerar um manifesto. Para começar, crie um projeto .NET.NET Aspire usando o modelo aspire-starter.NET:

dotnet new aspire-starter --use-redis-cache `
    -o AspireApp && `
    cd AspireApp

A geração de manifesto é alcançada através da execução de dotnet build com um objetivo especial:

dotnet run --project AspireApp.AppHost\AspireApp.AppHost.csproj `
    --publisher manifest `
    --output-path ../aspire-manifest.json

Dica

O --output-path suporta caminhos relativos. O comando anterior usa ../aspire-manifest.json para colocar o arquivo de manifesto na raiz do diretório do projeto.

Para obter mais informações, consulte dotnet run. O comando anterior produz a seguinte saída:

Building...
info: Aspire.Hosting.Publishing.ManifestPublisher[0]
      Published manifest to: .\AspireApp.AppHost\aspire-manifest.json

O arquivo gerado é o manifesto .NET.NET Aspire e é usado por ferramentas para dar suporte à implantação em ambientes de nuvem de destino.

Observação

Você também pode gerar um manifesto como parte do perfil de inicialização. Considere o seguinte launchSettings.json:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "generate-manifest": {
      "commandName": "Project",
      "launchBrowser": false,
      "dotnetRunMessages": true,
      "commandLineArgs": "--publisher manifest --output-path aspire-manifest.json"
    }
  }
}

Formato de manifesto básico

A publicação do manifesto a partir do modelo inicial padrão para .NET Aspire produz a seguinte saída JSON:

{
  "resources": {
    "cache": {
      "type": "container.v0",
      "connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
      "image": "redis:7.2.4",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 6379
        }
      }
    },
    "apiservice": {
      "type": "project.v0",
      "path": "../AspireApp.ApiService/AspireApp.ApiService.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    },
    "webfrontend": {
      "type": "project.v0",
      "path": "../AspireApp.Web/AspireApp.Web.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "ConnectionStrings__cache": "{cache.connectionString}",
        "services__apiservice__0": "{apiservice.bindings.http.url}",
        "services__apiservice__1": "{apiservice.bindings.https.url}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    }
  }
}

O formato de manifesto JSON consiste em um único objeto chamado resources, que contém uma propriedade para cada recurso especificado em Program.cs (o argumento name para cada nome é usado como a propriedade para cada um dos objetos de recurso filho em JSON).

Cadeia de conexão e referências de vinculação

No exemplo anterior, há dois recursos de projeto e um recurso de cache Redis. O webfrontend depende dos recursos apiservice (projeto) e cache (Redis).

Essa dependência é conhecida porque as variáveis de ambiente para o webfrontend contêm espaços reservados que fazem referência aos outros dois recursos:

"env": {
  // ... other environment variables omitted for clarity
  "ConnectionStrings__cache": "{cache.connectionString}",
  "services__apiservice__0": "{apiservice.bindings.http.url}",
  "services__apiservice__1": "{apiservice.bindings.https.url}"
},

O recurso apiservice é referenciado por webfrontend usando o WithReference(apiservice) de chamada no arquivo de Program.cs do host do aplicativo e redis é referenciado usando o WithReference(cache)de chamada:

var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache");

var apiService = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");

builder.AddProject<Projects.AspireApp_Web>("webfrontend")
    .WithReference(cache)
    .WithReference(apiService);

builder.Build().Run();

As referências entre os tipos de recursos do projeto resultam em descoberta de serviço variáveis sendo injetadas no projeto de referência. Referências a tipos de referência bem conhecidos, como Redis resultam na injeção de cadeias de conexão.

Um diagrama mostrando quais recursos contribuem para quais cadeias de caracteres de espaço reservado correspondentes.

Para obter mais informações sobre como os recursos no modelo de aplicativo e as referências entre eles funcionam, consulte .NET.NET Aspire visão geral da orquestração.

Estrutura de cadeia de caracteres de espaço reservado

As cadeias de caracteres de espaço reservado fazem referência à estrutura do manifesto .NET.NET Aspire:

Um diagrama mostrando como o manifesto JSON estrutura mapeia para cadeias de caracteres de espaço reservado.

O segmento final da cadeia de caracteres de espaço reservado (url neste caso) é gerado pela ferramenta que processa o manifesto. Há vários sufixos que podem ser usados na cadeia de caracteres de espaço reservado:

  • connectionString: Para tipos de recursos bem conhecidos, como Redis. As ferramentas de implantação convertem o recurso na infraestrutura mais apropriada para o ambiente de nuvem de destino e, em seguida, produzem uma cadeia de conexão compatível com .NET.NET Aspire para o aplicativo consumidor usar. Em container.v0 recursos, o campo connectionString pode estar presente e especificado explicitamente. Isso é para dar suporte a cenários em que um tipo de recurso de contêiner é referenciado usando a extensão WithReference, mas é desejado para ser hospedado explicitamente como um contêiner.
  • url: Para referências de serviço a serviço em que é necessário um URL bem formado. A ferramenta de implantação produz o url com base no esquema, protocolo e transporte definidos no manifesto e na topologia de computação/rede subjacente que foi implantada.
  • host: O segmento de host da URL.
  • port: O segmento de porta do URL.

Tipos de recursos

Cada recurso tem um campo type. Quando uma ferramenta de implantação lê o manifesto, ela deve ler o tipo para verificar se pode processar corretamente o manifesto. Durante o período de visualização do .NET.NET Aspire, todos os tipos de recursos têm um sufixo v0 para indicar que estão sujeitos a alterações. À medida que .NET.NET Aspire se aproxima da versão, um sufixo v1 será usado para significar que a estrutura do manifesto para esse tipo de recurso deve ser considerada estável (atualizações subsequentes incrementam o número da versão de acordo).

Campos de recursos comuns

O campo type é o único campo comum em todos os tipos de recursos, no entanto, os tipos de recursos project.v0, container.v0e executable.v0 também compartilham os campos env e bindings.

Observação

O tipo de recurso executable.v0 não está totalmente implementado no manifesto devido à sua falta de utilidade em cenários de implantação. Para obter mais informações sobre a contentorização de executáveis, consulte Dockerfile tipos de recursos.

O tipo de campo env é um mapeamento básico de chave/valor onde os valores podem conter cadeias de caracteres de espaço reservado.

As ligações são especificadas no campo bindings com cada ligação contida em seu próprio campo sob o objeto bindingsJSON. Os campos omitidos pelo manifesto .NET.NET Aspire no nó bindings incluem:

  • scheme: Um dos seguintes valores tcp, udp, httpou https.
  • protocol: Um dos seguintes valores tcp ou udp
  • transport: O mesmo que scheme, mas usado para desambiguar entre http e http2.
  • containerPort: Opcional, se omitido padrão para a porta 80.

O campo inputs

Alguns recursos geram um campo inputs. Este campo é usado para especificar parâmetros de entrada para o recurso. O campo inputs é um objeto JSON em que cada propriedade é um parâmetro de entrada usado na resolução da estrutura do espaço reservado. Os recursos que têm um connectionString, por exemplo, podem usar o campo inputs para especificar uma password para a cadeia de conexão:

"connectionString": "Host={<resourceName>.bindings.tcp.host};Port={<resourceName>.bindings.tcp.port};Username=admin;Password={<resourceName>.inputs.password};"

O espaço reservado da cadeia de conexão faz referência ao parâmetro de entrada password do campo inputs:

"inputs": {
  "password": {
    "type": "string",
    "secret": true,
    "default": {
      "generate": {
        "minLength": 10
      }
    }
  }
}

O trecho de JSON anterior mostra o campo inputs para um recurso que tem um campo connectionString. O parâmetro de entrada password é um tipo de cadeia de caracteres e é marcado como um segredo. O campo default é usado para especificar um valor padrão para o parâmetro de entrada. Nesse caso, o valor padrão é gerado usando o campo generate, com seqüência aleatória de um comprimento mínimo.

Recursos incorporados

A tabela a seguir é uma lista de tipos de recursos que são explicitamente gerados por .NET Aspire e extensões desenvolvidas pela equipe .NET Aspire:

Tipos de recursos independentes da nuvem

Estes recursos estão disponíveis no 📦Aspire. Hospedagem pacote NuGet.

Utilização do modelo de aplicação Tipo de recurso de manifesto Link do título
AddContainer container.v0 Tipo de recurso de contêiner
PublishAsDockerFile dockerfile.v0 Dockerfile tipos de recursos
AddDatabase value.v0 MongoDB Server tipos de recursos
AddMongoDB container.v0 MongoDB tipos de recursos
AddDatabase value.v0 MySQL Server tipos de recursos
AddMySql container.v0 MySQL tipos de recursos
AddDatabase value.v0 Postgres tipos de recursos
AddPostgres container.v0 Postgres tipos de recursos
AddProject project.v0 Tipo de recurso do Project
AddRabbitMQ container.v0 RabbitMQ tipos de recursos
AddRedis container.v0 Redis tipo de recurso
AddDatabase value.v0 SQL Server tipos de recursos
AddSqlServer container.v0 SQL Server tipos de recursos

Tipo de recurso do projeto

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");

Exemplo de manifesto:

"apiservice": {
  "type": "project.v0",
  "path": "../AspireApp.ApiService/AspireApp.ApiService.csproj",
  "env": {
    "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
    "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true"
  },
  "bindings": {
    "http": {
      "scheme": "http",
      "protocol": "tcp",
      "transport": "http"
    },
    "https": {
      "scheme": "https",
      "protocol": "tcp",
      "transport": "http"
    }
  }
}

Tipo de recurso de contêiner

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddContainer("mycontainer", "myimage")
       .WithEnvironment("LOG_LEVEL", "WARN")
       .WithHttpEndpoint(3000);

Exemplo de manifesto:

{
  "resources": {
    "mycontainer": {
      "type": "container.v0",
      "image": "myimage:latest",
      "env": {
        "LOG_LEVEL": "WARN"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "containerPort": 3000
        }
      }
    }
  }
}

Dockerfile tipos de recursos

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddNodeApp("nodeapp", "../nodeapp/app.js")
       .WithHttpEndpoint(hostPort: 5031, env: "PORT")
       .PublishAsDockerFile();

Dica

A chamada PublishAsDockerFile é necessária para gerar o tipo de recurso Dockerfile no manifesto, e esse método de extensão só está disponível no tipo ExecutableResource.

Exemplo de manifesto:

{
  "resources": {
    "nodeapp": {
      "type": "dockerfile.v0",
      "path": "../nodeapp/Dockerfile",
      "context": "../nodeapp",
      "env": {
        "NODE_ENV": "development",
        "PORT": "{nodeapp.bindings.http.port}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "containerPort": 5031
        }
      }
    }
  }
}

Postgres tipos de recursos

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddPostgres("postgres1")
       .AddDatabase("shipping");

Exemplo de manifesto:

{
  "resources": {
    "postgres1": {
      "type": "container.v0",
      "connectionString": "Host={postgres1.bindings.tcp.host};Port={postgres1.bindings.tcp.port};Username=postgres;Password={postgres1.inputs.password}",
      "image": "postgres:16.2",
      "env": {
        "POSTGRES_HOST_AUTH_METHOD": "scram-sha-256",
        "POSTGRES_INITDB_ARGS": "--auth-host=scram-sha-256 --auth-local=scram-sha-256",
        "POSTGRES_PASSWORD": "{postgres1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 5432
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{postgres1.connectionString};Database=shipping"
    }
  }
}

RabbitMQ tipos de recursos

RabbitMQ é modelado como um recurso de contêiner container.v0. O exemplo a seguir mostra como eles são adicionados ao modelo de aplicativo.

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRabbitMQ("rabbitmq1");

O código anterior produz o seguinte manifesto:

{
  "resources": {
    "rabbitmq1": {
      "type": "container.v0",
      "connectionString": "amqp://guest:{rabbitmq1.inputs.password}@{rabbitmq1.bindings.tcp.host}:{rabbitmq1.bindings.tcp.port}",
      "image": "rabbitmq:3",
      "env": {
        "RABBITMQ_DEFAULT_USER": "guest",
        "RABBITMQ_DEFAULT_PASS": "{rabbitmq1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 5672
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    }
  }
}

Redis tipo de recurso

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRedis("redis1");

Exemplo de manifesto:

{
  "resources": {
    "redis1": {
      "type": "container.v0",
      "connectionString": "{redis1.bindings.tcp.host}:{redis1.bindings.tcp.port}",
      "image": "redis:7.2.4",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 6379
        }
      }
    }
  }
}

SQL Server tipos de recursos

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddSqlServer("sql1")
       .AddDatabase("shipping");

Exemplo de manifesto:

{
  "resources": {
    "sql1": {
      "type": "container.v0",
      "connectionString": "Server={sql1.bindings.tcp.host},{sql1.bindings.tcp.port};User ID=sa;Password={sql1.inputs.password};TrustServerCertificate=true",
      "image": "mcr.microsoft.com/mssql/server:2022-latest",
      "env": {
        "ACCEPT_EULA": "Y",
        "MSSQL_SA_PASSWORD": "{sql1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 1433
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{sql1.connectionString};Database=shipping"
    }
  }
}

MongoDB tipos de recursos

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddMongoDB("mongodb1")
       .AddDatabase("shipping");

Exemplo de manifesto:

{
  "resources": {
    "mongodb1": {
      "type": "container.v0",
      "connectionString": "mongodb://{mongodb1.bindings.tcp.host}:{mongodb1.bindings.tcp.port}",
      "image": "mongo:7.0.5",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 27017
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{mongodb1.connectionString}/shipping"
    }
  }
}

MySQL tipos de recursos

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddMySql("mysql1")
       .AddDatabase("shipping");

Exemplo de manifesto:

{
  "resources": {
    "mysql1": {
      "type": "container.v0",
      "connectionString": "Server={mysql1.bindings.tcp.host};Port={mysql1.bindings.tcp.port};User ID=root;Password={mysql1.inputs.password}",
      "image": "mysql:8.3.0",
      "env": {
        "MYSQL_ROOT_PASSWORD": "{mysql1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 3306
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{mysql1.connectionString};Database=shipping"
    }
  }
}

Azuretipos de recursos específicos

Os seguintes recursos estão disponíveis no 📦Aspire. Hospedagem.Azure pacote NuGet.

Utilização do Modelo de Aplicação Tipo de recurso de manifesto Link do título
AddAzureAppConfiguration azure.bicep.v0 Azure tipos de recursos de Configuração de Aplicativo
AddAzureKeyVault azure.bicep.v0 Azure Key Vault tipo de recurso
AddAzureRedis azure.bicep.v0 Azure Redis tipos de recursos
AddAzureServiceBus azure.bicep.v0 Azure Service Bus tipo de recurso
AddAzureSqlServer(...) azure.bicep.v0 Azure tipos de recursos SQL
AddAzureSqlServer(...).AddDatabase(...) value.v0 Azure tipos de recursos SQL
AddAzurePostgresFlexibleServer(...) azure.bicep.v0 Azure Postgres tipos de recursos
AddAzurePostgresFlexibleServer(...).AddDatabase(...) value.v0 Azure Postgres tipos de recursos
AddAzureStorage azure.storage.v0 Azure Tipos de recursos de armazenamento
AddBlobs value.v0 Azure Tipos de recursos de armazenamento
AddQueues value.v0 Azure Tipos de recursos de armazenamento
AddTables value.v0 Azure Tipos de recursos de armazenamento

Azure Key Vault tipo de recurso

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureKeyVault("keyvault1");

Exemplo de manifesto:

{
  "resources": {
    "keyvault1": {
      "type": "azure.bicep.v0",
      "connectionString": "{keyvault1.outputs.vaultUri}",
      "path": "aspire.hosting.azure.bicep.keyvault.bicep",
      "params": {
        "principalId": "",
        "principalType": "",
        "vaultName": "keyvault1"
      }
    }
  }
}

Azure Service Bus tipo de recurso

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureServiceBus("sb1")
       .AddTopic("topic1", [])
       .AddTopic("topic2", [])
       .AddQueue("queue1")
       .AddQueue("queue2");

Exemplo de manifesto:

{
  "resources": {
    "sb1": {
      "type": "azure.bicep.v0",
      "connectionString": "{sb1.outputs.serviceBusEndpoint}",
      "path": "aspire.hosting.azure.bicep.servicebus.bicep",
      "params": {
        "serviceBusNamespaceName": "sb1",
        "principalId": "",
        "principalType": "",
        "queues": [
          "queue1",
          "queue2"
        ],
        "topics": [
          {
            "name": "topic1",
            "subscriptions": []
          },
          {
            "name": "topic2",
            "subscriptions": []
          }
        ]
      }
    }
  }
}

Azure Tipos de recursos de armazenamento

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("images");

storage.AddBlobs("blobs");
storage.AddQueues("queues");
storage.AddTables("tables");

Exemplo de manifesto:

{
  "resources": {
    "images": {
      "type": "azure.bicep.v0",
      "path": "aspire.hosting.azure.bicep.storage.bicep",
      "params": {
        "principalId": "",
        "principalType": "",
        "storageName": "images"
      }
    },
    "blobs": {
      "type": "value.v0",
      "connectionString": "{images.outputs.blobEndpoint}"
    },
    "queues": {
      "type": "value.v0",
      "connectionString": "{images.outputs.queueEndpoint}"
    },
    "tables": {
      "type": "value.v0",
      "connectionString": "{images.outputs.tableEndpoint}"
    }
  }
}

Azure Redis tipo de recurso

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureRedis("azredis1");

Exemplo de manifesto:

{
  "resources": {
    "azredis": {
      "type": "azure.bicep.v0",
      "connectionString": "{azredis.outputs.connectionString}",
      "path": "azredis.module.bicep",
      "params": {
        "principalId": "",
        "principalName": ""
      }
    }
  }
}

Azure tipo de recurso Configuração do Aplicativo

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureAppConfiguration("appconfig1");

Exemplo de manifesto:

{
  "resources": {
    "appconfig1": {
      "type": "azure.bicep.v0",
      "connectionString": "{appconfig1.outputs.appConfigEndpoint}",
      "path": "aspire.hosting.azure.bicep.appconfig.bicep",
      "params": {
        "configName": "appconfig1",
        "principalId": "",
        "principalType": ""
      }
    }
  }
}

Azure tipos de recursos SQL

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureSqlServer("sql")
       .AddDatabase("inventory");

Exemplo de manifesto:

{
  "resources": {
    "sql": {
      "type": "azure.bicep.v0",
      "connectionString": "Server=tcp:{sql.outputs.sqlServerFqdn},1433;Encrypt=True;Authentication=\u0022Active Directory Default\u0022",
      "path": "sql.module.bicep",
      "params": {
        "principalId": "",
        "principalName": ""
      }
    },
    "inventory": {
      "type": "value.v0",
      "connectionString": "{sql.connectionString};Database=inventory"
    }
  }
}

Azure Postgres tipos de recursos

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzurePostgresFlexibleServer("postgres")
       .AddDatabase("db");

Exemplo de manifesto:

{
  "resources": {
    "postgres": {
      "type": "azure.bicep.v0",
      "connectionString": "{postgres.outputs.connectionString}",
      "path": "postgres.module.bicep",
      "params": {
        "principalId": "",
        "principalType": "",
        "principalName": ""
      }
    },
    "db": {
      "type": "value.v0",
      "connectionString": "{postgres.connectionString};Database=db"
    }
  }
}

Tipos de recursos suportados no Azure Developer CLI

O Azure Developer CLI (azd) é uma ferramenta que pode ser usada para implantar .NET Aspire projetos para Azure Container Apps. Com o azure.bicep.v0 tipo de recurso, os tipos de contêiner de recursos independentes da nuvem podem ser mapeados para recursos específicos Azure. A tabela a seguir lista os tipos de recursos suportados no Azure Developer CLI:

Designação API independente da nuvem Azure API
Redis AddRedis AddAzureRedis
Postgres AddPostgres AddAzurePostgresFlexibleServer
SQL Server AddSqlServer AddAzureSqlServer

Quando os recursos configurados como recursos Azure, o tipo de recurso azure.bicep.v0 é gerado no manifesto. Para obter mais informações, consulte Implantar um projeto .NET Aspire para Azure Container Apps usando o Azure Developer CLI (guia detalhado).

Ver também