テクノロジー
【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入門(第一回)~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を選択
- サブネット
- 適当なサブネットを選択
- クラスター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月時点の内容です。