ECSとは?
DockerコンテナをAWSで楽で動かすサービス。Dockerイメージを作ってECSに対して動かしてくれるように依頼します。
オープンソースのKubernetesと比較して、各種AWSサービスとの親和性が高いことが利点となります。
なぜECSを使うのか?
コンテナを動作させるインフラ基盤の構築管理を楽にすることができるため。EC2でもdockerを動かせるのですが、ECSの方がマネージドで管理が楽です。
EKSと比べたデメリット
クラスター内外の通信のために別途インフラ構築が必要になります。
ECSを理解するポイント
あくまでコンテナオーケストレーション(コンテナを管理する)という役割であり、コンテナを動かす実行環境のサービスではないという点です。
設定で心がけること
インターネットゲートウェイ経由で外に見に行かせる必要があります。
配置場所
VPCのサブネットの中に配置します。
イメージ図1
SchedulerはManagerを見ながら今自分は何個リソースを起動しなければならないのか決めてTask Definitionを使用してクラスターに命令します。Agentは、ECSの方と連携して逐次何をすれば良いか把握します。
イメージ図2
サービスの中では複数タスクを動かしてELBで負荷分散させます。
クラスター
一つのアプリケーションを構成する枠のようなイメージです。コンテナのサービスをまとめて管理してくれる大きな箱のイメージです。ECSサービスとタスクを実行する論理グループになります。クラスターの中に複数のサービス(Ngnix等)が管理されていてサービスごとに管理することが可能です。
クラスターテンプレート
ネットワークのみ(AWS Fargate)
FargateとはAWSにコンテナを全てお任せしていい感じに動かしてくれますよというサービスになります。他のクラスターテンプレートに比べるとコンテナの管理が楽になります。
サービス
それぞれ役割ごとにサービスを用意します。(ユーザーサービス、課金サービス、認証サービス、Webサービスなど)
必要な数だけタスクを維持するスケジューラで、オーケストレータのコア機能にあたる。サービス作成時は、起動するタスクの数や、関連づけるロードバランサや、タスクを実行するネットワークを指定します。
又、タスクが何らかの理由で終了した場合は、タスク定義をベースに新しいタスクを生成して指定したタスク数を維持します。
タスクの数
立ち上げるコンテナの数を指定する。
タスク
タスク定義を元に実際に動作しているコンテナ群です。コンテナが動作するコンポーネントのことです。1つ以上のコンテナから構成されるアプリケーション実行単位です。Dockerコンテナが1つ以上指定されている必要がある。
タスク定義
タスクの設計書です。具体的にはJSONで記述するタスクを作成するテンプレート定義です。コンテナの起動に対する設定をすることができます。dockerで言えばdocker-composeと同じ役割になります。1つのタスク内に複数コンテナを含むことが可能です。
- タスクとコンテナに割り当てるリソース(メモリやCPU、ポート)
- IAMロール
- Cloud Watch Logsの出力先
- デプロイするコンテナイメージ(どういうコンテナ(どのイメージ)を使うのか。)
タスクロール
立ち上がるコンテナサービス(Ngnix等)自体が、他のAWSサービスにアクセスするための権限を付与できます。特にアクセスさせない場合は「なし」で問題ありません。
タスクの実行IAMロール
CloudWatchをログに出力するための権限の設定をできます。
コンテナ名
使っているコンテナの内容(Ngnix等)を指定します。
イメージ
ECRのレポジトリのイメージのURIを指定します。もちろん、ECRを使わずにDocker Hub等のオープンソースのリポジトリサービスを指定することも可能です。
ポートマッピング
コンテナの受け口となるポートを指定します。
セキュリティ対策
OSレイヤ
AWS側の責務であるため、利用者側の対策は不要
無制限管理アクセス対策
IAMユーザーが割り当てられた利用者の職務ごとにIAMグループを割り当て、付与するIAMポリシーに従ってECSの操作スコープを限定することで管理アクセスを制限できる。
構築手順メモ
見通しを良くするために完全に手順だけのメモなので具体的な設定方法などは別途調査などをしていただく必要があります。
Apache(Webサーバー)を作って外部公開する。
- ECSから他サービス(cloudwatchなど)へアクセスさせるためにロールを作成する。ECSはロールは4つあるので全て作る。
- ECSクラスターを作成する。(EC2を生成する。)
- ECSタスクを作成する。(httpd:latestなどのWebサーバーのイメージを指定)
- クラスタに「3」で作成したタスクを実行する。
- EC2インスタンスのセキュリティグループのインバウンドルールでECSのポート(49153など)を追加する。
- Webサーバーとかであれば、にアクセスできるようになる。(http://18.179.32.126:49153/など)
冗長構成のアプリを動かす
1.アプリを配置するネットワーク設定
- クラスタを配置するためのVPCを作成する。
- VPCの中に2つサブネットを作成する。(冗長化するなら)
- インターネットゲートウェイを作成し、VPCにアタッチする。(インターネットから接続できるようにするため)
- ルートテーブルの修正を行い、3で作ったインターネットゲートウェイを指定する。また、2で作成したサブネットをふたつ関連づける。(インターネット向けの道を作る。)
2.コンテナの設定
- ローカルで動作させるアプリケーションのDockerfileを作成する。(例えば、RailsやLaravelの動作環境を記述した定義ファイル)
- ローカルでdocker desktopを起動する。
- ECRのリポジトリを作成する。(プライベートとかで良いです。)
- awsにログインする。(ECSのプッシュコマンドの表示に記載のやつをそのままコピペ)
- ローカルでDockerfileが配置してあるディレクトリに移動してbuildコマンド実行(ECSのプッシュコマンドの表示に記載のやつをそのままコピペ):M1Macの場合はオプションが別途あるので注意!
- タグづけ(ECSのプッシュコマンドの表示に記載のやつをそのままコピペ)
- ECRにプッシュする。(ECSのプッシュコマンドの表示に記載のやつをそのままコピペ)
3.ECSの設定
- ネットワークのみのクラスターを作る。
- タスク定義を作成する。(fargate、手順2で作成したECRのコンテナURLを設定)
- クラスタにサービスを定義する。(手順1で作ったVPCとサブネット2つは必ず割り当てるようにする。)
- これでタスクにパブリックIPが割り当てられるので試しにアクセスしてみても良い。
4.DB(たいていのアプリは使うと思うので)の設定
- ローカルで使いたいDockerfileの作成(PostgreSQL、MariaDBなど)、なおユーザー名、パスワードなどの設定情報はタスク定義がわに寄せても良い。
- ECRにレポジトリを作る。
- DBのDockerfileディレクトリにローカルで移動してECRにプッシュコマンドを実行する。
- 既存のタスク定義から「新しいリビジョン」を押下して、コンテナを追加する。
- 基本的に、DBが先に立ち上がってアプリを立ち上げると思うので、スタートアップ依存順序の設定は設定しておきましょう。
- サービスに行って、リビジョン「2」に変更して更新をします。
実際の運用では。。
リビジョンを切り替えるとコンテナ内のデータは初期化されて永続化を行えません。なので実際の運用では以下のような方法がとられます。多いのはRDSでしょう。
- DBはコンテナ化せずにRDSを参照するようにする。
- Elastic File Systemに同期させる。
5.独自ドメインの設定
- Route53でドメインを取得する。
運用方法
- Dockerfileはgitで管理する。
- CodeBuildを用いてDockerfileが更新されたら自動でdocker build、ECRへのプッシュが動き本番反映されるようにする。
この記事へのコメントはありません。