🐤

[ECS on Fargate編]コンテナをAWS上で動かす方法を学ぼう

に公開

はじめに

前回でECRにコンテナのイメージを送信する方法を学ぶことができました。
https://zenn.dev/ai_tech/articles/103bfa5dbc1bac

今回はそのコンテナをAWS上で動かしてみるということを行っていきます。

ECSでクラスターを作成してみよう

AWSコンソール上でECSを開いてみましょう。

まだ何も作成していないので、クラスターのところを開いて
新しくクラスターを作成していきましょう。

クラスターの作成でクラスター名を付けてmy-fargate-clusterを記載します。

そして、インフラストラクチャ(実行基盤)の選択でFargateを選択します。


これでECS上に「コンテナを動かせる環境(空の土台)」を作ることができました!

ECSでタスク定義を作成してみよう

タスク定義はECSでタスクを動かすためのルールを定義する作業になります。
ここで私たちは前回登場したECRのコンテナイメージを設定することができます。

コンテナをどんな設定で、どんな環境で、どんなリソースで動かすか、そのルールをまとめたものがタスク定義です。ここからタスクを作成できるわけですね。

新しいタスク定義の作成という箇所からタスク定義を作成してみましょう。

次に以下のようなタスク定義作成画面が表示されると思います。
ここからタスク定義を作成していきます。

  1. タスク定義ファミリー
    これはつまり、アプリを動かす設計書の名前です。

  2. インフラストラクチャの要件
    ここで、どんな実行環境で動かすか を決めます。
    選んだのはAWS Fargate
    サーバーレスでコンテナを動かすモードです。

  3. コンテナ設定
    タスク定義の中で、どんなコンテナを動かすかを細かく設定する部分です。


ここでの設定のイメージURIは前回にECRにプッシュしたものを選択できます。

あとの設定はデフォルトのままでいいので一番下の作成まで進んでみましょう。

作成を押下することでタスク定義が追加されたことが確認できるかと思います。

ECSでサービスを作成してみよう

そしたら次はクラスターにあるサービスを作成してみましょう。
サービスはタスクを自動的に起動・監視して、常に指定数を動かし続ける管理者みたいなやつです。

ECS サービス作成をしていきますが、このサービスというのは
どうやらタスクを安定して動かし続けるための自動運用機能のようです。

必要な項目を設定して記載していきましょう。

そうしてサービスを開始してみると最初自分はエラーにぶつかりました。😇

エラーの内容は以下でした。

つまり、ネットワークの問題でした。そのためサービスの設定項目にある
ネットワークについてしっかり確認しておきましょう。

自分の失敗はシンプルに
コンテナのイメージをPullしてくる対象のVPC外にいるECRに到達できないということでした。

自分の場合は前にインターネットゲートウェイをVPCからデタッチしてしまっていたので外部インターネットへの出口がなくなっていました。

以下のような構成にすることでしっかりとECSタスクはECRに接続できるようになります。

今回はあくまでコンテナの練習なので、Private Subnetを使わずシンプルな方のPublic Subnet配置に作成します。


そこにPublic用のサブネットを作成しておきます。

その後インターネットゲートウェイも作成してVPCにアタッチしてみます。

そしてルートテーブルにルート: 0.0.0.0/0 → インターネットゲートウェイ を追加をします。

これでサービスが正常に動作し始めました!

あとはサービス → タスク をクリックしてタスク詳細画面のネットワーキングセクションにある
 パブリックIPアドレスを確認してアクセスします。

ただこれで行けると思いきや自分の場合はまたエラーがでました😇

これはつまり、自分達が動かしているタスクにアクセスするためにここからのアクセスは許可するでー
みたいな設定をしておらずアクセスが拒否されていたということでした。

つまり、コンテナへのアクセスができるユーザーをセキュリティグループのインバウンドルールに設定を加えておく必要があります。

そのインバウンドルールを設定するセキュリティグループはタスクに紐づいているENIに設定します。

ここでインバウンドルールに自分のIPからのアクセスを許可することで、タスクへの通信制御を突破することができます。

この設定を行うことでようやくクラウド上のコンテナにアクセスできました!

まとめ

自分の今までの理解をdraw.ioで可視化してみました。
あくまで練習用なのでPublic Subnetに構築していますが、セキュリティを本番用にするとかを考えるとPrivate SubnetにおいてVPCエンドポイントというのを使うのが良いのだと思います。

Discussion