前記事
RailsをAWS ECS(Fargate)でホストする環境構築のすべて【2. Docker定義、ECRの設定】
https://qiita.com/polar_bear_tech/items/87f5795346d246a1e07c
ECRにコンテナイメージをプッシュするまでを書きました。
今回はECS周辺の設定を行い、デプロイします。
加えて、SSMを使用した操作も行います。
下準備
ECS用セキュリティグループの作成
ECS用のセキュリティグループを作成します。
インバウンドはALBから80ポートと、VPC endpointを介してSSMからの接続のため443ポートを開けています。
タスク実行ロールの作成
IAM>ロール>ロールの作成から、タスク実行用のロールを作成していきます。
ECSのタスクを制御するのと、SSMによる操作を行うため、以下のポリシーをアタッチします。
- AmazonECSTaskExecutionRolePolicy
- AmazonSSMManagedInstanceCore
- AmazonSSMAutomationRole
- AmazonSSMDirectoryServiceAccess
"ecsTaskExecutionRole"みたいな名前を付けて保存します。
SSMアクティベーションコードの発行
System Manager>ハイブリッドアクティベーションから、アクティベーションの作成を行います。
説明と、管理できるインスタンス数(30くらいあれば良いかと思います)、有効期限を入力して作成。
作成したら、画面上部にアクティベーションコードとIDが表示されるので控えておいてください。
控え忘れた場合は、もう一度作成すれば大丈夫です。
ECSタスク定義
ECS>タスク定義から、新しいタスク定義の作成を押下し、作成していきます。
タスク実行ロールに、先ほど作成したタスクを設定。
タスクサイズは、EC2のmedium規模で設定しています。ここは任意のサイズです。
コンテナの追加ボタンから、ECRにプッシュしたコンテナイメージを追加していきます。
まずはnginxから、イメージ欄にはECRの一覧画面に表示されているURIをコピーして貼り付けます。
メモリ制限を4GiB、CPUユニット数を1024(1vCPU)に設定します。
次はrailsコンテナを追加します。
nginx同様にURIをペーストし、メモリ制限を4GiB、CPUユニット数を1024(1vCPU)に設定します。
起動時に実行するシェル(エントリポイント)もコマンドをカンマ区切りで記載。
ここで、先ほど取得したSSMのアクティベーションコード・IDを下記の変数名でそれぞれ設定します。
- SSM_ACTIVATION_CODE
- SSM_ACTIVATION_ID
その他、必要に応じて下記を設定します。
database.ymlで環境変数からロードするようにしておく値
- DATABASE_HOST
- DATABASE_PORT
- DATABASE_USER
- DATABASE_PASSWORD
AWSのAPIアクセス用のキー情報
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
最後にスタートアップ依存順序をnginxのコンテナ側に追加します。
以降は初期値のままで、作成まで進めます。
ECSクラスタ作成
ECS>クラスターからクラスターの作成を押下して、作成していきます。
テンプレートはFargate用の「ネットワーキングのみ」を選択。
クラスター名を入力し、
CloudWatchでハードウェア監視を行いたい場合はCloudWatch Container Insightsにチェックします。
ECSサービス定義
最後!クラスター管理画面のサービスタブにある作成ボタンから、作成していきます。
起動タイプはFargate、タスク定義に先ほど作成したタスク定義を選択します。
リビジョンはlatestを選択。
タスク定義はバージョン管理されているので、これを更新したら最新を選んだり、前のリビジョンに戻したりできます。
サービス名を任意の内容で入力。
タスク数は2とかにするとバランシングしてくれます。任意の個数指定してください。
デプロイに関してはCodeDeployを使用する場合はB/Gにするなど、任意です。
ネットワークは最初に作成しておいたVPCを選択。
サブネットもECSコンテナをのせる予定の2つのサブネットを設定。
セキュリティグループは1つ目の記事で作っておいた、ECS用のセキュリティグループを適用。
パブリックIDの自動割り当ては、有効。(有効じゃないとSSMで接続できなかった気がする)
ロードバランサも作っておいたものを選択しましょう。
ロードバランス用のコンテナは、nginxのコンテナを選択し、ロードバランサーに追加ボタンを押します。
ターゲットグループ名を作っておいたもので選択すると、全部自動入力されるかと思います。
オートスケーリングは任意で設定してください。
タスク平均のCPU・メモリの使用率や、タスクごとのリクエストの完了数を条件にしてオートスケーリングができます。
作成して、タスクタブを開き、しばらくすると、RUNNINGになるかと思います!
起動確認
EC2>ロードバランサーからDNS名をコピーして、ブラウザで確認しましょう。
ルートはNginxのデフォルトを設定しているので、Nginxの初期画面がでました。
SSMの操作
まだもうちょっとだけ。
System Manager>マネージドインスタンスを開くと、SSMで管理されているサーバが表示されます。
アクティベーションコードがうまく設定できていて、entrypoint.shでSSMのエージェントを起動できて、ネットワーク設定も開いていればオンラインとなっているハズです。
選択し、アクションから「Start session」を押下すると、
CUIが開きます。
Railsのコンテナに入れたので、これで操作可能なのですが、注意点として、ユーザーはssm-userというものになっています。
sudoできるユーザーになっていますので、たとえばマイグレーションを行うとしたら、下記のコマンドで実行できます。
$ sudo -E bundle exec rake db:migrate RAILS_ENV=staging
ECSをSSMで管理する場合、課金対象になるかリファレンスから確実なところ読み取れなかったのですが、セッションマネージャでアクセスできるということは課金されると思います。
なので、使い終わったら登録解除しておくと、課金されませんので良いかも。
最後に
入門できるまでが遠い門、まさにFargateでした。
こだわると、あとは下記が設定できると良いかと思います。
- 環境変数はSystemManagerのパラメータストア使ったほうがいいです。
- CodePipelineで自動デプロイ設定できます。
- SSM接続のためのアクティベーションコード発行と環境変数への設定は、entrypoint.shでaws-cliつかってできたら手間が減る。
この記事としてはあくまで動作させるまでということで、以上です。