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 層在使用量激增時進行水平擴展,且元件之間相互獨立。如果您在單一任務定義中定義所有層,整個應用程式都將在負載下擴展 (包括使用量未增加的層級),因而增加了橫向擴展時間 (如果您的應用程式很大),且可能導致財務成本增加。

您可以在下方找到任務定義的範例。其中使用 Linux 容器在 Fargate 啟動類型上設定了 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 將此模式稱為標準儲存類別。如果應用程式不需要完整的多可用區儲存,請改為使用「單區域」儲存類別來節省成本。 標準-不常存取 單區域-不常存取儲存類別也可用來託管應用程式非定期存取的資料,以進一步節省成本。

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"
    }
  ]
                                            

Amazon FSx for Lustre

Lustre 是一種開放原始碼檔案系統,旨在因應機器學習、高效能運算 (HPC)、視訊處理和財務建模的效能需求。若需要 .NET 應用程式來處理這些問題,或延遲需要低於一毫秒的其他案例,Amazon FSx for Lustre 可為 Linux 容器提供持久性儲存層。

注意:在撰寫本文時,在 AWS Fargate 中執行的任務不支援 FSx for Lustre 檔案系統。

在 FSx for Lustre 中建立的檔案系統符合 POSIX 規範。這表示您可以繼續使用已對執行於 Linux 上的 .NET 應用程式使用的相同檔案存取控制。在 FSx for Lustre 中託管的檔案系統也提供讀寫一致性和檔案鎖定。

根據應用程式的需求,可以選擇固態 (SSD) 和硬碟 (HDD) 儲存體,以針對不同的工作負載需求進行最佳化。SSD 儲存適用於 IOPS 密集型應用程式,這類應用程式對延遲敏感,且通常經歷小型的隨機存取檔案操作。HDD 儲存類型適用於具有高輸送量需求的應用程式,通常涉及大型和連續檔案操作。使用 HDD 儲存時,您還可以新增唯讀 SSD 快取 (大小為 HDD 儲存的 20%),以提供低於一毫秒的延遲和更高的 IOPS,從而為經常存取的檔案改善效能。

FSx for Lustre 中的檔案系統也可以連結至 Amazon S3 儲存貯體,且具有完整的讀寫存取權。如此,您的 .NET 應用程式就能夠處理 S3 儲存貯體中的物件,如同物件已存在於檔案系統中一般,應用程式若是要用來處理 S3 中已存在的大型雲端架構資料集中的資料,而無須在存取和更新之前將該資料複製到檔案系統中,則可以此作為選項。

請注意,您也可以使用 lustre-client 套件,使用 Docker 容器中的命令來掛載 Lustre 檔案系統;這可讓您在容器內動態掛載檔案系統。

Windows 容器的持久性儲存選項

對於執行 .NET 和 .NET Framework 應用程式的 Windows 容器,Amazon FSx for Windows File Server 提供的檔案儲存,可用於在任務中執行的一或多個容器間的資料持續性和資料共用。

Amazon FSx for Windows File Server

FSx for Windows File Server 使用實際的 Windows 檔案伺服器執行個體,可透過 SMB 經由標準 Windows 檔案共用存取,以儲存及處理應用程式資料。標準 Windows 檔案共用可使用 Windows File Server 管理員熟悉的功能和管理工具,例如使用陰影副本的終端使用者檔案還原、使用者配額,和存取控制清單 (ACL)。SMB 還可讓您從 Linux 容器連線至 FSx for Windows File Server 共用。

FSx for Windows File Server 中的檔案系統有助於使用資料重複資料刪除和壓縮的應用程式降低儲存成本。其他功能包括資料加密、可稽核檔案存取和排程自動備份。對檔案系統共用的存取,可透過與內部部署 Microsoft Active Directory (AD) 或 AWS 中 Managed AD 的整合來控制。

FSx for Windows File Server 適用於將內部部署 Windows 型檔案伺服器遷移至雲端,以便與容器化 .NET/.NET Framework 應用程式一起使用。此外也適用於需要存取混合雲端和內部部署資料存放區的 .NET 和 .NET Framework 應用程式 (搭配 Amazon FSx File Gateway)。對於使用 SQL Server 的應用程式,FSx for Windows File Server 可以執行這些資料庫工作負載,而不需要 SQL Server Enterprise 授權。

下列範例任務定義程式碼片段說明如何為任務掛載在 FSx for Windows File Server 中建立的檔案系統。

{
    "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 中任務的持久性儲存需求。本課程不涵蓋這些檔案系統和服務,而是向您介紹以下產品詳細資訊。

  • Amazon FSx for OpenZFS 使用 OpenZFS 檔案系統提供全受管檔案儲存。OpenZFS 是一個開放原始碼檔案系統,適用於需要高效能儲存以及即時資料快照、加密和複製等功能的工作負載。OpenZFS 儲存可以使用 NFS 來存取,並可讓您輕鬆地將 Linux 檔案伺服器遷移至雲端,以便與 .NET 應用程式容器一起使用。
  • Amazon FSx for NetApp ONTAP 是另一項提供資料存取和管理功能的全受管檔案儲存服務。應用程式可使用 NFS、SMB 和 iSCSI 通訊協定存取 NetApp ONTAP 檔案系統。

AWS Fargate 簡介

佈建和管理雲端基礎架構的無伺服器方法,對許多開發人員和組織來說都很有吸引力。透過無伺服器,AWS 可為您處理託管應用程式的基礎架構資源所需的無差異化佈建與管理。如此,您和開發人員便可以騰出時間專注於應用程式。您可以指定應用程式的執行和擴展所需的項目。如何做到由 AWS 負責。

AWS Fargate 是一種無伺服器的方法,可在雲端中託管容器。當您選擇將 Fargate 用於 Amazon ECS 或 Amazon EKS 型應用程式時,您就不再需要管理 Amazon EC2 執行個體的伺服器或叢集以託管容器型應用程式。Fargate 會視需要處理容器基礎架構的佈建、組態,以及縱向擴展和縮減。

作為開發人員,您需費心使用 Dockerfile 定義容器映像的組建,並將這些已建置的映像部署到 Amazon ECR 或 Docker Hub。對於應用程式的執行階段基礎架構,您只需指定作業系統、CPU 和記憶體、網路和 IAM 政策。然後,Fargate 會佈建及擴展符合這些需求的容器基礎架構。Fargate 支援以服務、任務和排程任務的形式執行 .NET 和 .NET Framework 應用程式。

.NET 開發人員若想要使用 AWS Fargate 上的 Amazon ECS,可以選擇 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 檔案系統 (FSx for Windows File Server 除外)。
  • 可設定的暫時性儲存。
  • Amazon Elastic File Store (Amazon EFS) 磁碟區。
  • 映像磁碟區。
  • 任務的 App Mesh 服務與 Proxy 整合。

在 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 容器。
  • 對於使用 Amazon FSx for Windows File Server 為您的容器提供額外持久性儲存磁碟區的 .NET 應用程式,請選擇 Amazon ECS。在撰寫本文時,AWS Fargate 不支援此儲存選項。

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

Amazon ECR 是適用於 Docker and 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 Explorer 檢視,或使用 AWS CLI 或 AWS Tools for PowerShell 在命令列上建立私有儲存庫。下列螢幕擷取畫面顯示從 Visual Studio 中建立私有儲存庫的情形。您可以在 AWS Explorer 檢視中展開 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 登入,將 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 Resource Name (ARN) 加以識別。請注意,您可以指定多個儲存庫 (在陣列元素中),或使用萬用字元 (*) 將範圍擴展到所有儲存庫。

若要使用下列政策,請將 111122223333 取代為您的 AWS 帳戶 ID、將 region 取代為儲存庫所在的區域,並設定儲存庫名稱。

{
  "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 政策,並且對登錄進行驗證,即可使用 Docker CLI 或其他工具推送映像。將映像推送至儲存庫之前,必須使用登錄、儲存庫和選擇性映像標籤名稱來標記映像 (如果省略映像標籤名稱,則會使用 latest)。下列範例說明在將本機映像推送至 Amazon ECR 之前加以標記的標籤格式和命令。

將 111122223333 取代為您的 AWS 帳戶 ID,將 region 取代為儲存庫所在區域的識別碼 (us-east-1、us-west-2 等等),並將 repository-name 取代為儲存庫的實際名稱。

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 容器開發人員工具