将亚马逊云科技与 .NET Aspire 集成

作者: 诺姆·约翰森 |

.NET Aspire 是一种构建云就绪应用程序的新方法。特别是,它为本地环境提供了编排,可以在其中运行、连接和调试分布式应用程序的组件。这些组件可以是 .NET 项目、数据库、容器或可执行文件。.NET Aspire 旨在与分布式应用程序中使用的常用组件集成。这些集成减少了为每个组件编写的粘合代码量,以便将它们全部绑定在一起。

看到 .NET Aspire 如何帮助改善云就绪应用程序的内部开发循环,亚马逊云科技的 .NET 团队一直在研究将您的 .NET 应用程序连接到亚马逊云科技资源的集成。迄今为止发布的集成在 .NET Aspire AppHost 项目中使用。通过将 Aspire.Hosting.Amazon NuGet 软件包添加到 .NET Aspire AppHost 项目中,可以包含这些集成。

使用我们的 Aspire.Hosting.Amazon NuGet 包,在 .NET Aspire 应用程序启动过程中,可以使用 Amazon CloudFormation 自动配置亚马逊云科技应用资源。可以在 .NET 应用程序中使用适用于 .NET 的亚马逊云科技开发工具包将预置的资源连接到代码。这使开发人员无需执行额外步骤来设置本地开发环境。

对于想要避免访问真实 DynamoDB 服务进行本地调试所需的费用和网络的 Amazon DynamoDB 用户来说,有本地的 Amazon DynamoDB。Aspire.Hosting.Amazon NuGet 软件包已将 DynamoDB 本地集成到 .NET Aspire 中,负责安装、配置适用于 .NET 的亚马逊云科技开发工具包并将其连接到 DynamoDB 本地的过程。

.NET Aspire AppHost

在深入了解亚马逊云科技功能之前,让我们先介绍一下 .NET Aspire 的背景知识。对于这篇博客文章来说,深入了解所有 .NET Aspire 的话题实在是太大了。如果你不熟悉 .NET Aspire,我建议你查看 .NET Aspire 文档。与亚马逊云科技集成最相关的是基于 .NET Aspire 的应用程序的 AppHost 项目。

.NET Aspire 项目的核心是 AppHost 项目。这是一个 .NET 项目,它定义了分布式应用程序的所有组件以及每个组件与其他组件的关系。例如,通过在 Visual Studio 中使用 .NET Aspire Starter App 项目模板并启用 Redis 进行缓存,您可以使用以下代码创建 AppHost:


var builder = DistributedApplication.CreateBuilder(args);

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

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

builder.AddProject<Projects.FirstApp_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(cache)
    .WaitFor(cache)
    .WithReference(apiService)
    .WaitFor(apiService);

builder.Build().Run();

此代码使用 Redis 集成来创建代表 Redis 容器的 .NET Aspire 资源。然后,它将前端 .NET 项目添加为资源,并将其与 Redis 资源连接起来。定义了第二个 Web API .NET 项目,并将其添加为对前端项目的引用。

AppHost 项目是 IDE 中的启动项目。当 AppHost 启动进行调试时,Redis 容器和 .NET 项目都将启动。.NET Aspire 为前端项目提供服务发现,以查找 Redis 容器和 Web API 项目。

配置资源

Aspire.Hosting.Amazon 使开发人员能够预置您的亚马逊云科技资源,这是构建应用程序内部开发循环的一部分。这使用 Amazon CloudFormation 来预置应用资源,作为 F5 开发内部循环的一部分。亚马逊云科技资源可以使用 CloudFormation 模板或云开发套件 (CDK) 来定义。

以下 AppHost 代码显示了如何在文件中定义亚马逊云科技资源。app-resources.template.NET 项目引用了 CloudFormation 资源。


var builder = DistributedApplication.CreateBuilder(args);

// Set up a configuration for the亚马逊云科技SDK for .NET.
var awsConfig = builder.AddAWSSDKConfig()
                        .WithProfile("dev")
                        .WithRegion(RegionEndpoint.USWest2);
                        
// Provision application-level resources like SQS queues and SNS topics
// defined in the CloudFormation template file called app-resources.template.
var awsResources = builder.AddAWSCloudFormationTemplate("AWSResources", "app-resources.template")
                          .WithReference(awsConfig);
                        
builder.AddProject<Projects.Frontend>("Frontend")
         .WithExternalHttpEndpoints()
         .WithReference(awsResources);      

启动 AppHost 时,亚马逊云科技集成会检查自上次调试会话以来是否对 app-resources.template 文件进行了任何更改。如果有更改或 CloudFormation 堆栈不存在,则应用该模板。

CloudFormation 模板定义了一组输出参数。这些输出参数通常是 CloudFormation 创建的资源的标识符。通过使用向 .NET 项目添加 CloudFormation 资源引用的 WithReference 方法,将输出参数分配给 .NET 项目。可以通过 IConfiguration 接口访问输出参数。例如,以下 CloudFormation 模板定义了带有输出参数的主题和队列,以保存主题和队列的标识符。

输出参数 ChatTopicArn 是主题的标识符,可以从 .NET 项目 IConfiguration 中检索。默认情况下,集成将输出参数放在 亚马逊云科技:Resources 配置部分下。可以通过在 WithReference 方法调用中将配置部分名称作为参数传递来更改此设置。以下代码演示了如何获取主题标识符以用于我们的亚马逊云科技消息库。


builder.Services.AddAWSMessageBus(messageBuilder =>
{
    var chatTopicArn = builder.Configuration["亚马逊云科技:Resources:ChatTopicArn"];
    if (chatTopicArn != null)
    {
        messageBuilder.AddSNSPublisher<Frontend.Models.ChatMessage>(chatTopicArn);
    }
});

以下屏幕截图显示了这款 AppHost 的 .NET Aspire 仪表板,其中包含 CloudFormation 资源和 .NET 项目。

在这种情况下,CloudFormation 堆栈尚不存在。CloudFormation 资源的控制台日志将显示配置情况。

如果 CloudFormation 模板没有更改,日志将表示未发现任何更改,而是从现有堆栈中获取输出参数以包含在参考项目中。这意味着只有在需要对 CloudFormation 堆栈进行更改时,开发内部循环才会暂停。

作为 .NET Conf 2024 的一部分,亚马逊云科技发表了以下演讲,演示了亚马逊云科技的资源配置。观看视频,深入了解集成以及使用 CDK 定义应用程序资源。

集成 Amazon DynamoDB 本地

Amazon DynamoDB 提供本地版本的 DynamoDB 以容器形式分发,用于开发和测试。使用 Aspire.Hosting.Amazon 软件包 9.1.0 版,您可以轻松地将 DynamoDB 本地容器与 .NET Aspire 项目集成。这样便可以在用于开发的 DynamoDB Local 与亚马逊云科技中的生产 DynamoDB 服务之间实现无缝过渡,而无需对应用程序进行任何代码更改。

要开始使用 .NET Aspire AppHost,请调用该 AddAWSDynamoDBLocal 方法将 DynamoDB 本地作为资源添加到 .NET Aspire 应用程序中。


var builder = DistributedApplication.CreateBuilder(args);

// Add a DynamoDB Local instance
var localDynamoDB = builder.AddAWSDynamoDBLocal("DynamoDBLocal");

对于使用 DynamoDB 的 .NET Aspire 应用程序中的每个 .NET 项目,添加对 DynamoDB 本地资源的引用。


// Reference DynamoDB local in project
builder.AddProject<Projects.Frontend>("Frontend")
   .WithReference(localDynamoDB);

在使用 DynamoDB 的 .NET 项目中,您需要使用软件开发工具包构建 DynamoDB 服务客户端,而无需明确设置亚马逊云科技区域或服务终端节点。这意味着在不传入区域或设置了 RegionEndpoint 属性的情况下构造 AmazonDynamoDBClient 对象。AmazonDynamoDBConfig 通过不明确设置区域,SDK 会在环境中搜索配置,告知 SDK 将请求发送到何处。区域由 AWS_REGION 环境变量在本地设置,或通过设置区域属性在您的证书配置文件中设置。部署到亚马逊云科技后,计算环境会设置环境配置,例如 AWS_REGION 环境变量,以便 SDK 知道服务客户端应使用哪个区域。

亚马逊云科技开发工具包具有一项名为特定服务终端节点的功能,该功能允许通过环境变量为服务设置终端节点。.NET 项目上的 WithReference 调用设置了 AWS_ENDPOINT_URL_DYNAMODB 环境变量。它将设置为作为该方法的一部分启动的 DynamoDB 本地容器。AddAWSDynamoDBLocal

AWS_ENDPOINT_URL_DYNAMODB 环境变量会覆盖其他配置设置,例如 AWS_REGION 环境变量,从而确保您在本地运行的项目使用 DynamoDB 本地。创建指向 DynamoDB 本地的 AmazonDynamoDBClient 之后,所有其他服务调用的工作方式与您要访问真正的 DynamoDB 服务相同。无需更改代码。

DynamoDB 本地选项

调用 AddAWSDynamoDBLocal 方法时,默认情况下,任何数据和表定义都存储在内存中。这意味着每次启动 .NET Aspire 应用程序时,DynamoDB 本地都会使用一个没有表或数据的新实例启动。该 AddAWSDynamoDBLocal 方法采用一个可选 DynamoDBLocalOptions 对象,该对象暴露了可用于 DynamoDB 本地的选项。

如果您希望表和数据在 .NET Aspire 调试会话之间保持不变,请将该 DynamoDBLocalOptions 对象的 LocalStorageDirectory 属性设置为将保存数据的本地文件夹。该 AddAWSDynamoDBLocal 方法将负责将本地目录挂载到容器并配置 DynamoDB 本地进程以使用挂载点。

下一步是什么?

我们在 .NET Aspire 上的工作是在我们新的 aws/integrations-on-dotnet-aspire-for-aws GitHub 存储库中完成的。我们很乐意听取社区关于您对 .NET Aspire 的看法以及您希望在亚马逊云科技集成中看到什么。

我们正在进行的下一个重大工作是创建本地开发环境来构建和调试 .NET Lambda 函数。你可以通过订阅以下 GitHub 期刊来追踪我们在 Lambda 方面的进展:https://github.com/aws/integrations-on-dotnet-aspire-for-aws/issues/17。我们已经发布了早期预览版,您的反馈对于确保我们打造正确的开发者体验非常重要。

结论

尝试在本地开发环境中使用 .NET Aspire。您可以直接利用 .NET Aspire 提供的应用程序资源配置。团队可以使用 .NET Aspire 设置存储库,这样当成员需要开始在应用程序上进行开发时,他们可以克隆存储库,在他们选择的 IDE 中打开解决方案,然后开始调试。将在新团队成员开始调试体验时提供所需的资源。这意味着无需其他工具即可让应用程序在本地运行。利用搭载 .NET Aspire 的 DynamoDB 本地功能,无需退出开发环境即可轻松获取和连接。如果您对我们的 aws/integrations-on-dotnet-aspire-for-aws GitHub 存储库有任何问题或反馈,请联系我们。

诺姆·约翰森

诺姆·约翰森

Norm Johanson 从事软件开发工作超过 25 年,负责开发各种类型的应用程序。自 2010 年以来,他一直在亚马逊云科技工作,专注于亚马逊云科技的 .NET 开发人员体验。你可以在 Twitter @socketnorm 和 GitHub @normj 上找到他。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。