ECSでAPIのバックエンドを動かしてみた

# やりたいこと
[こちら](https://qiita.com/tToyoshima/items/dbb0a4c3540226c318cc)で構築したEC2のAPIバックエンド環境をECSで構築する

# 手順
1. Dockerfileを作成する
1. ECRリポジトリを作成する
1. ECSのタスク定義を作成する
1. ECSのクラスターを作成する
1. ECSのタスクを実行する
1. APIを実行する

# DockerFileを作成する
下記のDockerfileを作成しました。
内容的には、ビルドで作成したjarファイルをDockerfileと同じ場所に配置し、コンテナ内にコピーしたjarを起動しています（イメージのJavaは8です）

```Dockerfile
FROM openjdk:8-jre-alpine

ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
    SLEEP=0 \
    JAVA_OPTS=""

# add directly the jar
ADD *.jar /app.jar

EXPOSE 8080
CMD echo "The application will start in ${SLEEP}s..." && \
    sleep ${SLEEP} && \
    java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar
```

# ECRリポジトリを作成する
イメージをAWSに配置するため、ECRを作成してプッシュします。

Amazon ECR > Repositories > リポジトリの作成 をクリックします。
![スクリーンショット 2023-05-25 8.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/475cc6aa-0f1d-09b2-be0d-20f09ab7b769.png)

今回はプライベートリポジトリのためプライベートを選択し、リポジトリ名を入力します。
![スクリーンショット 2023-05-25 8.23.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/53142aec-795c-67f9-dea5-802c3138e9ce.png)

リポジトリの作成をクリックします。
![スクリーンショット 2023-05-25 8.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/e7587c36-d697-7380-75b1-126b0dc69b49.png)

リポジトリが作成されました。
![スクリーンショット 2023-05-25 8.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/f5971ac8-11c2-a919-5e84-23dfd9db0750.png)

プッシュコマンドの表示をクリックすると認証とイメージのプッシュ手順が表示されます。
![スクリーンショット 2023-05-25 8.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/17da2db7-61e3-40f2-26ca-c22a55c56bbe.png)

上記の手順通りに実施します。
1. Dockerクライアントを認証
1. Dockerイメージを構築
1. イメージのタグ付け
1. リポジトリにイメージをプッシュ

# ECSのタスク定義を作成する
ECSのタスク定義を作成します。

Amazon Elastic Container Service > タスク定義 > 新しいタスク定義の作成 をクリックします。
![スクリーンショット 2023-05-25 22.17.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/be55b1d9-ba93-ca87-f571-bcb6ff7249f4.png)

タスク定義ファイミリー名を入力します。
タスク定義名とイメージのURIを入力します。イメージのURIは先ほど作成したECRのURIです。
（今回はポートマッピングは80、プロトコルはTCP、アプリケーションプロトコルはHTTPです）
![スクリーンショット 2023-05-25 22.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/e446a76b-11a4-ecba-f952-d24d12a553fa.png)

今回はサーバレスとしたいめ、AWS Fargateを選択します。
CPU・メモリは好きに設定します。
タスクの実行ロールを設定します。既存の実行ロールがない場合は「新しいロールの作成」で自動的に作成されます。

![スクリーンショット 2023-05-25 22.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/7a2103fc-c196-e9ec-1bd9-97b8ccaec5fa.png)

作成をクリックします。
![スクリーンショット 2023-05-25 22.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/d06ce785-4685-7260-9817-023bf4f1543c.png)

タスクの定義が作成されました。
![スクリーンショット 2023-05-25 22.29.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/aa0a349c-b9ee-5375-e27b-08f7776e6ee6.png)

# ECSのクラスターを作成する
実行にはクラスターが必要なため、作成します。

Amazon Elastic Container Service > クラスター > クラスターの作成 をクリックします。
![スクリーンショット 2023-05-25 22.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/0a20a589-1fc7-d487-4c6c-11f453eeedab.png)

クラスター名を入力します。
サブネットを選択します。
![スクリーンショット 2023-05-25 22.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/ba4cd7d7-dc25-6865-4de4-37622f4c4167.png)

作成をクリックします。
![スクリーンショット 2023-05-25 22.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/473d3dea-04e5-5800-8d17-ed3b82abe7f3.png)

クラスターが作成されました。
![スクリーンショット 2023-05-25 22.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/531c6ab3-cd6c-1803-3345-dfb4452bf4bb.png)

# ECSのタスクを実行する
いよいよタスクを実行します。

Amazon Elastic Container Service > クラスター > タスクの定義 から新しいタスクの実行をクリックします。
![スクリーンショット 2023-05-25 22.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/705140f6-fbac-6c46-6a75-c26b5254d504.png)

起動タイプはFargateを選択します。
![スクリーンショット 2023-05-25 22.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/5de5608d-612b-88ce-aa56-a555b26742db.png)

APIのバックエンド環境を実行したいため、Serviceを選択します。
作成したタスク定義を選択します。
サービス名を入力します。
![スクリーンショット 2023-05-25 22.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/fd0b4e38-f652-e000-e024-6fbfc3233409.png)

作成をクリックすると、タスクが実行され、サービスがデプロイされます。
![スクリーンショット 2023-05-25 22.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529227/f0912b9f-f8cd-9b21-52ea-c4deeacd289d.png)

# APIを実行する
APIのエンドポイントはネットワークインターフェイスのIPになります。

Amazon Elastic Container Service > クラスター > [該当クラスター] > サービス > [該当サービス] > タスク > [該当タスク] > 設定 からENI IDを選択します。
該当のENIからIDを確認します。

フロントエンド上で、EC2向けになっていたエンドポイントをECS（ポート80）に変更することで、ECSの環境でAPIを実行できました。
（ここでは省略しますが、セキュリティグループの設定は必要です）