

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon EC2 Linux 執行個體上執行 ASP.NET Core Web API Docker 容器
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance"></a>

*Vijai Anand Ramalingam 和 Sreelaxmi Pai，Amazon Web Services*

## 總結
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-summary"></a>

此模式適用於開始在 Amazon Web Services (AWS) 雲端上容器化其應用程式的人員。當您開始在雲端上容器化應用程式時，通常不會設定容器協同運作平台。此模式可協助您在 AWS 上快速設定基礎設施，以測試容器化應用程式，而不需要複雜的容器協同運作基礎設施。

現代化旅程的第一步是轉換應用程式。如果是舊版 .NET Framework 應用程式，您必須先將執行時間變更為 ASP.NET Core。然後執行下列動作：
+ 建立 Docker 容器映像
+ 使用建置的映像執行 Docker 容器
+ 在任何容器協同運作平台上部署應用程式之前，請先驗證應用程式，例如 Amazon Elastic Container Service (Amazon ECS) 或 Amazon Elastic Kubernetes Service (Amazon EKS)。 

此模式涵蓋 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體上現代應用程式開發的建置、執行和驗證層面。

## 先決條件和限制
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-prereqs"></a>

**先決條件**
+ 作用中的[Amazon Web Services (AWS) 帳戶](https://aws.amazon.com/account/)
+ [AnAWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)具有足夠的存取權，可為此模式建立 AWS 資源 
+ [Visual Studio Community 2022 ](https://visualstudio.microsoft.com/downloads/)或更新版本下載並安裝
+ 將 .NET Framework 專案現代化為 ASP.NET Core
+ GitHub 儲存庫

**產品版本**
+ Visual Studio Community 2022 或更新版本

## Architecture
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-architecture"></a>

**目標架構**

此模式使用 [AWS CloudFormation 範本](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=SSM-SSH-Demo&templateURL=https://aws-quickstart.s3.amazonaws.com/quickstart-examples/samples/session-manager-ssh/session-manager-example.yaml)來建立高度可用的架構，如下圖所示。Amazon EC2 Linux 執行個體會在私有子網路中啟動。AWS Systems Manager Session Manager 用於存取私有 Amazon EC2 Linux 執行個體，以及測試在 Docker 容器中執行的 API。

![存取 Amazon EC2 Linux 執行個體並測試在 Docker 容器中執行之 API 的使用者。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/512e61b2-10ba-43be-bbd8-2bdc597c3de3/images/9c5206f6-32b1-47be-9037-360c0bff713c.png)


1. 透過 Session Manager 存取 Linux 執行個體

## 工具
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-tools"></a>

**AWS 服務**
+ [AWS 命令列界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) – AWS 命令列界面 (AWS CLI) 是一種開放原始碼工具，可透過命令列 shell 中的命令與 AWS 服務互動。透過最少的組態，您可以執行 AWS CLI 命令來實作相當於瀏覽器型 AWS 管理主控台所提供功能的功能。
+ [AWS 管理主控台](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) – AWS 管理主控台是一種 Web 應用程式，包含並參考各種用於管理 AWS 資源的服務主控台。若是首次登入，這時主控台頁面將會顯示。首頁提供每個服務主控台的存取權，並提供單一位置來存取執行 AWS 相關任務所需的資訊。
+ [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) – Session Manager 是全受管的 AWS Systems Manager 功能。使用 Session Manager，您可以管理 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。Session Manager 提供安全且可稽核的節點管理，無需開啟傳入連接埠、維護堡壘主機或管理 SSH 金鑰。

**其他工具**
+ [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) – Visual Studio 2022 是整合式開發環境 (IDE)。
+ [Docker](https://www.docker.com/) – Docker 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。

**Code**

```
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
 WORKDIR /app
EXPOSE 80
EXPOSE 443
 
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["DemoNetCoreWebAPI/DemoNetCoreWebAPI.csproj", "DemoNetCoreWebAPI/"]
RUN dotnet restore "DemoNetCoreWebAPI/DemoNetCoreWebAPI.csproj"
COPY . .
WORKDIR "/src/DemoNetCoreWebAPI"
RUN dotnet build "DemoNetCoreWebAPI.csproj" -c Release -o /app/build
 
FROM build AS publish
RUN dotnet publish "DemoNetCoreWebAPI.csproj" -c Release -o /app/publish
 
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DemoNetCoreWebAPI.dll"]
```

## 史詩
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-epics"></a>

### 開發 ASP.NET Core Web API
<a name="develop-the-asp-net-core-web-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Visual Studio 建立範例 ASP.NET Core Web API。 | 若要建立範例 ASP.NET Core Web API，請執行下列動作：1. 開啟 Visual Studio 2022。<br />2. 選擇 **Create new project (建立新的專案)**。<br />3. 選取 **ASP.NET Core Web API** 專案範本，然後選擇**下一步**。<br />4. 針對專案名稱，輸入 **DemoNetCoreWebAPI**，然後選擇**下一步**。<br />5. 選擇**建立**。<br />6. 若要在本機執行專案，請按 F5。<br />7. 確認預設 **WeatherForecast** API 端點使用 [Swagger](https://swagger.io/) 傳回結果。<br />8. 開啟命令提示字元，導覽至 .csproj 專案資料夾，然後執行下列命令，將新的 Web API 推送到您的 GitHub 儲存庫。 <pre>git add --all<br />git commit -m "Initial Version"<br />git push</pre> | 應用程式開發人員 | 
| 建立 Dockerfile。 | 若要建立 Dockerfile，請執行下列其中一項操作：+ 使用*程式碼*區段中的範例 Dockerfile 手動建立 Dockerfile。根據需求，選取適當的 .NET 基礎映像。如需 .NET 和 ASP.NET Core 相關映像的詳細資訊，請參閱[Docker 中樞](https://hub.docker.com/_/microsoft-dotnet/)。 <br />+ 使用 Visual Studio 和 Docker [桌面建立 Dockerfile](https://www.docker.com/products/docker-desktop)。在解決方案瀏覽器中，在專案上按一下滑鼠右鍵，選擇 **Add**->**Docker Support**。針對**目標作業系統**，選取 **Linux**。確保新的 Dockerfile 與解決方案檔案 (.sln) 位於相同的路徑。 <br />若要將變更推送到您的 GitHub 儲存庫，請執行下列命令。<pre>git add --all<br />git commit -m "Dockerfile added"<br />git push</pre> | 應用程式開發人員 | 

### 設定 Amazon EC2 Linux 執行個體
<a name="set-up-the-amazon-ec2-linux-instance"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 基礎設施。 | 啟動 [AWS CloudFormation 範本](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=SSM-SSH-Demo&templateURL=https://aws-quickstart.s3.amazonaws.com/quickstart-examples/samples/session-manager-ssh/session-manager-example.yaml)以建立基礎設施，其中包含下列項目： + 虛擬私有雲端 (VPC)，使用 [AWS VPC Quick Start](https://aws.amazon.com/quickstart/architecture/vpc/)，其中有兩個公有子網路和兩個私有子網路橫跨兩個可用區域。<br />+ 啟用 AWS Systems Manager 所需的 IAM 角色。<br />+ 在其中一個私有子網路中，具有最新 SSM Agent 的 Amazon Linux 2 示範執行個體。雖然此執行個體沒有任何來自網際網路的直接連線，但可以使用 AWS Systems Manager Session Manager 安全地存取，而不需要堡壘主機。Amazon Linux 2 即將結束支援。如需詳細資訊，請參閱 [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/)。<br />若要進一步了解如何使用 Session Manager 存取私有 Amazon EC2 執行個體，而不需要堡壘主機，請參閱[無堡壘世界](https://aws.amazon.com/blogs/infrastructure-and-automation/toward-a-bastion-less-world/)部落格文章。 | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 登入 Amazon EC2 Linux 執行個體。 | 若要連線至私有子網路中的 Amazon EC2 Linux 執行個體，請執行下列動作：1. 開啟 Amazon EC2 主控台。      <br />2. 在導覽窗格中，選擇**執行個體**。<br />3. 選取 Amazon Linux 2 示範執行個體，然後選擇**連線**。Amazon Linux 2 即將結束支援。如需詳細資訊，請參閱 [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/)。<br />4. 選擇 **Session Manager (工作階段管理員)**。<br />5. 選擇**連線**以開啟新的終端機視窗。<br />6. 執行下列命令。<pre> sudo su</pre> | 應用程式開發人員 | 
| 安裝並啟動 Docker。 | 若要在 Amazon EC2 Linux 執行個體中安裝和啟動 Docker，請執行下列動作：1. 若要安裝 Docker，請執行下列命令。<pre>yum install -y docker</pre><br />2. 若要啟動 Docker 服務，請執行下列命令。<pre> service docker start</pre><br />3. 若要驗證 Docker 安裝，請執行下列命令。<pre>docker info</pre> | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 安裝 Git 並複製儲存庫。 | 若要在 Amazon EC2 Linux 執行個體上安裝 Git，並從 GitHub 複製儲存庫，請執行下列動作。1. 若要安裝 Git，請執行下列命令。<pre>yum install git -y</pre><br />2. 若要複製儲存庫，請執行下列命令。<pre>git clone https://github.com/<username>/<repo-name>.git</pre><br />3. 若要導覽至 Dockerfile，請執行下列命令。<pre>cd <repo-name>/DemoNetCoreWebAPI/</pre> | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 建置並執行 Docker 容器。 | 若要建置 Docker 映像並在 Amazon EC2 Linux 執行個體內執行容器，請執行下列動作：1. 若要建立 Docker 映像，請執行下列命令。<pre>docker build -t aspnetcorewebapiimage -f Dockerfile .</pre><br />2. 若要檢視所有 Docker 映像，請執行下列命令。<pre>docker images</pre><br />3. 若要建立和執行容器，請執行下列命令。<pre>docker run -d -p 80:80 --name aspnetcorewebapicontainer aspnetcorewebapiimage</pre> | 應用程式開發人員、AWS 管理員、AWS DevOps | 

### 測試 Web API
<a name="test-the-web-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 curl 命令測試 Web API。 | 若要測試 Web API，請執行下列命令。<pre>curl -X GET "http://localhost/WeatherForecast" -H  "accept: text/plain"</pre><br />驗證 API 回應。您可以在本機執行時，從 Swagger 取得每個端點的 curl 命令。 | 應用程式開發人員 | 

### 清除資源
<a name="clean-up-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除所有資源。 | 刪除堆疊以移除所有資源。這可確保您不需要為未使用的任何服務付費。 | AWS 管理員、AWS DevOps | 

## 相關資源
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-resources"></a>
+ [使用 PuTTY 從 Windows 連線至 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)
+ [使用 ASP.NET Core 建立 Web API](https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio)
+ [向無堡壘的世界邁進](https://aws.amazon.com/blogs/infrastructure-and-automation/toward-a-bastion-less-world/)