テクノロジー

【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ロールに割り当てます。

image.png

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

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

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

image.png

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

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

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

image.png

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

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

image.png

  • こちらはすでにイメージを作成済みのため、実行しなくてOK

image.png

  • そのまま実行してもよいし、お好きなタグに変更してもOK
    • 何もエラーが出ない事を確認

image.png

  • そのまま実行
    • いろんなリソースが「Pushed」されればOK

image.png

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

image.png

タスク定義を作成する

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

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

image.png

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

image.png

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

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

image.png

よく使う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月時点の内容です。

テクノロジーの記事一覧
タグ一覧
TOPへ戻る