2022/11/16

テクノロジー

【ECS+Docker入門】ECS FargateでPythonファイルをうごかしてみる

この記事の目次

    はじめに

    社内の開発PJにて、現在EC2で稼働中のPython(およびシェルスクリプト)ファイルをFargate化するタスクを担当してます。

    これまでDockerやECS(Fargate)を触ったことがなかったので、試しに hello_world.py をECS Fargate で実行してみるってところから始めたので、その備忘録になります。

    サーバの用意

    Docker環境用のサーバを用意します。
    本備忘録ではEC2を使用しています。

    Pythonファイルの用意

    "Hello World"の文字列を返すだけのPythonファイルを用意します。

    # hello_world.py
    print("hello_world")

    実行できる事を確認

    [ec2-user@ip-172-31-0-42 ~]$ python3 hello_world.py 
    hello_world

    Docker環境の用意

    ECS Fargate は AWSが用意する コンテナ サービスになります。
    コンテナはアプリケーションの環境を効率的に構築できる技術で、それを管理するツールとして Docker が広く利用されています。

    ※Docker以外のコンテナ管理ツールは、Podman/Skopeo/Buildahがあげられるようです。

    Dockerに触れたことがない方は、以下の記事を読んでみる事をおススメします。
    すごくわかりやすいです。

    Dockerをインストールする

    EC2に以下コマンドでDockerをインストール・起動します。

    # dockerインストール
    $ sudo yum install docker
    
    # docker起動
    $ sudo systemctl start docker
    
    # サーバを再起動してもdockerが起動している(active)状態にする
    $ sudo systemctl enable docker
    
    # dockerの状態確認
    $ systemctl status docker
    ★active状態になっていればOK

    Dockerfileの作成

    コンテナを起動する(今回の場合、Pythonを動かす)ためには、Docker イメージ を作成する必要があります。
    ※Dockerイメージとは、コンテナを起動する上でのテンプレートファイルです。

    Dockerイメージを作成するためには、その設計書となる Dockerfile が必要となるため、こちらを作成します。

    #Dockerfile
    # python イメージをベースにする
    FROM python:2.7-slim-buster
    COPY hello_world.py hello_world.py
    CMD python hello_world.py

    ※Dockerfileは今回の場合、hello_world.pyと同じ階層に設置します(別の階層にする場合は、COPY の ファイル名の前にパスを指定する必要があります)

    Docker環境でpythonファイルを動かす

    作成した Dockerfile をもとにDockerイメージを作成し、イメージからコンテナを起動(Pythonファイルを動か)します。

    Dockerfileが存在するディレクトリでDockerイメージを作成します。

    $ docker build -t hello_world .

    作成したDockerイメージを確認します。

    $ docker images
    ★REPOSITORY に hello_world があればOK

    Dockerイメージをもとにコンテナを起動します。

    docker run hello_world
    ★「hello_world」が返ってくればOK

    ECS Fargate でPythonを動かす

    Dockerイメージが作成できたので、ECS Fargate上でPythonファイルを動かしてみます。

    EC2のIAMロールにECRアクセス用のポリシーを割り当てる

    以下の「ECRに作成したイメージをプッシュ」を行うためには、EC2にECRアクセス用のIAM Roleを割り当てる必要があります。

    以下画像の通り、ECRアクセス用ポリシー(AmazonEC2ContainerRegistryFullAccess)をEC2のIAMロールに割り当てます。

    ECRに作成したイメージをプッシュ

    イメージの格納先として、Amaozon ECRを利用します。

    AWSマネジメントコンソールから「ecr」と検索し、リポジトリを選択します。

    「リポジトリを作成」を押下し、以下のように設定し、リポジトリを作成します。

    • 可視性設定
      • プライベート
    • リポジトリ名
      • iy-test-repository

    以下のようにリポジトリが作成されたら、「プッシュコマンドの表示」にて表示されるコマンドをEC2(Docker環境)にて実行します

    • EC2(Amazon Linux)上で実行するため「macOS / Linux」を選択
    • 1.のDockerクライアント認証については、そのまま実行
      • 「Login Succeeded」が返ってきたらOK

    ※上記で対応した、IAMロールにECRアクセス用のポリシーを割り当てていないとうまく認証ができません。

    • こちらはすでにイメージを作成済みのため、実行しなくてOK
    • そのまま実行してもよいし、お好きなタグに変更してもOK
      • 何もエラーが出ない事を確認
    • そのまま実行
      • いろんなリソースが「Pushed」されればOK

    リポジトリ内にイメージがプッシュされればOK
    ※「イメージのURI」の情報は後で使います

    タスク定義を作成する

    タスク定義 ではイメージからコンテナを作成するための定義を定められます。
    https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definitions.html

    それでは、やっていきます。
    マネジメントコンソールのECSからタスク定義を選択し、「新しいタスク定義の作成」を押下します。

    • 起動タイプに「FARGATE」を選択する
    • コンテナの定義を設定する
      • タスク定義名
        • iy-test-task-definition
      • タスクメモリ(GB)
        • 0.5GB(最小スペック)
      • タスク CPU(vCPU)
        • 0.25 vCPU(最小スペック)
      • コンテナの追加
        • 以下画像の通りに指定
          • コンテナ名
            • iy-test-container
          • イメージ
            • 上で取得した「イメージのURI」をコピペ

    作成を押下し、タスク定義が作られていればOK

    クラスターを作成し、Pythonファイルを実行

    ECSからクラスターを選択し、「クラスターの作成」を押下します。

    • クラスターテンプレートに「ネットワーキングのみ」を選択する
    • クラスターの設定をする
      • クラスター名
        • iy-test-cluster

    作成したクラスターから「作成」を押下

    • サービスの設定をする
      • 起動タイプ
        • FARGATE
      • タスク定義
        • iy-test-task-definitionを選択
      • サービス名
        • iy-test-service
      • タスクの数
        • 1
    • ネットワーク構成を設定する
      • クラスターVPC
        • 適当なVPCを選択
      • サブネット
        • 適当なサブネットを選択
    • Auto Scaling(オプション)
      • 「サービスの必要数を直接調整しない」を選択

    確認画面にて設定を確認し、「サービスの作成」を押下すると、サービス・タスクが表示されます。

    タスクの詳細から「ログ」を開くと、hello_worldが返ってきている事を確認できます。

    よく使うDockerコマンド

    頻繁に利用するDockerコマンドを紹介します。
    他にも色々なコマンドがあるので、気になる方はぜひ調べてみてください!

    ▼dockerイメージの作成(ビルド)

    $ docker build 

    ▼既存のdockerイメージ一覧を確認

    $ docker images

    ▼イメージからコンテナを起動

    $ docker run <イメージ>

    ▼起動中のコンテナ一覧を確認

    $ docker ps
    ★「docker ps -a」とすると、起動していないコンテナも含めて確認できる

    ▼既存のコンテナの削除

    $ docker rm <CONTAINER ID>

    ▼dockerイメージの削除

    $ docker rmi <IMAGE ID>
    ★「docker rmi -f <IMAGE ID> ...」とすると複数のイメージを一気に削除できる

    参考

    https://dev.classmethod.jp/articles/amazon-ecr-ecs-fargate

    ※本記事は2022年11月時点の情報です。

    著者:マイナビエンジニアブログ編集部