[初心者向け]言われるままにFargate初めて触ったので、忘れないための記録

2019.11.21

こんにちは、平野です。

先日、部内の進捗報告のSlack部屋で

15分制限に引っかかりそうなのでLambda → Fargateへの変更作業

という文言を見かけました。

先日GlueのPython shellを使ってLambdaの15分の壁を越えようとした記事を書きましたが、

15分の壁を越えろ!GlueのPython shellでVPC Lambdaもどきの長時間ジョブを動かしてみた

Fargateでも同じようなことができるのか、と思い、早速試してみようとしました。 (が、今回の記事ではそこまで達成できてません!)

しかし、Fargateのこと何も知らないマンだったので、まずどこから触ったらいいのかまったく不明でした。 Fargateの入門記事を調べても、既存のECS環境からFargateへの移行記事などが多く Fargateがある時代にECSデビューする私にとってはツライものがありました。

ということで、Fargateを使っている人にやり方を聞いて、そのまま実践した記録を残しておきます。 「あとはマニュアルとか見て、自分で触って理解を深められるかな」というところまでは到達できたかなと思います。

なお、Dockerについての知識は少しだけある前提となっておりますが、正直私が知っているのは

  • 仮想環境である
  • (比較的)早く起動するから、目的の処理を行ったら終了させる使い捨てな使い方ができる
  • docker pull <イメージ名> ってやると設計図が手に入って、そこから実行できる
  • 熱くてナウい。

くらいで、この後の操作をトレースするにもdockerコマンドが叩ければ十分かと思います。

教えられるままに動かしてみた

教えられるままに順を追って、タスク実行までを行ってみました。

クラスターの作成

FargateはECSの一部だという数少ない前提知識から、ECSのマネジメントコンソールを開き、クラスタの作成を行います。

「AWS Fargateを使用」という記述がある「ネットワーキングのみ」を選択。

クラスター名を適当に入力し、次へ。 VPCは既存のものを使うので今回は作成しませんでした。

クラスターができました。 「コンテナインスタンスが起動中です。」と表示されていますが、 「ネットワーキングのみ」を選択したので、多分関係ないです。

以上でクラスターが出来上がりました。 今はクラスターが何なのかは考えないことにします。

ECRリポジトリにイメージをプッシュ

いきなりECRというのが出てきて面食らいました。

Amazon ECR

ECRはAmazon Elastic Container Registryの略でコンテナのイメージを保存しておく場所のようです。 Docker pullというコマンドは叩いたことがあったので、 Docker Hubと同様に、イメージを置いておくためのリポジトリなのだろうという理解です。 ここにDockerのイメージを置いていきます。

Dockerイメージの準備

まずは適当なDockerイメージを用意します。 拙い知識で、docker pull alpineと実行しました。

$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
89d9c30c1d48: Pull complete
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

Alpineは軽量なLinuxディストリビューションです。 今回は中身を触ることはないので、軽いに越したことはないです。

とにかく、これでECRにプッシュすべきイメージが用意できました。 docker imagesでイメージがあることを確認します。

$ docker images
alpine    latest   965ea09ff2eb  4 weeks ago   5.55MB

リポジトリへのプッシュ

ECSの左のメニューにはECRのリポジトリへのリンクがあります。

適当なリポジトリ名をつけるだけでリポジトリは完成です。

「イメージのプッシュ」などのボタンが準備されているかと思いきや、 「プッシュコマンドの表示」といのがあるのでクリックします。

プッシュはMacなどのローカルマシンのコマンドラインから行うようなので、表示に従います。

  1. Dockerの認証に関わるコマンドを実行します(中で何をやっているかはここでは触れません)
    $(aws ecr get-login --no-include-email --region ap-northeast-1)
    Login Succeeded
  2. Dockerイメージはすでに取得済みなので、ここはスキップします。

  3. プッシュするイメージにタグを付けます。

    docker tagの使い方は

    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

    のようなので、SOURCE_IMAGE[:TAG]の部分を書き換えて

    docker tag alpine:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/cm-hirano/test01:latest

    とします。docker imagesで見ると以下のようなものが出来ました。

    123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/cm-hirano/test01   latest              965ea09ff2eb        4 weeks ago         5.55MB
  4. イメージをプッシュします
    $ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/cm-hirano/test01:latest
    The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/cm-hirano/test01]
    77cae8ab23bf: Pushed
    latest: digest: sha256:e4355b66995c96b4b468160fc5c7e3540fcef961189ca13fee877798649f531a size: 528

    これにてリポジトリにプッシュ完了です。

タスク定義

リポジトリのプッシュはちょっと大変でした。 しかしこれで準備出来たので、あとはちょいと実行してやるだけ、のはずです。

ECSの「新しいタスク定義の作成」へ進みます。

もちろんFargateを選びます。

タスク定義名を適当に決めます。

メモリとCPUの割り当てを最小構成で設定し、「コンテナの追加」をクリックします。

「コンテナ名」は適当な名前でOKです。 「イメージ」は先ほどリポジトリにプッシュしたイメージを指定します。1

コンテナの「環境」の所で、実行させるコマンドを指定します。 dateとだけ入力して、コンテナの「追加」をします。

以上で、タスクの定義が完了しました。

あれっ、まだ実行出来ていない!あともうちょっと!

タスクの実行

今度こそ実行です。

先ほど作ったタスク定義を選んで「タスクの実行」を選択。

「起動タイプ」はFargateを選びます。 (さっきタスク定義でもFargateを選んだけど、なんでまた選択肢があるんだろう?)

クラスターは最初に作成したクラスターを指定し、 VPCとサブネット、セキュリティグループは既存のものを選びました。

これで準備完了!「タスク実行」をクリックします!! 長かった!!

「タスクが正常に作成されました」という表記ですが、 タスク定義からタスクが作成された、ということでタスクが動き始めたようです!

実行結果の確認

しばらく(数十秒?)経ってからタスクの詳細を見ると、 「終了コード 0」にて処理が終了していることがわかります。

CloudWatch Logsを見ると、ちゃんとdateの結果が出力されていることが確認できました!!

おめでとう!君もFargateマスターだ!

概要(もしくは感想)

とりあえず何も考えずに動かすことができたので、今更ながらタスク実行までの概要です。

クラスターの作成

クラスターはタスクの集まりのようです。 タスク「実行」ごとにクラスターが選択できるので、タスク「定義」の集まりではないようです。 Fargateを使用したからなのか、クラスターというものの存在意義は正直わからなかったです。

イメージをリポジトリへプッシュ

突然ECRが出てくるので面食らいましたが、 AWSが見に行ける場所にイメージを置く必要があるというのは、考えてみれば至極当然です。 Dockerのタグの使い方についてはまだあまりよくわかっていないので、それは今後の課題としたいと思います。

タスクの定義、実行

タスク定義は、CPUやメモリの大きさなどのインスタンスのサイズを規定して、 どんなコマンドでrunするかなどを設定します。 一方実行時には、実行するクラスターや、VPC・サブネット・セキュリティグループを指定します。

どこまでがタスク「定義」の領分で、どこからがタスク「実行」の領分なのかよくわからず、 「Fargate」か「EC2」かを選ぶ箇所が両方にあるところなどはまだ解せないという感じがしました。 とは言え、まずは両方合わせて一つの「タスク」が構成されていることがわかったので、 ひとまず触るという目標は達成できました。

注意点

ECRのリポジトリには、特に使っていなくても、イメージを置いているだけで課金が発生します。 お試しが終わったら忘れずにイメージを消しておきましょう。

まとめ

Fargateを初めて触ってみました。 Dockerについては、チュートリアルをこなしたとも言えない程度の知識しかありませんが、 とりあえずFargate上でコンテナが動いて、そこでコマンド実行を行えたことが確認できました。

AWSのコンテナ系サービスは色々あり、またアップデートも盛んに発表されていますが、 「Fargate?何それ?美味しいの?」状態だったので、 何はなくとも触ることができてよかったです。 「何ができるサービスなのかわからねぇ」状態だと、 せっかく周りで有益な情報が話されていてもそれに気づくことすらできない (そもそも知らない単語は意識にすら届かない) ので、まずは最初の一歩としてとにかく触ることができ、少し安心しました。

Fargateマスターになったので、次はFargate初心者を目指したいです! 以上、誰かの参考になれば幸いです。


  1. ここに「cm-hirano/test01」とだけ書いていて、動かないない!と悩むことほぼ丸一日(撃沈)