みなさん、こんにちは!S.Kです!
今回はAWSのECSについてです!

ECSとはElastic Container Serviceの略で、文字通りコンテナを動かすサービスとなっています。
今回、このECSを使って、組み立てたDockerプロジェクトを最低限動かすまでの道のりをみなさまに共有できればとおもいます。

 

0. 大まかな流れと前提

画像つきで説明しようと思いますが、大まかな流れを説明します。

  • Dockerfileを準備する
  • AWSのリポジトリ(ECR)にDockerイメージをアップする
  • ECSのタスク定義をする
  • ECSのクラスターをつくる
  • タスクを作成する
  • スケジュールを設定する(番外編)

今回お読みいただく前提として、

  • VPCはすでにある(VPCとは?という方は・・・・損することはないので勉強されることをおすすめします。)
  • Dockerfileなどのコンテナファイルもすでにある

また、「とりあえず動かす」という目的から、「腫れ物にはさらわない」というスタンスで難しそうな設定には触れません。
今回は本当に小さなものを動かしますが、Dockerで動くものなら大きなものにも対応します。

使うサービスはこの2つです!

  • ECS(コンテナを動かすためのもの)
  • ECR(コンテナファイルを格納するためのもの)

 

1. 動かしたいものを準備する

今回は単純に「Hello」を表示させるだけのものです。

 

2. AWSのリポジトリ(ECR)にDockerイメージをアップする

ECR(Elastic Container Registry)に、動かしたいものを格納しましょう。

ECRにアクセスすると、「リポジトリを作成」みたいなのがあるはずなので、それをクリックしましょう。

可視性設定はお好きな方を選んでいただければいいですが、公開するまでもないので「プライベート」にします。
(実際の案件では言うまでもなく非公開かと思いますので注意しましょう。)
赤線の「リポジトリ名」にはお好きな名前を入れましょう。今回は「sk-bs-blog」と入れておきます。また、画面をさらに下にいくと「イメージスキャンの設定」や「暗号化設定」といった設定項目がありると思いますが、今回は両方とも「無効」としておきます。
準備ができたら右下「リポジトリを作成」を押しましょう。

このようにできあがりました!

次に、右上の「プッシュコマンドの表示」を押してみましょう。

コマンドは以下の流れです!

  • ECRへのログイン
  • 作ったDockerのビルド
  • タグ付け
  • ECRへプッシュ

(AWS CLIについては割愛します。)

なおdocker buildについて少しだけ。
ECSに限らず、作ったDockerファイルをビルドするためのコマンドは
docker build -t <任意の名前> <Dockerfileの場所>
となります。上記のコマンドでは実行する場所とDockerfileの場所が同じところにあるので「.」のみで済んでいますが、例えば一つ前の階層で実行する場合、そしてDockerfileの場所が「docker」というフォルダの中であれば、
docker build -t <任意の名前> ./docker
となります。

 

3. タスク定義を作成する

いよいよ、ECSに入っていきます!

ECSのにアクセスしたら、まず、「タスク定義」を作成しましょう。ECSにさせたい作業内容をここで定義します。

今回はFARGATEを選択します。

お好きな定義名、そしてタスクロールにecsTaskExecutionRoleが必要になるので、ない方はIAMで追加しましょう。
オペレーティングシステムファミリーはLinuxにしておきます。

ここのタスクの実行ロールもecsTaskExecutionRoleにしましょう。
タスクサイズは動かそうとするタスクの大きさに応じて調整します。今回は本当に簡単なものなので最小でいきますが、案件によっては最大メモリ30GBを使うこともあります。大きいほど料金がかかるので、最適なものを選びましょう。

そして「コンテナの追加」をしましょう。

今回はコンテナ名とイメージだけを設定します。

イメージ」には前述のコマンド集のこのオレンジ線のところを入力しましょう。設定し終わったら「追加」を押して、ダイアログが閉じたら最後「作成」です。

追加されましたね!

4. クラスターの作成

次に、コンテナを動かすための場所、「クラスター」を作りましょう。「クラスター作成」というボタンがあるのでクリックしましょう。

今回はFARGATEを使うので「ネットワーキングのみ」を選択します。

 

ここも名前だけでいいと思います。VPCがなければ作成しましょう。

できましたね!

 

5. タスクの実行

いよいよ実行するときが来ました!
作成したクラスターに移動しましょう。

こちらの「タスク」のタブをクリックして、

「新しいタスクの実行」をしましょう!

起動タイプは前の段階で選んだFARGATE、OSファミリーはLinux、そして忘れたころにやってきました、動かしたい「タスク定義」をここで選択しましょう。
タスクの数は今回は一つしかないので1にしましょう。

 

黒塗りが多いですが・・・・笑
ここでVPCとそれに属するサブネットを選択しましょう。
また、「パブリックIPの自動割り当て」というところはENABLEDにしてください。
(私はこれをDISABLEDにしていたばかりに何度も「あれ???動かない???」みたいなことが起きて気づいたら数時間。)

あとはそのままでもいいでしょう。右下の「タスクの実行」をクリックしましょう。

 

タスクが設定されました。
この画面にある「ステータス」ですが、
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-lifecycle.html
のような感じで回っていきます!

 

始まりましたね!

 

またたく間にSTOPPEDになりましたね。まぁ小さなタスクなので。
Essential Container in task exited
と出れば正常終了です。(エラーであればその内容が表示されます。)
このようにして開始された時刻と終了時刻がわかります。

 

ちゃんとログも表示されていますね!

_

なお、一度止まると、クラスターを開いたときには「結果なし」と表示されるので、赤丸の「Stopped」を押しましょう。

ご覧の通り終了したタスクも表示されます。

なお、この終了したタスクは(メカニズムは筆者の方ではつかめていませんが)しばらくすると消えます。
設定によってCloudWatchで見ることも可能ですが、終わったらなるべく早くログを見に行くか、ログを外部に送信するスクリプトなどつくっておくといいかもしれません。

ここまでで、このブログのタイトル通り「とりあえず、とりあえずECSでコンテナを動か」す方法はお教えできたと思いますが、

「実行だけならできる方法はわかったけど、これを決められた時間に動かすことはできない?」

・・・・可能です!

6.実行する時間を設定したい

クラスターを開き、「タスクのスケジューリング」を押して、「作成」をクリックしましょう。

名前、スケジュールルールタイプはお好きなものを。
今回は決められた時間に実行したいのでCron式にします。

cron(分、時、日、月、曜日、年)
というようになっています。
詳しくは
https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html
または
🔍[AWS Cron] で検索してみましょう!
量が多くなるので割愛しますが、Cronでも一日に数回などの間隔の設定はできます。

cron(25 3 25 8 ? *)
と画像には書いてありますが、これは
「世界標準時8月25日3時25分に実行せよ。年は(月日時分があっていれば)いつの年でも常に、曜日は問わない(というか問えない)」という意味です。
日本は9時間進んでいるので12時25分に実行するには9時間マイナスしたものをCronに指定しましょう。

今私がここを入力しているのがつまり上記の時間ぐらいなのですが、とっくに過ぎてしまっているので、このあと25分を35分になおします。

ターゲット名はお好きな名前に、以降は実行したいタスクの仕様に沿って指定しましょう。(今回は5.で記載したことと同じ内容です。)

VPCとパブリックIPの自動割当も前述と同じです。入力したら「作成」しましょう。スケジュールはできあがるまでに数秒かかります。
また、ログインされている環境によっては権限が足りないと言われることもあるので、そのときは適宜追加しましょう。

それでは、12時35分になりました。

保留中に1個ついてますね!

スクショ取ろうとしたらまたたく間にDEPROVISIONING….(終わりかけ、という意味です。)

STOPPEDになりました。設定した時分(00秒というわけではありませんが)に実行されたのがわかりますね。

 

ログもちゃんと出力されています!

 

7. 最後に

ということでいかがでしたでしょうか?
いろいろ設定はありますが、一度流れを覚えてしまえばそう難しくはないと思います。
ぜひご活用ください!

長文になりましたが最後までお読みいただきありがとうございました!

Follow me!