ASP.Net coreのAPIアプリをFargateにアップする。

今回は、以前の[記事](https://qiita.com/syo2255/items/d4712798225075a32924)で作成したDockerでのASP.Net core本番環境のDockerイメージを使用してFargateにアップし動かしてみました。

## 本番環境用のDockerfile
プロジェクト名はteamevです。
以下、[ASP.Net Coreの開発環境をDockerで作成する](https://qiita.com/syo2255/items/d4712798225075a32924)のマルチステージビルドで作成した軽量イメージを使用します。

```Dockerfile:Docker.production
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
ENV ASPNETCORE_ENVIRONMENT=Production
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY teamev.api.csproj ./
RUN dotnet restore
COPY . .
ENV PATH="$PATH:/root/.dotnet/tools"
RUN dotnet publish -c Release -o /app/publish 

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT [ "dotnet", "teamev.api.dll" ]
```

## イメージをビルドし、ECRにプッシュ
AWSコンソールにログインし、「ECRと検索」→ 「リポジトリ」→ 「リポジトリを作成」でリポジトリを作成します。
作成したリポジトリを選択し、プッシュコマンドの表示を選択すると、以下のようにコマンドを出してくれるので、このコマンドを上からコピペしてECRにpushします。
![スクリーンショット 2022-03-08 10.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/05308ab3-62a2-2293-bf7c-20d380b2e189.png)

最後のコマンドを打ち、push成功したらAWSコンソール画面に行きイメージが入っていることを確認します。

## AWSの基本設計
ECRにイメージのプッシュに成功すると、Fargateを動かしていくのですが、その前にネットワークを作成します。今回は、簡単な設計にしています。

![Untitled Diagram.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/bddb2c10-79d4-a4fd-9915-8204c52af906.png)

それでは、以下からpublic subnetにECRにpushしたイメージを使用してFargateを起動させようと思います。

## ECS on FARGATE の設定
以下の手順で作成していきます。
1. クラスターの作成
2. タスク定義の作成
3. サービスの作成

### クラスターの作成
検索でECS → 左タブからクラスター → クラスターの作成から作成します。
![スクリーンショット 2022-03-08 11.17.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/5b9d1aa2-0392-6789-26b4-c4e596f8806c.png)
ネットワーキングのみを選択します。

![スクリーンショット 2022-03-08 11.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/cae08778-1b04-a35e-4778-fe1a8cbd3809.png)
クラスター名を記述(なんでもいいです)、ネットワーキングはまだすでに作成しているのでチェックは入れません。(作成していない方はここから作成できます。)

次へを押し、内容を確認し作成するとクラスターが作られます。

### タスク定義の作成
タスク定義 = docker-compose.ymlと考えていいかもしれません。
左タブからクラスター定義を選択し、「新しいタスク定義の作成」を選択します。
起動タイプの互換性の選択でFARGATEを選択します。
![スクリーンショット 2022-03-08 11.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/896673d9-7c52-9166-9a3c-1f04526f9b47.png)

タスク定義を実際に行なっていきます。
今回は、
定義名: teamev-task-definition(適宜変更)
ロール: ecsTaskExcutionRole
ネットワークモード: awsvpc
オペレーティングシステムファミリー: Linux
タスクメモリ (GB): 0.5GB
タスク CPU (vCPU): 0.25vCPU
にしています。

そして、コンテナの追加を行います。
ここで、ECRのリポジトリのURIが必要になるのでコピーしておきましょう。
コンテナ名: teamev-container
イメージ: ECRでコピーしたレポジトリのURI
ポートマッピング: 80(イメージで吐き出してるポートと合わせないといけないみたいです。今回は80)
![スクリーンショット 2022-03-08 11.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/b6678855-30bc-fb2c-cfb6-df0f4450fa89.png)

追加し、タスク定義を作成します。

### サービスの作成
先ほど作成したクラスターを選択しサービスを作成します。
起動タイプ: FARGATE
タスク定義: 先ほど作成したタスク定義(今回の場合、teamev-task-definition)
サービス名: teamev-service
タスクの数:1
ネットワーク: 作成したVPC、FARGATEを置きたいsubnet、セキュリティーグループ(今回は、勝手に作られるもの(インバウンドポートは80))を選択
ロードバランサーは今回は使用しないのでなしを選択でいきます。

最後に、サービスを作成します。

すると、以下のようにタスクがRUNNINGになることが確認できます。( 少し時間がかかります。)
![スクリーンショット 2022-03-08 11.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/ac9feca3-cebe-bcb7-d6b5-75dc0ea9d963.png)

あとは、ちゃんと動いているか確認します。






## 動作確認
RUNNINGのタスクを選択し、public IPを取得します。
このPublic IPを使用して、POSTMANでapiがちゃんと動いているか確認します。
![スクリーンショット 2022-03-08 12.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669831/a6381945-578e-e906-c476-30951489bf94.png)

値が返ってきました！！

## 最後に
今回はDB接続周りもやってるんですが、それは次回書こうと思います。