Amazon ECS 和 AWS Fargate 上的 .NET 工作负载

模块 1

模块 1:了解 Amazon ECS、ECR 和 AWS Fargate

 学习模块

概览

本模块介绍了 Amazon ECS、AWS Fargate 上的 Amazon ECS 和 Amazon ECR。您将了解在 Linux 和 Windows 上运行的容器的集群、容器和映像、任务和任务定义、服务和启动类型。最后,您将汇总所有这些要素,研究方案和路径,以便使用 Amazon ECS 或 AWS Fargate 上的 Amazon ECS 为您的 .NET 应用程序提供最佳容器解决方案。

 完成时间

30 分钟

Amazon ECS 简介

Amazon ECS 是一项用于在云中运行基于容器的应用程序的服务。它提供高度可扩展且快速的容器管理,并与其他 AWS 服务集成,以实现安全性、容器编排、持续集成和部署、服务发现以及监控和可观测性。

您可以使用容器映像启动容器,方法与从虚拟机映像启动虚拟机类似。Amazon ECS 从部署到 Amazon Elastic Container Registry(Amazon ECR)或 Docker Hub 的容器映像部署和运行容器。

Amazon ECS 使用任务定义来定义组成应用程序的容器。任务定义指定应用程序容器的运行方式。您可以定义和使用单个任务(该任务将运行,然后在完成后停止),或者您可以定义您的任务应在服务中运行。服务持续运行并同时维护指定数量的任务,适合长时间运行的应用程序,例如 Web 应用程序。

如果需要,您可以选择配置和管理托管容器的基础设施,或者通过 AWS Fargate 上的 Amazon ECS 利用无服务器方法,其中 AWS 管理容器基础设施,而您则专注于应用程序。Amazon ECS 提供两种运行容器的模型,称为启动类型

EC2 启动类型

EC2 启动类型用于在集群中配置的一个或多个 Amazon Elastic Compute Cloud(EC2)实例上运行容器。使用 EC2 启动类型时,您可以完全控制托管容器的基础设施的配置和管理。

当您必须管理基础设施,或者您的应用程序需要持续保持较高的 CPU 核心和内存使用率、需要进行价格优化或需要持久性存储时,请为您的容器选择 EC2 启动类型。

Fargate 启动类型

Fargate 启动类型是用于运行容器的无服务器选项,按使用量付费。无服务器意味着您不必配置基础设施来托管容器实例,这与 EC2 启动类型不同,后者要求您了解如何配置和管理实例集群来托管正在运行的容器。

Amazon ECS 资源

除了使用启动类型来控制管理容器基础设施的方式之外,在使用 Amazon ECS 时,您还会遇到和使用多种类型的资源。

集群

集群是特定区域中计算资源的逻辑组。集群可保存托管应用程序和应用程序组件的正在运行的容器实例,帮助隔离它们,使它们不使用相同的底层基础设施。如果托管应用程序的基础设施的特定项目出现故障,这可以提高可用性。只需要重新启动受影响的集群。

无论您是使用 Amazon ECS 还是 AWS Fargate 上的 Amazon ECS,都将使用集群。不同之处在于您需要进行管理的程度。如果您在创建集群时指定 EC2 启动类型,则需要负责配置和管理这些集群。但是,如果您使用 Fargate 启动类型,则由 Fargate 负责对其进行管理。

容器

容器包含容器中应用程序或应用程序组件运行所需的所有代码、运行时系统、工具和系统库。当您启动容器实例来托管应用程序时,它们会在与集群关联的计算基础架构上运行。

称为容器映像的只读模板用于启动容器。在使用映像运行容器之前,您需要将容器映像部署到注册表,例如 Amazon Elastic Container Registry(Amazon ECR)或 Docker Hub。

您可以使用称为 Dockerfile 的资源来定义容器映像。Dockerfile 是一个文本文件,详细说明了您想要包含在映像中的所有组件和资源。Amazon ECS 使用在其他地方为 .NET 应用程序定义容器映像时使用的相同 Dockerfile,不做任何更改。使用 docker build 命令,您可以将 Dockerfile 中定义的命令和设置转换为容器映像,您可以将这些容器映像推送到注册表,也可以在 Docker 中本地运行。AWS 提供的容器工具(详见模块 2)通常会为您处理映像的构建和推送。

任务定义

任务定义是一个 JSON 格式的文本文件,用于描述构成应用程序的容器。单个任务定义最多可以描述 10 个容器。

您可以将任务定义视为应用程序环境蓝图,用于指定应用程序和操作系统参数。例如哪些网络端口应打开、需要附加的任何数据卷以及其他资源。

Amazon ECS 不会将您的应用程序限制为单个任务定义。事实上,建议您将构成应用程序一部分的组件的相关容器组合到单个任务定义中,并使用多个任务定义来描述整个应用程序。这使得组成应用程序的不同逻辑组件能够独立扩展。

以典型的 n 层 Web 应用程序为例,该应用程序包括 Web UI 前端层、API 层、中间层和数据库组件层。下图显示了如何将这些组件层分组到不同的任务定义中。例如,如果 Web UI 层遇到使用量激增的情况,则可以独立于其他组件进行水平扩展,反之亦然。如果您在单个任务定义中定义了所有层,则整个应用程序都将在出现负载时扩展,包括使用量未增加的层,这就会增加横向扩展所需的时间(如果您的应用程序很大),并可能增加您的财务成本。

任务定义的示例如下。它使用 Fargate 启动类型上的 Linux 容器设置 Web 服务器。

{
   "containerDefinitions": [ 
      { 
         "command": [
            "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
         ],
         "entryPoint": [
            "sh",
            "-c"
         ],
         "essential": true,
         "image": "httpd:2.4",
         "logConfiguration": { 
            "logDriver": "awslogs",
            "options": { 
               "awslogs-group" : "/ecs/fargate-task-definition",
               "awslogs-region": "us-east-1",
               "awslogs-stream-prefix": "ecs"
            }
         },
         "name": "sample-fargate-app",
         "portMappings": [ 
            { 
               "containerPort": 80,
               "hostPort": 80,
               "protocol": "tcp"
            }
         ]
      }
   ],
   "cpu": "256",
   "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
   "family": "fargate-task-definition",
   "memory": "512",
   "networkMode": "awsvpc",
   "runtimePlatform": {
        "operatingSystemFamily": "LINUX"
    },
   "requiresCompatibilities": [ 
       "FARGATE" 
    ]
}

任务

当 Amazon ECS 实例化任务定义时,它会创建一个或多个在集群中运行的任务。任务是一个正在运行的容器实例。除了其他环境设置外,任务定义还会指定要在集群上运行的任务或容器实例的数量。

您可以将任务配置为独立运行(这会导致容器在任务完成时停止),也可以将任务作为服务持续运行。作为服务的一部分运行时,Amazon ECS 会保持指定数量的任务同时运行,并自动替换失败的容器。

对不需要持续运行的应用程序代码使用独立任务。代码在任务内部运行一次,然后结束,容器实例也将随之结束。对某些数据进行批处理就是这样一个例子。

计划任务

独立任务可配置为按计划运行或为响应某个事件而运行。此类任务被称为计划任务。在这两种情况下,都使用 Amazon EventBridge 来定义 cron 计划或将导致任务运行的事件。Cron 计划将任务配置为每 N 分钟、每小时或每天运行一次。要使计划任务在事件发生时运行,您可以在 Amazon EventBridge 中订阅 AWS 定义的事件或您自己的自定义事件。事件发生时,Amazon ECS 将自动运行任务。

对于需要定期运行而无需操作员干预的应用程序代码,请使用计划任务来手动启动任务。示例方案是执行日志检查、备份操作或定期提取-转换-加载(ETL)作业的代码。

服务

服务是一个或多个持续运行的任务的集合。在任务定义中,您可以定义服务应维护的任务数量,Amazon ECS 会监控容器以确保所请求数量的任务始终可用。

Amazon ECS 在集群中的每个容器实例上运行一个代理。您无需自行安装或维护此代理。该代理报告有关正在运行的任务和容器实例利用率的信息,从而使 Amazon ECS 能够检测失败或停止的任务。发生这种情况时,Amazon ECS 会用新的实例替换失败的任务,以保持服务中有指定数量的任务,而无需您自己进行监控和采取行动。

使用服务来处理需要持续运行的应用程序代码。示例包括网站前端或 Web API。

持续的应用程序数据

在容器实例上运行的应用程序代码通常需要读取或写入有状态的数据。例如,临时数据文件、从您希望在本地短期缓存的外部服务中获取的数据以及数据库,包括在 Amazon EC2 实例、Amazon Relational Database Service(RDS)实例和其他容器中使用 SQL Server 的数据库。或者,跨多个容器实例扩展的应用程序可能需要访问共享存储来存储临时和长期数据。

正在运行的容器实例具有可以存储数据的可写层。但是,可写层是暂时的,当容器实例因用户操作而终止或由于实例运行状况不佳且 Amazon ECS 替换它而终止时,它就会被销毁。这使得可写层不适合长期数据存储(例如数据库中的数据)。此外,可写层中的数据只能由在单个容器实例上运行的代码访问,因此不适合需要在跨多个容器实例的应用程序中共享的数据。

为了使应用程序数据的存储时间长于容器实例的生命周期,或者可以在多个容器实例之间共享,AWS 提供了多种存储服务。这些存储服务将数据存储与计算实例分离。使用与计算实例分离的存储可以使应用程序数据比运行应用程序的容器实例寿命更长,并使数据可以在多个实例之间共享。

容器化 .NET 应用程序可用的存储服务取决于应用程序是在 Linux 还是 Windows 容器上运行。

适用于 Linux 容器的持久性存储选项

当在 Amazon ECS 或 AWS Fargate 上的 Amazon ECS 中运行时,Linux 容器目前支持最广泛的 .NET 应用程序存储服务。存储服务的选择取决于应用程序是否需要对数据进行共享、并发访问。

Amazon Elastic Block Store (Amazon EBS)

Amazon Elastic Block Store(Amazon EBS)是一项提供区块级存储容量的存储服务。EBS 卷为应用程序提供可安装到 Linux 容器的存储,其访问方式与常规驱动器设备类似。Amazon EBS 可以自动复制可用区内 EBS 卷中的数据,这使其成为可靠的存储解决方案,有助于在存储卷发生故障时提高应用程序可靠性。

EBS卷可动态调整大小,支持加密,还支持使用快照制作副本。如果需要,您可以从容器中分离卷,然后将它们重新附加到另一个容器。为了满足您的应用程序的性能和价格要求,Amazon EBS 提供了不同的卷类型。

EBS 卷是在某个区域的特定可用区中创建的。然后,可以使用任务定义中的设置,将该卷装载到在同一区域中运行的容器实例。要从不同的可用区访问相同的数据,请对卷拍摄快照,然后使用快照在相同区域的其他地方或不同区域创建新卷。单个快照可以跨可用区域和区域创建多个卷。对于需要高可用性的应用程序所使用的只读应用程序数据,以及您已经部署到跨不同可用区和区域的多个容器实例的只读应用程序数据,可以考虑使用这种方法。

对于需要快速、低延迟地访问非并发共享数据的应用程序,Amazon EBS 是一个不错的存储解决方案,因为应用程序可以横向扩展(即在多个容器实例中运行)。例如,从单个容器实例访问的通用文件系统和数据库。

Amazon EBS 不支持对卷的并发访问。对于需要共享跨多个容器安装的单个文件系统的应用程序,请考虑使用 Amazon Elastic File Service 或 Amazon FSx 提供的文件系统之一。

Amazon Elastic File System (Amazon EFS)

Amazon EFS 提供可扩展的文件系统服务,可使用网络文件系统(NFS)进行访问,而无需管理存储。通过 Amazon EFS 管理的文件系统可同时连接到多个基于 Linux 的容器实例,具有读写一致性和文件锁定功能。这就能够在托管横向扩展应用程序的多个容器之间共享驱动器上的数据以进行读写访问。Amazon EFS 存储也是动态的,可随着应用程序存储需求的变化自动扩展(和缩小)容量。

您只需为应用程序消耗的存储空间付费。默认情况下,在 Amazon EFS 中创建的文件系统中的数据将存储在一个区域的多个可用区中,以提供弹性和持久性。Amazon EFS 将此模式称为 Standard 存储类。如果应用程序不需要完整的多可用区存储,请改用 One Zone 存储类来节省成本。 Standard-Infrequent Access One Zone-Infrequent Access 存储类也可用于托管应用程序不定期访问的数据,以进一步节省成本。

Amazon EFS 文件系统适用于各种应用程序,包括 Web 应用程序、内容管理系统、用户主文件夹和通用文件服务器。文件系统支持身份验证、授权和加密。访问控制使用标准的 POSIX 权限。

下面的示例任务定义片段显示了如何为任务装载 EFS 文件系统。

"containerDefinitions":[
    {
        "mountPoints": [ 
            { 
                "containerPath": "/opt/my-app",
                 "sourceVolume": "Shared-EFS-Volume"
            }
    }
  ]
...
"volumes": [
    {
      "efsVolumeConfiguration": {
        "fileSystemId": "fs-1234",
        "transitEncryption": "DISABLED",
        "rootDirectory": ""
      },
      "name": "Shared-EFS-Volume"
    }
  ]
                                            

适用于 Lustre 的 Amazon FSx

Lustre 是一个开源文件系统,旨在满足机器学习、高性能计算(HPC)、视频处理和财务建模的性能需求。对于处理这些解决方案的 .NET 应用程序或其他需要亚毫秒延迟的方案,适用于 Lustre 的 Amazon FSx 可以为 Linux 容器提供持久性存储层。

注意:在撰写本文时,在 AWS Fargate 中运行的任务不支持适用于 Lustre 的 FSx 系统。

在适用于 Lustre 的 FSx 中创建的文件系统符合 POSIX 标准。这意味着您可以继续使用为 Linux 上运行的 .NET 应用程序使用的相同的、熟悉的文件访问控制。适用于 Lustre 的 FSx 中托管的文件系统还提供读写一致性和文件锁定功能。

根据应用程序的需求,可以选择固态(SSD)和硬盘(HDD)存储,这些存储方式针对不同的工作负载要求进行了优化。SSD 存储适用于对延迟敏感且通常会进行小型随机访问文件操作的 IOPS 密集型应用程序。HDD 存储类型适用于具有高吞吐量要求的应用程序,通常涉及大型和连续文件操作。使用 HDD 存储,您还可以添加只读 SSD 缓存(大小为 HDD 存储空间的 20%),以实现亚毫秒级的延迟和更高的 IOPS,从而提高经常访问文件的性能。

适用于 Lustre 的 FSx 中的文件系统还可以链接到具有完全读写访问权限的 Amazon S3 存储桶。这使您的 .NET 应用程序能够处理 S3 存储桶中的对象,方式与处理驻留在文件系统中的对象一样,这是为处理 S3 中已经存在的基于云的大型数据集的数据而构建的一个应用程序选项,使您无需在访问和更新文件系统之前将数据复制到文件系统中。

请注意,您还可以使用 lustre-client 包在 Docker 容器中使用命令挂载 Lustre 文件系统;这使您能够在容器内动态挂载文件系统。

适用于 Windows 容器的持久性存储选项

对于运行 .NET 和 .NET Framework 应用程序的 Windows 容器,适用于 Windows File Server 的 Amazon FSx 提供的文件存储可用于在任务中运行的一个或多个容器之间保留数据和共享数据。

适用于 Windows File Server 的 Amazon FSx

适用于 Windows File Server 的 FSx 使用实际的 Windows File Server 实例(可通过基于 SMB 的标准 Windows 文件共享访问),以存储和提供应用程序数据。标准 Windows 文件共享支持使用 Windows File Server 管理员已经熟悉的功能和管理工具,例如使用卷影副本恢复最终用户文件、用户配额和访问控制列表(ACL)。SMB 还支持从 Linux 容器连接到适用于 Windows File Server 的 FSx 共享。

适用于 Windows File Server 的 FSx 中的文件系统可以帮助使用重复数据删除和压缩功能降低应用程序的存储成本。其他功能包括数据加密、可审核文件访问和定时自动备份。通过与本地 Microsoft Active Directory(AD)或 AWS 中的托管 AD 集成,可以控制对文件系统共享的访问权限。

适用于 Windows File Server 的 FSx 适用于将基于 Windows 的本地文件服务器迁移到云端,以便与容器化 .NET/.NET Framework 应用程序一起使用。它还适用于需要访问混合云和本地数据存储(使用 Amazon FSx 文件网关)的 .NET 和 .NET Framework 应用程序。对于使用 SQL Server 的应用程序,适用于 Windows File Server 的 FSx 无需获得 SQL Server Enterprise 许可即可运行这些数据库工作负载。

下面的示例任务定义片段显示如何装载在适用于 Windows File Server 的 FSx 中为任务创建的文件系统。

{
    "containerDefinitions": [
        {
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "portMappings": [],
            "command": [...' -Force"],
            "cpu": 512,
            "memory": 256,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "essential": false,
            "name": "container1",
            "mountPoints": [
                {
                    "sourceVolume": "fsx-windows-dir",
                    "containerPath": "C:\\fsx-windows-dir",
                    "readOnly": false
                }
            ]
        },
...
    ],
    "family": "fsx-windows",
    "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
    "volumes": [
        {
            "name": "fsx-windows-vol",
            "fsxWindowsFileServerVolumeConfiguration": {
                "fileSystemId": "fs-0eeb5730b2EXAMPLE",
                "authorizationConfig": {
                    "domain": "example.com",
                    "credentialsParameter": "arn:arn-1234"
                },
                "rootDirectory": "share"
            }
        }
    ]
}

其他持久性存储选项

AWS 还提供其他几种专门的文件系统服务,用于处理 ECS 中任务的持久性存储需求。本课程未涵盖这些文件系统和服务,而是提供以下产品详细信息供您参考。

  • 适用于 OpenZFS 的 Amazon FSx 使用 OpenZFS 文件系统提供完全托管的文件存储。OpenZFS 是一个开源文件系统,适用于需要高性能存储的工作负载,以及包括即时数据快照、加密和克隆在内的功能。可以使用 NFS 访问 OpenZFS 存储,并且可以轻松地将 Linux 文件服务器迁移到云端,以便与.NET 应用程序容器一起使用。
  • 适用于 NetApp ONTAP 的 Amazon FSx 是另一项提供数据访问和管理功能的完全托管的文件存储服务。应用程序使用 NFS、SMB 和 iSCSI 协议访问 NetApp ONTAP 文件系统。

AWS Fargate 简介

对许多开发人员和组织而言,预置和管理云基础设施的无服务器方法很有吸引力。借助无服务器,AWS 可以无差别地预置和管理基础设施资源,以便为您托管应用程序。这使开发人员可以腾出时间,专注于您的应用程序。您可以指定应用程序运行和扩展所需的内容。具体操作由 AWS 负责。

AWS Fargate 是一种在云中托管容器的无服务器方法。为 Amazon ECS 或基于 Amazon EKS 的应用程序选择 Fargate 后,无需再为托管基于容器的应用程序而进行服务器或 Amazon EC2 实例集群管理。Fargate 可根据需要处理容器基础设施的预置、配置以及纵向扩展和缩减。

作为开发人员,您需要关注如何使用 Dockerfile 定义容器映像的构建,以及如何将这些构建的映像部署到 Amazon ECR 或 Docker Hub。对于应用程序的运行时系统基础设施,您只需指定操作系统、CPU 和内存、网络和 IAM policy。然后,Fargate 会配置并扩展符合这些要求的容器基础设施。Fargate 支持将 .NET 和 .NET Framework 应用程序作为服务、任务和计划任务运行。

希望在 AWS Fargate 上使用 Amazon ECS 的 .NET 开发人员可以选择 Windows Server 或 Linux 环境。.NET Framework 应用程序必须使用 Windows Server 容器。但是,使用 .NET 构建的应用程序可以选择 Windows Server 或 Linux 环境。

注意:对于混合使用 Windows Server 和 Linux 容器的应用程序,需要为不同的环境运行独立的任务。

AWS Fargate 中 Linux 容器上的 .NET

基于 .NET 的应用程序(.NET 6 或更高版本)可以使用 Fargate 提供和维护的容器基础设施。Fargate 使用 Amazon Linux 2,该版本可在 X86_64 或 ARM64 架构中使用。任务定义指定所需的架构。

注意:也可以在 Fargate 上运行较早的基于 .NET Core 3.1 和 .NET 5 的应用程序。然而,这两个版本都已经或即将不再受到 Microsoft 的支持。.NET 5 不是长期支持(LTS)版本,现已不再受支持。在撰写本文时,.NET Core 3.1 正处于维护支持阶段,这意味着距支持结束,仅收到安全问题补丁只剩 6 个月或更短的时间。

AWS Fargate 中 Windows 容器上的 .NET

Fargate 上的 Windows 容器可以运行 .NET Framework 和 .NET 应用程序。Fargate 目前支持两个版本的 Windows Server 应用程序:Windows Server 2019 Full 和 Windows Server 2019 Core。无论您使用哪个版本,AWS 都会为您管理 Windows 操作系统许可证。

注意:并非 Windows Server 的所有功能(以及某些 AWS 功能)都不适用于 AWS Fargate 上的 Windows 容器。有关功能限制和注意事项的最新信息,请参阅服务文档。下面列出了一些不受支持的功能示例。

  • 群组托管服务账户(gMSA)。
  • Amazon FSx 文件系统(不包括适用于 Windows File Server 的 FSx)。
  • 可配置的临时存储。
  • Amazon Elastic File Store(Amazon EFS)卷。
  • 映像卷。
  • 用于任务的 App Mesh 服务和代理集成。

在 Amazon ECS 和 AWS Fargate 上的 Amazon ECS 之间进行选择

根据以下因素来确定是选择 Amazon ECS 还是 AWS Fargate 上的 Amazon ECS 来托管您的 .NET 应用程序:

  • 如果您希望预置、管理和扩展集群及其他基础设施来托管您的任务,或者需要自行管理此基础设施,请选择 Amazon ECS。
  • 如果您希望允许 AWS 预置、管理和扩展支持容器化应用程序的基础设施,请选择 AWS Fargate。AWS Fargate 支持用于 .NET Framework 或 .NET 应用程序的 Windows 容器,或用于 .NET 应用程序的 Linux 容器。
  • 对于使用适用于 Windows File Server 的 Amazon FSx 为容器提供额外持久性存储卷的 .NET 应用程序,请选择 Amazon ECS。截至撰写本文时,AWS Fargate 尚不支持此存储选项。

容器映像和 Amazon Elastic Container Registry(Amazon ECR)

Amazon ECR 是一个完全托管、安全且可扩展的容器注册表,适用于 Docker 和 Open Container Initiative(OCI)容器映像。无论您是使用 Amazon ECS 还是 AWS Fargate 上的 Amazon ECS,其功能都可以让您轻松存储、管理和部署容器映像。作为一项完全托管的服务,Amazon ECR 提供、管理和扩展支持您的注册表所需的基础设施。

注意:在使用 Amazon ECS 和 AWS Fargate 时,您还可以使用 Docker Hub 来存储容器映像。

Amazon ECR 为每个 AWS 区域中的每个账户提供一个默认的私有注册表。注册表用于管理一个或多个保存容器映像的私有存储库。在将映像推送到存储库或从存储库中拉取映像之前,客户端必须获取授权令牌,然后使用该令牌来验证对注册表的访问。当映像被推送到存储库时,Amazon ECR 提供自动漏洞扫描作为可选功能。存储库还支持通过 AWS Key Management Service(KMS)进行加密,可以选择使用 AWS 提供的密钥或自定义的用户管理的密钥。

为了控制访问权限,Amazon ECR 与 AWS IAM 集成。基于资源的细粒度权限可以控制谁(或什么)可以访问容器映像和存储库。Amazon ECR 提供的托管策略也可用于控制不同级别的访问权限。

使用每个注册表设置,存储库可以跨区域和其他账户复制。其他映像生命周期策略也是可配置的。例如,您可以配置(和测试)生命周期策略,以清除存储库中未使用的映像。

Amazon ECR 中提供了公共和私有注册表。还可以使用拉式缓存,用于从其他公共注册表中拉取的容器映像。拉式缓存可使构建和部署免受上游注册表和存储库中断的影响,还可以帮助开发团队接受依赖项合规性审计。

查看以下功能,详细了解 Amazon ECR 中的公共和私有注册表、它们包含的存储库以及拉式缓存存储库。

私有注册表和存储库

AWS 在每个 AWS 区域为每个账户提供一个私有注册表,每个注册表可以包含零个或多个存储库(至少需要一个存储库来保存映像)。账户中的每个区域注册表均可使用 https://aws_account_id.dkr.ecr.region.amazonaws.com 格式的 URL 进行访问,例如 https://123456789012.dkr.ecr.us-west-2.amazonaws.com。

私有注册表中的存储库同时保存 Docker 和 Open Container Initiative(OCI)映像和构件。您可以根据映像和构件的需要使用尽可能少或任意多的存储库。例如,您可以使用一个存储库来保存开发阶段的映像,使用另一个存储库来保存测试阶段的映像,再使用另一个存储库来保存发布到生产阶段的映像。

存储库映像中的映像名称必须是唯一的,但是,Amazon ECR 存储库还支持命名空间。这就使标识不同映像的映像名称能够在单个存储库中的不同环境阶段或团队之间重复使用。

默认情况下,账户对私有注册表中存储库拥有读写权限。但是,IAM 主体和在这些主体范围内运行的工具必须获得使用 Amazon ECR 的 API 的权限,以及使用 Docker CLI 等工具针对存储库发出拉取/推送命令。许多工具(将在本课程第 2 单元中详细介绍)都可以代表您处理此身份验证过程。

可以使用 AWS 管理控制台中的 Amazon ECR 控制点半、AWS Toolkit for Visual Studio 的 AWS 各区服务浏览器视图或使用 AWS CLI 或 AWS Tools for PowerShell 在命令行中创建私有存储库。下面的屏幕截图显示了在 Visual Studio 中创建私有存储库的过程。您可以通过在 AWS 各区服务浏览器视图中展开 Amazon Elastic Container Service 条目,然后从存储库条目的上下文菜单中选择“创建存储库”来执行此操作:

AWS Toolkit for Visual Studio 不支持使用 ECR 公共注册表,也不支持为私有注册表中的新存储库启用自动扫描和存储库加密等功能。如果需要用到这些功能,请使用 AWS 管理控制台或命令行工具(如 AWS CLI 和 AWS Tools for PowerShell)创建存储库。

公共注册表和存储库

任何人都可以使用 Amazon ECR 公共注册表和存储库来拉取您发布的映像。每个账户都有一个公共注册表,其中可以包含多个公共存储库。与私有存储库一样,公共存储库也可以存储 Docker 和 Open Container Initiative(OCI)映像和构件。

公共注册表中的存储库将在 Amazon ECR 公开映像浏览馆中列出。这使社区能够查找和拉取公共映像。拥有公共注册表的 AWS 账户对其包含的存储库具有完全读写访问权限。访问存储库的 IAM 主体必须获得令牌中提供的权限,并使用该令牌进行身份验证以推送映像(就像私有存储库一样)。但是,任何人都可以在有或没有身份验证的情况下从公共存储库中拉取映像。

映像浏览馆中的存储库使用 https://gallery.ecr.aws/registry_alias/repository_name 形式的 URL 访问。registry_alias 在创建第一个公共存储库时创建,并且可以更改。从公共存储库拉取映像的 URI 格式为 public.ecr.aws/registry_alias/repository_name:image_tag。

需要具备对公共注册表的权限并通过身份验证才能将映像推送到公共存储库。权限在令牌中提供,在向注册表进行身份验证时必须提供该令牌。无论是否经过事先身份验证,都可以从公共存储库中拉取映像。

拉式缓存存储库

将缓存映像从上游公共注册表拉取到 Amazon ECR 中的私有注册表中。目前,Amazon ECR 支持 Amazon ECR Public 和 Quay 作为上游注册表。Amazon ECR 会检查上游是否有新的映像版本(每 24 小时),如果有新版本可用,则更新缓存。拉式缓存有助于您的构建和部署过程免受影响上游注册表的中断或其他问题的影响。

首次从配置的上游注册表中拉取映像时,会自动创建缓存存储库。映像拉取使用 AWS IP 地址,不受上游注册表上设置的拉取速率限额的影响。将映像拉取到缓存存储库的功能是使用规则配置的。最多可以为您的私有注册表配置 10 条拉式缓存规则。

下图显示了两个示例规则,一个用于缓存来自 Amazon ECR Public 的映像,另一个用于缓存来自 Quay 的映像。在此配置中,首次从 Amazon ECR Public 拉取映像时,将使用上游存储库的名称在 ecr-public 命名空间下自动创建一个存储库,对于从 Quay 拉取的映像,情况也类似。

AWS Toolkit for Visual Studio 不支持使用 ECR 公共注册表,也不支持为私有注册表中的新存储库启用自动扫描和存储库加密等功能。如果需要用到这些功能,请使用 AWS 管理控制台或命令行工具(如 AWS CLI 和 AWS Tools for PowerShell)创建存储库。

从上游注册表拉取到拉取式缓存的映像支持您的私有存储库可用的其他 Amazon ECR 功能,例如复制和自动漏洞扫描。

推送和拉取映像

默认情况下,账户对其私有和公共注册表中存储库拥有读写权限。但是,这些账户内的 IAM 主体以及在这些 IAM 主体范围内运行的工具必须获得使用推送/拉取命令和 Amazon ECR 的 API 的权限。这些权限作为授权令牌提供,在验证对 Amazon ECR 私有或公共注册表的访问时必须提供该令牌。

注意:虽然 IAM 主体需要权限才能将映像推送到私有存储库,以及将映像推送到公共存储库,但任何人都可以在无需身份验证的情况下从账户的公共注册表中的公共存储库中拉取映像,这称为未经身份验证的拉取。

通过命令行授权存储库访问权限

本课程第 2 单元中提到的许多 AWS 工具将为您获取令牌并使用它对您的私有注册表进行身份验证,但如果需要,您可以自己执行相同的步骤,例如,从 CI 访问注册表时 /CD 管道。或者,GitHub 上提供了 Amazon ECR 凭证辅助实用程序 – 请参阅 Amazon ECR Docker 凭证助手了解更多详细信息(本课程不进一步介绍如何使用助手实用程序)。

AWS CLI 和 AWS Tools for PowerShell 包含用于轻松获取授权令牌的命令,然后将其与 Docker 客户端等工具一起使用来推送和拉取映像。这两个命令都会处理服务的输出并发出所需的令牌。对于不适合使用命令行的场景,或者对于自定义工具,可以使用 Amazon ECR API 调用 GetAuthorizationToken。

注意:授权令牌中的权限不超过向请求授权令牌的 IAM 主体提供的权限。令牌的有效期为 12 小时。

要使用 AWS CLI 通过 Amazon ECR 注册表对 Docker 进行身份验证,请使用 get-login-password 命令并将输出通过管道传输到 docker login,指定 AWS 作为用户名和注册表的 URL:

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

要使用 AWS Tools for PowerShell 对 Docker 客户端进行身份验证,请使用 Get-ECRLoginCommand(在 AWS.Tools.ECR 模块或旧版 AWSPowerShell 和 AWSPowerShell.NetCore 模块中提供)。将输出对象中的密码属性通过管道传递给 docker login 命令,指定 AWS 作为用户名和注册表的 URL:

(Get-ECRLoginCommand -Region region).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

一旦 Docker 客户端获得授权,就可以将镜像推送到注册表中的存储库或从存储库中拉取映像。请注意,不同区域的注册中心需要单独的授权令牌。

推送映像

要将映像推送到私有和公共存储库,需要 IAM 权限。作为最佳实践,请考虑将 IAM 主体的权限范围缩小到特定存储库。下面的示例策略显示了主体推送映像所需的 Amazon ECR API 操作(“操作”),其范围仅限于特定存储库。指定存储库后,可以使用 Amazon 资源名称(ARN)来识别它们。请注意,可以指定多个存储库(在数组元素中),或使用通配符将范围扩大到所有存储库。

要使用下面的策略,请将 111122223333 替换为您的 AWS 账户 ID,将区域替换为存储库所在的区域,然后设置存储库名称。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:UploadLayerPart",
        "ecr:InitiateLayerUpload",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage"
      ],
      "Resource":
          "arn:aws:ecr:region:111122223333:repository/repository-name"
    }
  ]
}

实施与上述类似的 IAM policy 并根据您的注册表进行身份验证后,就可以使用 Docker CLI 或其他工具来推送映像。在将映像推送到存储库之前,必须使用注册表、存储库和可选映像标签名称对其进行标记(如果省略映像标签名称,则假定为最新)。以下示例说明了在将本地映像推送到 Amazon ECR 之前标记本地映像的标签格式和命令。

将 111122223333 替换为您的 AWS 账户 ID,将 Region 替换为包含存储库的区域的标识符(us-east-1、us-west-2 等),将存储库名称替换为存储库的实际名称。

docker tag ab12345ef 111122223333.dkr.ecr.region.amazonaws.com/repository-name:tag

最后,推送映像:

docker push 111122223333.dkr.ecr.region.amazonaws.com/repository-name:tag

拉取映像

使用推送图像时所使用的相同标记格式来提取图像,以识别图像:

docker pull 111122223333.dkr.ecr.region.amazonaws.com/repository-name:tag

对于私有注册表中的存储库,您必须在拉取映像之前使用注册表对您的客户端进行身份验证(如前所述)。对于公共注册表,无论是否进行身份验证,均可提取映像。

知识测验

您现在已经完成了模块 1,即 Amazon ECS 和 AWS Fargate 简介。以下测试可让您检查到目前为止学到的内容。

问题1 :什么是 Amazon Elastic Container Registry?

a.用于存储容器映像的注册表

b.正在运行的容器的注册表

c.正在运行的任务的注册表

d.映射到容器的存储卷的注册表

问题 2:对于在 Amazon ECS 上运行的 Windows/Linux 容器,持久存储选项相同。

a.对

b.错

问题3:相对于 ECS,集群是什么?

a.正在运行的容器的实例

b.将要运行的容器的定义

c.对应用程序组成的定义

d.计算资源的逻辑组

答案:1-a、2-b、3-d

小结

在本模块中,您首先了解了容器:它们与虚拟机的区别,以及 Docker Linux 容器与Windows 容器。它们为轻量级、标准化且便于移植,支持无缝迁移,让您能够更快地发布,并为您节省资金。AWS 上的容器安全、可靠,受多种容器服务支持,并与 AWS 深度集成。

然后,您了解了无服务器技术,这类技术让您无需考虑服务器即可构建应用程序。其优势包括消除运营开销、自动扩缩、降低成本以及通过与其他 AWS 服务的内置集成更轻松地构建应用程序。应用场景包括 Web 应用程序、数据处理、批处理和事件摄取。

您了解了适用于容器的 AWS 计算服务以及如何选择计算服务。您了解了 AWS App Runner 采用无服务器技术,是一项用于托管容器的完全托管式服务。

此页内容对您是否有帮助?

AWS 上的 .NET 容器开发人员工具