🔥

AWSハンズオンECS+Fargateを触ってみた

2022/11/26に公開

今回もAWSハンズオンの初心者チュートリアルをやってみました。
行ったハンズオンはこちらです

ハンズオンで使うサービスの無料枠

  • ECR: 基本的に無料
  • ECS+Fargate: Fargateに無料枠が無い。起動時間分の料金が発生する。
    ※このチュートリアルは無料枠ありのAWSアカウントでも合計で300円ぐらいかかりました。

ハンズオンの構成図

ECSの概念図

ECSとは
何のコンテナをどう動かすのか命令を出すためのサービス
Fargateとは
コンテナそのものを動かすためのサービス

ECSの4つ概念

  • クラスター: コンテナを動かすための論理的グループ
  • サービス: コンテナをコントロールする設定(どれくらい動かすのか等)。ELBと連携
  • タスク: 実際に稼働するコンテナ群
  • タスク定義: コンテナの設定

構築手順

  1. 環境構築(チュートリアルではCloud9を使う)
    • dockerがインストールされてること
  2. コンテナイメージを作成する
    • Dockerfileの作成
    • コンテナイメージの作成($ docker build)
    • コンテナイメージを動かす($ docker run)
    • コンテナイメージの中に入るには?($ docker exec)
# 基イメージ(Docker Hubで公開されている)
FROM ubuntu:18.04

# コンテナで利用するアプリケーションのインストールする
RUN apt-get update && \
 apt-get -y install apache2
 
RUN echo 'Hello World!' > /var/www/html/index.html

# Apache HTTP Serverを起動するためのシェルスクリプトの作成
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
 echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
 echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
 echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
 chmod 755 /root/run_apache.sh
 
# コンテナが利用するポート番号
EXPOSE 80
# コンテナ実行時に動かすコマンド
CMD /root/run_apache.sh
  1. コンテナイメージをECRにアップロードする
    ECRとは...
    コンテナイメージを保存・管理するマネージドサービス

    • プライベートリポジトリを作成する
    • コンテナイメージをECRにアップロードする($ docker push)
      ※アップロード方法は公式ドキュメント参照
  2. VPCの作成

    • VPC: 1つ
    • AZ: 2つ
    • Public Subnet2つ
    • SG: ssh, httpのインバウンドルール
  3. クラスター作成

    • vpc, subnetの指定
  4. タスク定義の作成

    • 動かすコンテナイメージを指定する(ECRのコンテナイメージURI)
    • アプリケーション環境の設定(AWS Fargate)
    • CPU, Memoryの設定(デフォルト:1vCPU, 3GB)
  5. サービスの作成
    ※クラスターに直接タスクを配置することもできるが、タスク数の指定やタスクの自動調整機能がサービスに備わってるため基本的にサービスは作成する

    • タスク定義を指定
    • 必要なタスクを設定(今回は2個)
    • ELBの設定(デフォルトはnoneだが今回は設定)
      • リスナーのポート: 80, プロトコル: http
      • ターゲットグループの作成, プロトコル: http
    • ネットワーキングの設定
      • vpc, subnet, sgの指定

サービスのDNS名をブラウザに入力すると「hello world!」が表示されてることを確認できる

  1. 疑似障害を発生させ、タスクが自動復旧するかどうかのテスト
    • 下のスクリプトで1秒に一回リクエストを流し続ける
    • タスクを停止する
    • 自動的にタスクが生成されることを確認する
$ url=http://${サービスのDNS名}
$ while true; do TZ=JST-9 date; curl $url; sleep 1s; done
  1. コンテナの数をスケールアウトする(増やしたり減らしたり)
    • サービスを編集し、必要なタスク数を3に変更する
    • 自動的にタスクが生成されることを確認する

削除

  • ALB
  • Target Group
  • ECS ServiceのTaskを0に変更
  • ECS Serviceの削除
  • ECS Clusterの削除
  • VPCの削除
  • ECRの削除
  • Cloud9の削除

まとめ

Dockerを使うことでローカル、ステージング、本番環境で生じる環境依存の問題から解放されるメリットは大きい。
Dockerの学習コストはあるが今後VMよりもコンテナが主流になるのであれば優先度を上げて勉強する必要があると感じた。
しかしFargateは無料枠が無いので手を動かしての学習がしずらい。。ひとまずECS+EC2の環境でいいかな

Discussion