Compartilhar 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 de .NET.NET Aspire válido é necessário para gerar um manifesto. Para começar, crie um projeto .NET.NET Aspire usando o modelo de aspire-starter.NET:

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

A geração de manifesto é obtida executando dotnet build com um destino especial:

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

Ponta

O --output-path dá suporte a 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 de execução do dotnet. 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.

Nota

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

Publicar o manifesto do modelo inicial padrão para .NET Aspire produz a seguinte saída de 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 propriedade para cada um dos objetos de recurso filho em JSON).

Referências de cadeia de conexão e associação

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

Essa dependência é conhecida porque as variáveis de ambiente do webfrontend contêm espaços reservados que fazem referência aos dois outros 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 a chamada WithReference(apiservice) no arquivo de host do aplicativo Program.cs e redis é referenciado usando a chamada WithReference(cache):

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 tipos de recursos de projeto resultam em descoberta de serviço variáveis sendo injetadas no projeto de referência. Referências a tipos de referência conhecidos, como Redis resultam na injeção de cadeias de conexão.

Um diagrama mostrando quais recursos contribuem para quais cadeias de espaços reservados 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 é mapeado para cadeias de caracteres de espaço reservado.

O segmento final da cadeia de caracteres de espaço reservado (url nesse 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 conhecidos, como Redis. As ferramentas de implantação traduzem o recurso na infraestrutura mais apropriada para o ambiente de nuvem de destino e produzem uma cadeia de conexão .NET.NET Aspire compatível 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 deseja ser hospedado explicitamente como um contêiner.
  • url: para referências de serviço a serviço em que uma URL bem formada é necessária. A ferramenta de implantação produz a 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 da URL.

Tipos de recursos

Cada recurso tem um campo type. Quando uma ferramenta de implantação lê o manifesto, ele deve ler o tipo para verificar se ele pode processar corretamente o manifesto. Durante o período de visualização .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, 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 de versão adequadamente).

Campos de recurso 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.

Nota

O tipo de recurso executable.v0 não é totalmente implementado no manifesto devido à sua falta de utilitário em cenários de implantação. Para obter mais informações sobre o contêiner de executáveis, consulte Dockerfile tipos de recursos.

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

As associações são especificadas no campo bindings com cada associação contida em seu próprio campo no 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: igual a 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. Esse 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 de espaço reservado. Os recursos que têm um connectionString, por exemplo, podem usar o campo inputs para especificar um 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 snippet de JSON anterior mostra o campo inputs para um recurso que tem um campo de 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 uma cadeia de caracteres aleatória de um comprimento mínimo.

Recursos internos

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

Tipos de recursos independentes de nuvem

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

Uso do modelo de aplicativo Tipo de recurso de manifesto Link de título
AddContainer container.v0 tipo de recurso 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");

Manifesto de exemplo:

"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);

Manifesto de exemplo:

{
  "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();

Ponta

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.

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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 recursos a seguir estão disponíveis no 📦Aspire. Hospedagem.Azure pacote NuGet.

Uso do Modelo de Aplicativo Tipo de recurso de manifesto Link de título
AddAzureAppConfiguration azure.bicep.v0 Azure tipos de recurso 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");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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": []
          }
        ]
      }
    }
  }
}

tipos de recursos de armazenamento Azure

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

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

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

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

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

Azure tipo de recurso de Configuração de Aplicativo

Código de exemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureAppConfiguration("appconfig1");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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");

Manifesto de exemplo:

{
  "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 com suporte no Azure Developer CLI

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

Nome API independente de nuvem API de Azure
Redis AddRedis AddAzureRedis
Postgres AddPostgres AddAzurePostgresFlexibleServer
SQL Server AddSqlServer AddAzureSqlServer

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

Consulte também