

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

# 在 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，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員 | 
| 建立 Dockerfile。 | 若要建立 Dockerfile，請執行下列其中一項操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)若要將變更推送到您的 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)以建立基礎設施，其中包含下列項目： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)若要進一步了解如何使用 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 執行個體，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員 | 
| 安裝並啟動 Docker。 | 若要在 Amazon EC2 Linux 執行個體中安裝和啟動 Docker，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 安裝 Git 並複製儲存庫。 | 若要在 Amazon EC2 Linux 執行個體上安裝 Git，並從 GitHub 複製儲存庫，請執行下列動作。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 建置並執行 Docker 容器。 | 若要建置 Docker 映像並在 Amazon EC2 Linux 執行個體內執行容器，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員、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>驗證 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/)