- 導入
- PJのDocker化
- イメージをECS上で動かす <=イマココ
- CodePipelineを使った自動デプロイ
さて、いよいよECS上にイメージをアップして動かすところです。
大きな手順は下記
- ECRにリポジトリを作成し、イメージをそこにプッシュ
- プッシュされたイメージをもとにECS上で動作するクラスターを作成
- URLからそこにアクセスできるようにする
構成としては、タスクをFARGATEで起動させALBを介してアクセスする形です
クライアント=>ELB=>タスク(コンテナ)
みたいな
#ECRにリポジトリを作成
基本公式ドキュメント通りにすれば行けるのですが、実はいけないところがあったりします。
##Dockerfileの指定が必要
ドキュメントには「リポジトリを作成し、プッシュコマンドを表示してその通りに打てばプッシュできます」とありますが、このコマンドにはDockerfileを指定しているところがありません。
AWSで指示されるコマンドは
- AWSへのログイン
- イメージにタグをつけてビルド
- ビルドしたイメージのタグにリポジトリURLを加える
- そのタグを指定してpush
の手順ですが、この「2. イメージにタグをつけてビルド」の時点でDockerfileを指定する必要があります。
指示されるコマンドは下記
$ docker build -t {ECRのリポジトリ名} .
このまま打つとデフォルトのDockerfileが使用され、場合によっては失敗します。
(私の環境が悪い可能性もありますが未検証。確実なのは明示的にDockerfileを指定することかと。。)
Dockerfileを指定するためには、
$ docker build -t {ECRのリポジトリ名} -f {Dockerfileへのパス} .
の形式で打つ必要があります。
#ELB作成
実はECSのクラスターを作る際にELBを指定するところがあります。
なので使う場合はあらかじめ作っておくと楽。
普通の手順で作ればいいですが、タスクへの接続はIPで行われるため、ターゲットグループの「Target Type」に「IP」を指定する必要があります。
#ECS上に動作環境を作成
ECSは登場人物が多い。。
下記の順に作ります。
- クラスターを作成
- タスク定義を作成
- 1で作ったクラスターの中に、2で作ったタスク定義を使用するサービスを作成
ざっくりコンテナ=タスクみたいなもので、それを立ち上げるのが「サービス」、そのサービスをまとめるのが「クラスター」という関係になってます。
「サービスの作成」はクラスター内でないとできない仕様なので一番初めにクラスターを作る必要があります。
##クラスターを作成
難しい設定はないのでさくっと行って大丈夫です。
迷うのはクラスターテンプレートの指定くらい?
##タスク定義の作成
ここで
・起動元のイメージをECRリポジトリで指定
・コンテナメモリの割り当て
・.envに指定する変数の指定
を行います。
これも決まっていればぽちぽち打ち込むだけ。
##サービスの作成
ここでは
・使用するタスク定義の指定
・クラスターの指定
・オートスケールの指定
・ヘルスチェックの猶予時間
・タスクを配置するサブネットの指定
を行います。
さらにロードバランサーを使用するなら、ロードバランサーの指定も必要。
一応あらかじめサブネットを複数作成したので、それらを指定してマルチAZにしました。
##タスクが立ち上がるか確認
ここまでできたら自動でタスクが立ち上がるはず。
いけるかどうか見守りましょう。
##立ち上がらない時
起動時に何かしらのエラーがあると自動停止し、ステータスがRUNNING=>STOPPEDに変わります。
今回多かった原因は
・ヘルスチェックの失敗
・nginxの設定周りのエラー
STOPPEDになったタスクのIDをクリックすると落ちた原因がみれるのでそれをみて対処します。
必要に応じて「Logs」タブからログも確認します。
###ヘルスチェックの失敗
まず真っ先に確認するのはセキュリティグループの設定。
ELBが弾かれていると落ち続けます。
許可しており、たまに成功するくらいならUnHealthyになる条件が厳しすぎる可能性があるので少し緩めてみます。
###nginxの設定周りのエラー
今回一番ハマった原因。
イメージ指定を間違っていたために変なconfファイルが使われたようでひたすらエラーが出てました。
#インターネットでのアクセス確認
ここまで来たらあとはRoute53か何かのDNSで、ECSに紐づけたELBを指定します。
これでECSにアクセスできるはず。
#まとめ
コンソールでの設定事項が非常に多い。。
これが一番疲れました。
下記注意点です。
- コンソールでの設定事項が非常に多いのでよくセッション切れになります。
- 予め作成できるものは作っとくこと。
- タスクが立ち上がらない時は先に原因を切り分けること。関係する要素が多すぎて全部見ると終わりません。