今回は、以前の記事で作成したDockerでのASP.Net core本番環境のDockerイメージを使用してFargateにアップし動かしてみました。
本番環境用のDockerfile
プロジェクト名はteamevです。
以下、ASP.Net Coreの開発環境をDockerで作成するのマルチステージビルドで作成した軽量イメージを使用します。
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します。
最後のコマンドを打ち、push成功したらAWSコンソール画面に行きイメージが入っていることを確認します。
AWSの基本設計
ECRにイメージのプッシュに成功すると、Fargateを動かしていくのですが、その前にネットワークを作成します。今回は、簡単な設計にしています。
それでは、以下からpublic subnetにECRにpushしたイメージを使用してFargateを起動させようと思います。
ECS on FARGATE の設定
以下の手順で作成していきます。
- クラスターの作成
- タスク定義の作成
- サービスの作成
クラスターの作成
検索でECS → 左タブからクラスター → クラスターの作成から作成します。
ネットワーキングのみを選択します。
クラスター名を記述(なんでもいいです)、ネットワーキングはまだすでに作成しているのでチェックは入れません。(作成していない方はここから作成できます。)
次へを押し、内容を確認し作成するとクラスターが作られます。
タスク定義の作成
タスク定義 = docker-compose.ymlと考えていいかもしれません。
左タブからクラスター定義を選択し、「新しいタスク定義の作成」を選択します。
起動タイプの互換性の選択でFARGATEを選択します。
タスク定義を実際に行なっていきます。
今回は、
定義名: teamev-task-definition(適宜変更)
ロール: ecsTaskExcutionRole
ネットワークモード: awsvpc
オペレーティングシステムファミリー: Linux
タスクメモリ (GB): 0.5GB
タスク CPU (vCPU): 0.25vCPU
にしています。
そして、コンテナの追加を行います。
ここで、ECRのリポジトリのURIが必要になるのでコピーしておきましょう。
コンテナ名: teamev-container
イメージ: ECRでコピーしたレポジトリのURI
ポートマッピング: 80(イメージで吐き出してるポートと合わせないといけないみたいです。今回は80)
追加し、タスク定義を作成します。
サービスの作成
先ほど作成したクラスターを選択しサービスを作成します。
起動タイプ: FARGATE
タスク定義: 先ほど作成したタスク定義(今回の場合、teamev-task-definition)
サービス名: teamev-service
タスクの数:1
ネットワーク: 作成したVPC、FARGATEを置きたいsubnet、セキュリティーグループ(今回は、勝手に作られるもの(インバウンドポートは80))を選択
ロードバランサーは今回は使用しないのでなしを選択でいきます。
最後に、サービスを作成します。
すると、以下のようにタスクがRUNNINGになることが確認できます。( 少し時間がかかります。)
あとは、ちゃんと動いているか確認します。
動作確認
RUNNINGのタスクを選択し、public IPを取得します。
このPublic IPを使用して、POSTMANでapiがちゃんと動いているか確認します。
値が返ってきました!!
最後に
今回はDB接続周りもやってるんですが、それは次回書こうと思います。