RailsをAWS ECS(Fargate)でホストする環境構築のすべて【3. ECSへのデプロイ、SSMによる接続】

## 前記事
RailsをAWS ECS(Fargate)でホストする環境構築のすべて【2. Docker定義、ECRの設定】
https://qiita.com/polar_bear_tech/items/87f5795346d246a1e07c

ECRにコンテナイメージをプッシュするまでを書きました。
今回はECS周辺の設定を行い、デプロイします。
加えて、SSMを使用した操作も行います。

## 下準備

### ECS用セキュリティグループの作成

ECS用のセキュリティグループを作成します。
インバウンドはALBから８０ポートと、VPC endpointを介してSSMからの接続のため４４３ポートを開けています。
![スクリーンショット 2020-08-18 21.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/a3260be2-0e27-1613-146f-33bd11e63a77.png)

### タスク実行ロールの作成

IAM>ロール>ロールの作成から、タスク実行用のロールを作成していきます。

ECSTask用のユースケースを選択して次へ。
![スクリーンショット 2020-08-18 19.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/1a3940f9-3f15-3e7e-996c-21505dfd2f12.png)

![スクリーンショット 2020-08-18 19.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/36d95eed-5926-18c1-979b-cad6b76e61af.png)

ECSのタスクを制御するのと、SSMによる操作を行うため、以下のポリシーをアタッチします。

* AmazonECSTaskExecutionRolePolicy
* AmazonSSMManagedInstanceCore
* AmazonSSMAutomationRole
* AmazonSSMDirectoryServiceAccess

![スクリーンショット 2020-08-18 19.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/8377cebe-4979-7eec-51a3-7c9839426010.png)

![スクリーンショット 2020-08-18 19.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/17384d31-7ee9-3f63-3170-b3822ac1751a.png)

"ecsTaskExecutionRole"みたいな名前を付けて保存します。

### SSMアクティベーションコードの発行

System Manager>ハイブリッドアクティベーションから、アクティベーションの作成を行います。
![スクリーンショット 2020-08-18 19.23.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/7b283995-313d-7654-3b67-ea6138fc8a4b.png)

説明と、管理できるインスタンス数（３０くらいあれば良いかと思います）、有効期限を入力して作成。
![スクリーンショット 2020-08-18 19.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/7a5ffa60-e930-a4e1-44d0-d66054e24b16.png)

作成したら、画面上部にアクティベーションコードとIDが表示されるので控えておいてください。
控え忘れた場合は、もう一度作成すれば大丈夫です。
![スクリーンショット 2020-08-18 19.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/4d1477f3-47d5-a994-60db-2e6566155c2d.png)

## ECSタスク定義

ECS>タスク定義から、新しいタスク定義の作成を押下し、作成していきます。

起動タイプはFargateを選択。
![スクリーンショット 2020-08-18 19.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/7bbc27ed-b875-cf59-31c5-6922cb9e6adb.png)

タスク定義名を入力。
![スクリーンショット 2020-08-18 19.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/4b486f4c-7b83-0ae5-ecad-d744d5944833.png)

タスク実行ロールに、先ほど作成したタスクを設定。
タスクサイズは、EC2のmedium規模で設定しています。ここは任意のサイズです。
![スクリーンショット 2020-08-18 19.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/0a825943-5530-e516-8476-c093c853cc07.png)

コンテナの追加ボタンから、ECRにプッシュしたコンテナイメージを追加していきます。
まずはnginxから、イメージ欄にはECRの一覧画面に表示されているURIをコピーして貼り付けます。
メモリ制限を4GiB、CPUユニット数を1024(1vCPU)に設定します。
![スクリーンショット 2020-08-18 19.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/afe15d4a-6d4c-7b44-8797-31fc1e0bdb09.png)

次はrailsコンテナを追加します。
nginx同様にURIをペーストし、メモリ制限を4GiB、CPUユニット数を1024(1vCPU)に設定します。
起動時に実行するシェル（エントリポイント）もコマンドをカンマ区切りで記載。
![スクリーンショット 2020-08-18 19.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/541d13ef-ae7b-1acb-961d-adeb8587192c.png)
![スクリーンショット 2020-08-18 19.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/d8f1f239-2043-5e78-8d4a-ac1fb728ab93.png)

環境変数を設定します。
![スクリーンショット 2020-08-18 19.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/41d5c99e-b2a7-d6f9-4fbf-95c1f6fd7265.png)

ここで、先ほど取得したSSMのアクティベーションコード・IDを下記の変数名でそれぞれ設定します。

* SSM_ACTIVATION_CODE
* SSM_ACTIVATION_ID

その他、必要に応じて下記を設定します。

database.ymlで環境変数からロードするようにしておく値

* DATABASE_HOST
* DATABASE_PORT
* DATABASE_USER
* DATABASE_PASSWORD

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/015ca8d1-481a-f5a5-611e-91a2a858666c.png)

AWSのAPIアクセス用のキー情報

* AWS_ACCESS_KEY_ID
* AWS_SECRET_ACCESS_KEY

最後にスタートアップ依存順序をnginxのコンテナ側に追加します。
![スクリーンショット 2020-08-18 19.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/8605fb3f-5863-d10e-77c3-ab85bdc587ad.png)

コンテナを追加できたらこんな感じになります。
![スクリーンショット 2020-08-18 19.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/1a856034-d14a-254a-fb37-4a8322529e10.png)

以降は初期値のままで、作成まで進めます。

## ECSクラスタ作成

ECS>クラスターからクラスターの作成を押下して、作成していきます。

テンプレートはFargate用の「ネットワーキングのみ」を選択。
![スクリーンショット 2020-08-18 19.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/49009714-86ff-cb8b-b7a8-0d77a5162acd.png)

クラスター名を入力し、
CloudWatchでハードウェア監視を行いたい場合はCloudWatch Container Insightsにチェックします。
![スクリーンショット 2020-08-18 19.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/134d1f93-7309-9cc8-06b2-e274408def72.png)

作成したら、クラスターの管理画面になります。
![スクリーンショット 2020-08-18 19.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/fc738211-3b56-e073-473f-4475477c695e.png)

## ECSサービス定義

最後！クラスター管理画面のサービスタブにある作成ボタンから、作成していきます。

起動タイプはFargate、タスク定義に先ほど作成したタスク定義を選択します。
リビジョンはlatestを選択。
タスク定義はバージョン管理されているので、これを更新したら最新を選んだり、前のリビジョンに戻したりできます。
サービス名を任意の内容で入力。
![スクリーンショット 2020-08-18 19.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/2756ad8d-d6a1-4adb-6143-1328213a3261.png)

タスク数は２とかにするとバランシングしてくれます。任意の個数指定してください。
デプロイに関してはCodeDeployを使用する場合はB/Gにするなど、任意です。
![スクリーンショット 2020-08-18 19.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/d835173a-9fa2-17be-5b9d-9df785daa021.png)

ネットワークは最初に作成しておいたVPCを選択。
サブネットもECSコンテナをのせる予定の２つのサブネットを設定。
セキュリティグループは１つ目の記事で作っておいた、ECS用のセキュリティグループを適用。
パブリックIDの自動割り当ては、有効。（有効じゃないとSSMで接続できなかった気がする）
![スクリーンショット 2020-08-18 19.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/ecc33bac-73c5-efe5-6fee-0a343c51c0a1.png)

ロードバランサも作っておいたものを選択しましょう。
ロードバランス用のコンテナは、nginxのコンテナを選択し、ロードバランサーに追加ボタンを押します。
![スクリーンショット 2020-08-18 19.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/0da7804d-710f-e598-19a8-3eb83234ce3c.png)
![スクリーンショット 2020-08-18 19.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/b952447a-09ff-3641-ddc7-603f9fd7e9de.png)

ターゲットグループ名を作っておいたもので選択すると、全部自動入力されるかと思います。
![スクリーンショット 2020-08-18 19.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/09779767-34eb-f3d8-533f-66fe3ecfae7a.png)

サービスの検出オプションは有効にしておきます。
![スクリーンショット 2020-08-18 19.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/dbfddeac-3716-561c-7b16-e79ec204bb39.png)
![スクリーンショット 2020-08-18 19.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/ddaabf57-bc55-65c4-6680-7fcb9fb2e9eb.png)

オートスケーリングは任意で設定してください。
タスク平均のCPU・メモリの使用率や、タスクごとのリクエストの完了数を条件にしてオートスケーリングができます。
![スクリーンショット 2020-08-18 19.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/86b78e85-1902-798d-677d-c578bb4c6621.png)

作成して、タスクタブを開き、しばらくすると、RUNNINGになるかと思います！
![スクリーンショット 2020-08-18 19.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/75230307-f3c8-f8c6-b19d-53f3b255de93.png)

## 起動確認

EC2>ロードバランサーからDNS名をコピーして、ブラウザで確認しましょう。
![スクリーンショット 2020-08-18 19.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/36126e5b-135b-826f-f7a3-1eefc7b1852b.png)

ルートはNginxのデフォルトを設定しているので、Nginxの初期画面がでました。
![スクリーンショット 2020-08-18 19.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/4ae6fba0-ca16-7b73-25dc-b2c4a1378b1b.png)

## SSMの操作

まだもうちょっとだけ。
System Manager>マネージドインスタンスを開くと、SSMで管理されているサーバが表示されます。
アクティベーションコードがうまく設定できていて、entrypoint.shでSSMのエージェントを起動できて、ネットワーク設定も開いていればオンラインとなっているハズです。
![スクリーンショット 2020-08-18 19.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/4a0e2178-bb58-e5f2-8a0b-bfddf5dc0e31.png)

選択し、アクションから「Start session」を押下すると、
![スクリーンショット 2020-08-18 19.37.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/a61ae64c-dfa6-e40d-089c-ef33b001ba2e.png)

CUIが開きます。
Railsのコンテナに入れたので、これで操作可能なのですが、注意点として、ユーザーはssm-userというものになっています。
![スクリーンショット 2020-08-18 19.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/86027174-b4c8-7430-dcb3-bcd8cb26fb65.png)

sudoできるユーザーになっていますので、たとえばマイグレーションを行うとしたら、下記のコマンドで実行できます。

```
$ sudo -E bundle exec rake db:migrate RAILS_ENV=staging
```

ECSをSSMで管理する場合、課金対象になるかリファレンスから確実なところ読み取れなかったのですが、セッションマネージャでアクセスできるということは課金されると思います。
なので、使い終わったら登録解除しておくと、課金されませんので良いかも。
![スクリーンショット 2020-08-18 19.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430603/b3bf4718-79bb-5a39-e046-7db1150a17bc.png)

## 最後に

入門できるまでが遠い門、まさにFargateでした。
こだわると、あとは下記が設定できると良いかと思います。

* 環境変数はSystemManagerのパラメータストア使ったほうがいいです。
* CodePipelineで自動デプロイ設定できます。
* SSM接続のためのアクティベーションコード発行と環境変数への設定は、entrypoint.shでaws-cliつかってできたら手間が減る。

この記事としてはあくまで動作させるまでということで、以上です。