雲端計算之路-出海記-小目標:Hello World from .NET 5.0 on AWS

部落格園團隊發表於2020-11-08

品嚐過船上的免費晚餐,眺望著 aws 上搭建部落格園海外站的巨集偉目標,琢磨著眼前可以實現的小目標,不由自主地在螢幕上敲出了 —— "Hello World!",就從這個最簡單樸實的小目標開始吧 —— 用 ASP.NET Core on .NET 5.0 在 Amazon EC2 伺服器顯示出 "Hello World!"。

先登入到之前啟動的 EC2 伺服器安裝 .NET 5.0 SDK

mkdir $HOME/dotnet_install && cd $HOME/dotnet_install
curl -H 'Cache-Control: no-cache' -L https://aka.ms/install-dotnet-preview -o install-dotnet-preview.sh
sudo bash install-dotnet-preview.sh

安裝好之後檢視一下 .NET 的版本

dotnet --info
.NET SDK (reflecting any global.json):
 Version:   5.0.100-rc.2.20479.15
 Commit:    da7dfa8840

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  20.04
 OS Platform: Linux
 RID:         ubuntu.20.04-x64
 Base Path:   /usr/share/dotnet/sdk/5.0.100-rc.2.20479.15/

用 dotnet 命令基於模板建立一個 ASP.NET Core MVC 專案 hello-world

dotnet new mv --no-https --name hello-world

建立後之後用 dotnet run 命令執行專案

ubuntu@ip-172-31-44-65:~/hello-world$ dotnet run
Building...
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {b11ef41c-0ca0-4673-a6d2-05aa4a2bdb1a} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /home/ubuntu/hello-world

執行成功,接下來用 vim 修改一下檢視檔案,顯示"Hello World!"與"Powered by ..."資訊

vi Views/Home/Index.cshtml

改為下面的程式碼

@{
    ViewData["Title"] = "Home Page";
}
<div class="text-center">
    <h1 class="display-4">Hello World!</h1>
    <p>Powered by @System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription on AWS</p>
</div>

再接下來 build 專案生成 docker 映象,用容器部署站點。

先安裝 docker

curl -sSL https://get.docker.com/ | sh

安裝後將當前使用者新增到 docker 組

sudo usermod -aG docker ubuntu

編寫 Dockerfile(採用 multistage build

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app

FROM build AS publish
WORKDIR /src
RUN dotnet publish  -c Release -o /app/publish 

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

ENTRYPOINT ["dotnet", "hello-world.dll"]

基於上面的 Dockerfile 生成 docker 映象

$ docker build . -t hello-world
Sending build context to Docker daemon  11.48MB
Step 1/16 : FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
 ---> 3e92f5fcc999
...
Step 16/16 : ENTRYPOINT ["dotnet", "hello-world.dll"]
 ---> Using cache
 ---> a2da910535e2
Successfully built a2da910535e2
Successfully tagged hello-world:latest

用下面的命令以 daemon 方式啟動 hellow-world 容器

docker run -d --net=host --restart unless-stopped hello-world

這時 hello-world 應用已經在後臺執行了

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
df7d77140e76        hello-world         "dotnet hello-world.…"   2 minutes ago       Up 2 minutes                            dreamy_joliot

本機 curl 命令測試一下

$ curl -I localhost
HTTP/1.1 200 OK
Date: Sun, 08 Nov 2020 10:47:01 GMT
Content-Type: text/html; charset=utf-8
Server: Kestrel

站點可以訪問正常,但現在只能本機訪問,要讓外部能訪問,需要在 aws 安全組中新增入站規則開放80埠。

在這臺 EC2 例項的詳情控制檯,進入“安全” tab,點選安全組名稱,進入安全組控制檯,點選“編輯入站規則”,點選“新增入站規則”,新增一條開放80埠的入站規則。

雲端計算之路-出海記-小目標:Hello World from .NET 5.0 on AWS

儲存規則並生效後,就可以通過公網IP訪問了。為了讓這個小目標正式一點,我們用了一個域名 —— optcode.net,通過 dns 解析到這臺 EC2 伺服器的公網 IP。

好了,瀏覽器訪問 http://optcode.net/ ,小目標大功告成!

雲端計算之路-出海記-小目標:Hello World from .NET 5.0 on AWS

 

相關文章