添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如果使用本地计算机进行此实验 ,请继续执行第 2 步。

如果使用 Cloud9 ,请继续执行以下操作。

可选:您可以按照此 AWS 快速入门 ,使用大多数必需的开发工具自动创建 Cloud9 环境。

否则,请继续执行下面的操作:

A. 在 AWS 管理控制台中,导航到 Cloud9 并单击 创建环境

B. 将环境命名为 FargateLab ,然后单击 下一步

C. 在配置设置页面上,保留符合免费套餐条件的实例类型的默认值,然后单击 下一步

D. 单击 创建环境

E. 等待环境完成创建,这需要几分钟时间。

注意 :如果由于 t2.micro 实例类型在该区域不可用而导致环境创建失败,请删除该环境并重复上述步骤,这次请选择另外一种小型实例类型。如果免费套餐中不包含该实例类型,请注意您需按照特定费率为实验期间对该实例类型的使用付费。

  • PowerUserAccess
  • AWSCloudFormationFullAccess
  • AmazonECS_FullAccessAmazonEC2ContainerRegistryFullAccess
  • AmazonSSMFullAccess
  • IAMFullAccess
  • 安装 .NET 6 SDK 。 下载并安装适用于您操作系统的 SDK。

    如果您使用本地计算机 ,请 下载并安装适用于您的操作系统的.NET 6 SDK

    如果使用 Cloud9 ,则可以在“安装所需工具”下运行 以下命令

    sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

    sudo yum -y update

    sudo yum install dotnet-sdk-6.0

    单击 Weather 表名称,进入其详细信息页面,然后单击 浏览表项目 。添加以下项目:

    A.单击 创建项目 JSON 视图 。输入以下 JSON(Dallas, morning),然后单击 创建项目

    "Location": { "S": "Dallas" "Timestamp": { "S": "2022-07-23T06:00:00" "Summary": { "S": "Hot" "TempC": { "N": "33" "TempF": { "N": "92" Code snippet copied

    B.以同样的方式,使用以下 JSON 添加第二个项目(Dallas, mid-day):

    "Location": { "S": "Dallas" "Timestamp": { "S": "2022-07-23T12:00:00" "Summary": { "S": "Scorching" "TempC": { "N": "43" "TempF": { "N": "109" Code snippet copied

    C.使用以下 JSON 添加第三个项目(Dallas, evening):

    "Location": { "S": "Dallas" "Timestamp": { "S": "2022-07-23T18:00:00" "Summary": { "S": "Hot" "TempC": { "N": "36" "TempF": { "N": "97" Code snippet copied

    D.使用以下 JSON 添加第四个项目(Minnesota, morning):

    "Location": { "S": "Minneapolis" "Timestamp": { "S": "2022-07-23T06:00:00" "Summary": { "S": "Cool" "TempC": { "N": "13" "TempF": { "N": "56" Code snippet copied

    E.使用以下 JSON 添加第五个项目(Minnesota, mid-day):

    "Location": { "S": "Minneapolis" "Timestamp": { "S": "2022-07-23T12:00:00" "Summary": { "S": "Balmy" "TempC": { "N": "22" "TempF": { "N": "72" Code snippet copied

    F.使用以下 JSON 添加第六个项目(Minnesota, evening):

    "Location": { "S": "Minneapolis" "Timestamp": { "S": "2022-07-23T18:00:00" "Summary": { "S": "Balmy" "TempC": { "N": "19" "TempF": { "N": "67" Code snippet copied

    检查您的成果

    现在,您应该:

    ✓ 有一个名为 Weather 的 DynamoDB 表,并且表中填充了 6 个项目。

    C. 添加 DynamoDB SDK 包。运行以下 dotnet add package 命令,将 AWSSDK.DynamoDBv2 包添加到项目中。我们需要这个库来与 Amazon DynamoDB 服务通信。

    dotnet add package AWSSDK.DynamoDBv2

    已生成的项目是 WeatherForecast API,在 .NET 示例中很常用。

    A.要试用该项目,请 1) 在 IDE 中按 F5,或 2) 从命令行运行 dotnet run 并浏览到端点地址,其中 /swagger/index.html 位于路径末尾。

    B.在打开的浏览器选项卡中,您会看到一个 Swagger 界面。请注意,该服务有一个 /WeatherForecast 操作,可返回模拟天气数据 JSON。通过单击“获取”、“试用”和“执行”来对其进行测试。注意 JSON 响应。您可能会在浏览器中看到有关 HTTPS 的“不安全”指示符,也可能不会看到,具体取决于您是否接受本地 SSL 证书。

    C.停止运行程序。

    我们的 Web API 将在端口 8080(HTTP)和 8443(SSL)上运行。在代码编辑器中打开 Properties/launchSettings.json。在第 17 行中,将 applicationUrl 值更改为:

    "applicationUrl": "https://localhost:8443;http://localhost:8080",
    Code snippet copied

    打开 Controllers 文件夹中的 WeatherForecastController.cs,然后将其替换为以下代码。在第 12 行中,将 RegionEndpoint 设置为您正在其中运行的区域。此代码将在服务的根路径上实施运行状况检查方法,并在 /WeatherForecast 实施 WeatherForecast 方法。

    /WeatherForecast 方法采用位置参数并从 DynamoDB Weather 表中为其检索数据。它对表执行扫描,以查找分区键与位置相匹配的记录。匹配的 DynamoDB 项目存储在 WeatherForecast 对象列表中。结果以 JSON 记录数组的形式返回。

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Amazon;
    using Amazon.DynamoDBv2;
    using Amazon.DynamoDBv2.DocumentModel;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    namespace WeatherAPI.Controllers;
    [ApiController]
    [Route("")]
    public class WeatherForecastController : ControllerBase
        static readonly RegionEndpoint region = RegionEndpoint.USWest2;
        private readonly ILogger _logger;
        public WeatherForecastController(ILogger logger)
            _logger = logger;
        [HttpGet("")]
        public string GetHealthcheck()
            return "Healthcheck: Healthy";
        [HttpGet("WeatherForecast")]
        public async Task<WeatherForecast[]> GetWeatherForecast(string location = "Dallas")
            List<WeatherForecast> forecasts = new List<WeatherForecast>();
                _logger.LogInformation($"00 enter GET, location = {location}");
                var client = new AmazonDynamoDBClient(region);
                Table table = Table.LoadTable(client, "Weather");
                var filter = new ScanFilter();
                filter.AddCondition("Location", ScanOperator.Equal, location);
                var scanConfig = new ScanOperationConfig()
                    Filter = filter,
                    Select = SelectValues.SpecificAttributes,
                    AttributesToGet = new List<String> { "Location", "Timestamp", "TempC", "TempF", "Summary" }
                _logger.LogInformation($"10 table.Scan");
                Search search = table.Scan(scanConfig);
                List<Document> matches;
                    _logger.LogInformation($"20 table.GetNextSetAsync");
                    matches = await search.GetNextSetAsync();
                    foreach (var match in matches)
                        forecasts.Add(new WeatherForecast
                            Location = Convert.ToString(match["Location"]),
                            Date = Convert.ToDateTime(match["Timestamp"]),
                            TemperatureC = Convert.ToInt32(match["TempC"]),
                            TemperatureF = Convert.ToInt32(match["TempF"]),
                            Summary = Convert.ToString(match["Summary"])
                } while (!search.IsDone);
                _logger.LogInformation($"30 exited results loop");
            catch (Exception ex)
                _logger.LogError(ex, "90 Exception");
            _logger.LogInformation($"99 returning {forecasts.Count} results");
            return forecasts.ToArray();
                   Code snippet copied 
                 

    ✓ 已安装 AWSDK.DynamoDBv2 NuGet 包

    ✓ 在 Program.cs 中注释掉 HTTPS 重定向

    ✓ 将 WeatherForecastController.cs 更新为根运行状况检查方法和查询 DynamoDB 天气表的 WeatherForecast 方法

    ✓ 将 WeatherForecastController.cs 区域变量设置为您运行所在的区域

    注意:每次运行 dotnet aws deploy 时,选项列表和顺序可能会有所不同。

    C.如果系统提示您选择现有的 AWS 部署目标,请选择部署到新的云应用程序选项。

    D.选择“使用 Fargate 从 ASP.NET Core App 部署到 Amazon ECS”选项。

    E.对于新 CloudFormation 堆栈的名称,请按 Enter 接受默认名称 WeatherAPI

    显示当前设置时,输入 more 以查看高级设置。随即将显示设置的编号列表。输入 9 选择 Elastic Load Balancer,按如下提示操作:

    A.创建新的负载均衡器:y

    B.取消注册延迟:180

    C.运行状况检查路径:/

    D.运行状况检查超时:5

    E.运行状况检查间隔:120

    F.运行正常阈值计数:2

    G.运行不正常阈值计数:2

    A.按 Enter 开始部署。部署将创建 1 个负载均衡器、3 个 ECS 任务并创建新角色。

    B.等待服务进行容器化和部署,这需要几分钟时间。完成后,记下输出末尾的部署详细信息。

    C. 记录“应用程序端点”下的详细信息。您将需要端点来测试服务。

    RUN apt-get update -yq \ && apt-get install curl gnupg -yq \ && curl -sL https://deb.nodesource.com/setup_14.x | bash \ && apt-get install nodejs -yq RUN dotnet publish "WeatherAPI.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WeatherAPI.dll"]
    Code snippet copied

    审查 AWS 管理控制台中部署的内容:

    A.在 AWS 管理控制台中,导航到 ECS

    B.从左侧窗格中选择 集群 ,应该会列出 WeatherAPI 集群。您应该看到一个包含 1 个服务和 3 个正在运行的任务的集群。(图 1)

    C.单击 WeatherAPI 集群名称以查看其详细信息。浏览选项卡以查看已部署的内容。在“任务”选项卡上,您应该看到 3 个启动类型为 FARGATE 的正在运行的任务。(图 2)

    A.在 AWS 管理控制台中,导航到 IAM

    B.从左侧窗格中选择 策略 ,然后单击 创建策略

    C.创建策略并输入以下 JSON,将 [account] 替换为您的 12 位 AWS 账号,并将 [region] 替换为您的区域(例如:us-west-2)。

    "Version": "2012-10-17", "Statement": [ "Sid": "", "Effect": "Allow", "Action": "dynamodb:*", "Resource": "arn:aws:dynamodb:[region]:[account]:table/Weather" Code snippet copied

    D.依次单击 下一步:标签 下一步:查看 。 将策略命名为 ddb-Weather ,然后单击 创建策略

    ECS 服务尚无访问 Weather DynamoDB 表的权限。更新角色以添加 2 个策略:

    A.在 AWS ECS 控制台中,单击 WeatherAPI 集群以查看其详细信息。

    B.单击 WeatherAPI-service 以查看服务详细信息。

    C.选择 配置和任务 选项卡,然后单击 任务定义 链接。

    D.单击 任务角色 链接。这会将您转至 IAM 控制台中的角色定义位置。

    E.单击 添加权限 > 附加策略

    F.查找并选择 ddb-weather 权限

    G.查找并选择 AmazonDynamoDBFullAccess 权限。

    H.单击 附加策略

    A.打开命令/终端窗口并持续交付到开发文件夹。您可以使用在步骤 4-1 中使用的相同文件夹。

    B.运行以下 dotnet new 命令,创建一个名为 WeatherAPI 的新 Web API 项目。

    dotnet new webapp -n WeatherSite

    C.持续交付到 WeatherSite 项目文件夹。

    已生成的项目是一个简单的 Web 应用程序,在 .NET 示例中很常用。

    A.要试用该项目,请 1) 在 IDE 中按 F5,或 2) 从命令行运行 dotnet run 并浏览到端点地址。

    B.在打开的浏览器选项卡中,您会看到一个带有欢迎消息的简单页面。

    C.停止运行程序。

    在代码编辑器中打开 appsettings.json 并替换为以下代码,将 [service-address] 替换为 WeatherAPI ECS 服务的端点地址。WeatherAPI 服务地址末尾不应有斜杠。

    "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" "AllowedHosts": "*", "AppSettings": { "WeatherAPI": "http://[service-address]" Code snippet copied

    在代码编辑器中打开 Pages/Index.cshtml.cs,然后将其替换为下面的代码。这是 Razor 页面 Index.cshtml 的代码隐藏文件。

    WeatherAPI 服务的 URL 是从 appSettings.json 中的设置读取的。/WeatherForecast 路由采用位置参数并从 DynamoDB Weather 表中为其检索数据。结果以 JSON 记录数组的形式返回。

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    namespace WeatherSite.Pages;
    public class IndexModel : PageModel
     [BindProperty(SupportsGet = true)]
     public string Location { get; set; } = "Dallas";
     public string Message { get; private set; } = "";
     public IEnumerable? Items { get; private set; }
     private readonly IConfiguration _configuration;
     private static readonly HttpClient _httpClient = new();
     public IndexModel(IConfiguration configuration)
      _configuration = configuration;
     public async Task OnGet()
       var requestUri = $"{_configuration["AppSettings:WeatherAPI"]}/WeatherForecast?location={Location}";
       Items = await _httpClient.GetFromJsonAsync>(requestUri);
       Message = $"{Items?.Count()} forecast records found";
      catch (HttpRequestException ex)
       Message = ex.Message;
                   Code snippet copied 
                 

    在代码编辑器中打开 Pages/Index.cshtml,然后将其替换为下面的代码。Razor 页面使用 @ 表示法显示代码隐藏模型中的一些值:位置、成功/错误消息和天气预报数据表。

    @page
    @model IndexModel
        ViewData["Title"] = "Home page";
    <style>
        .styled-table {
            border-collapse: collapse;
            font-size: 0.9em;
            font-family: sans-serif;
            min-width: 400px;
            box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
            margin-left: auto;
            margin-right: auto;
            .styled-table thead tr {
                background-color: cornflowerblue;
                color: #ffffff;
                text-align: left;
            .styled-table th,
            .styled-table td {
                padding: 12px 15px;
            .styled-table tbody tr {
                border-bottom: 1px solid #dddddd;
                .styled-table tbody tr:nth-of-type(even) {
                    background-color: #f3f3f3;
                .styled-table tbody tr:last-of-type {
                    border-bottom: 2px solid cornflowerblue;
                .styled-table tbody tr.active-row {
                    font-weight: bold;
                    color: cornflowerblue;
    </style>
    <div class="text-center">
                                      <h1 class="display-4">@Model.Location Weather</h1>
                                      <p>Weather Forecast</p>
                                      <p>@Model.Message</p>
                                      <p><a href="/?location=Dallas">Dallas</a></p>
                                      <p><a href="/?location=Minneapolis">Minneapolis</a></p>
        @if (@Model.Items != null)
                                      <table class="styled-table">
                                      <thead>
                                      <tr><th>Location</th><th>Time</th><th>Temp (°C)</th><th>Temp (°F)</th><th>Summary</th>
                </thead>
                                      <tbody>
                    @foreach (var forecast in Model.Items)
                                      <td>@forecast.Location</td>
                                      <td>@forecast.Date.ToString("yyyy-MM-ddHH:MM")</td>
                                      <td>@forecast.TemperatureC</td>
                                      <td>@forecast.TemperatureF</td>
                                      <td>@forecast.Summary</td>
                </tbody>
            </table>
                   Code snippet copied 
                 

    现在我们将为网站设置生产端口。在打开 WeatherSite 项目的 IDE 中,在代码编辑器中打开 Properties/launchSettings.json。在第 17 行中,将 applicationUrl 值更改为:

    "applicationUrl": "https://localhost:443;http://localhost:80",
    Code snippet copied

    显示当前设置时,输入 more 以查看高级设置。随即将显示设置的编号列表。输入 9 选择 Elastic Load Balancer,按如下提示操作:

    A.创建新的负载均衡器:y

    B.取消注册延迟:180

    C.运行状况检查路径:/

    D.运行状况检查超时:5

    E.运行状况检查间隔:120

    F.运行正常阈值计数:2

    G.运行不正常阈值计数:2

    A.按 Enter 开始部署。部署将创建 1 个负载均衡器、3 个 ECS 任务并创建新角色。

    B.等待网站进行容器化和部署,这需要几分钟时间。完成后,记下输出末尾的部署详细信息。

    C.记录“应用程序端点”下的详细信息。 您将需要端点来测试网站。

    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["WeatherSite.csproj", ""] RUN dotnet restore "WeatherSite.csproj" COPY . . WORKDIR "/src/" RUN dotnet build "WeatherSite.csproj" -c Release -o /app/build FROM build AS publish RUN apt-get update -yq \ && apt-get install curl gnupg -yq \ && curl -sL https://deb.nodesource.com/setup_14.x | bash \ && apt-get install nodejs -yq RUN dotnet publish "WeatherSite.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WeatherSite.dll"]
    Code snippet copied

    A.在 AWS 管理控制台中,导航到 ECS

    B.在左侧窗格中选择集群。随即应该列出 WeatherSite 集群。您应该会看到一个包含 3 个正在运行的任务的服务。(图 1)

    C.单击 WeatherSite 集群名称以查看其详细信息。浏览选项卡以查看已部署的内容。您应该看到 3 个启动类型为 FARGATE 的任务。(图 2)

    ✓ 已使用适用于.NET CLI 的 AWS 部署工具将网站容器化并部署到 ECS。

    ✓ 已在 ECS 控制台中确认部署。

    ✓ 已确认网站已上线并且可以访问 Weather API 服务。

    ✓ 已经看到网站、API 和 DynamoDB 表在 AWS 上协同工作。

  • 创建了一个 DynamoDB 表并在其中填充了天气数据。
  • 开发了一个从 DynamoDB 表中检索天气数据的 .NET Web API 项目。
  • 使用适用于 .NET CLI 的 AWS 部署工具将 WeatherAPI 项目部署到了 AWS Fargate 上的 Amazon ECS。
  • 开发了一个从 WeatherAPI 检索数据的网站。
  • 使用适用于 .NET CLI 的 AWS 部署工具将 WeatherSite 项目部署到了 AWS Fargate 上的 Amazon ECS。
  • 更新了天气数据和网站,将更新后的网站部署到 ECS 并修改了其任务数。
  • 删除了 WeatherSite 和 WeatherAPI 的部署,并在 AWS 管理控制台中删除了 Weather DynamoDB 表。
  • AWS 对 Internet Explorer 的支持将于 07/31/2022 结束。受支持的浏览器包括 Chrome、Firefox、Edge 和 Safari。
    了解详情 »