ホーム
記事一覧
プライバシーポリシー
免責事項
お問い合わせ

前処理の日時処理をFargateのスケジュール起動で試してみた

2020-04-11

今回はAWSでコンテナを扱うサービスについて調べた内容をまとめます。

具体的にはECS、ECR、Fargateについてです。

調べた理由はAWS Lambdaで難しい処理を行うのにコンテナを使った方法がよいと思ったからです。

やりたい処理はテキストの前処理です。最近取り組んでいるツイート分析システムで紹介したGiNZAを使った前処理を行うにはLambdaでは制限に引っかかって無理でした。

過去記事は以下になります。

※ 情報が古かったり、間違い等がある場合があります。

ECSとは

ECSとはコンテナを管理するサービスです。よくコンテナオーケストレーションサービスなどとも呼ばれます。

複数のコンテナを手動で管理するのは大変なのでECSのようなオーケストレーションサービスが使われます。

ECSでは以下のような構造でコンテナを管理します。

  • ECS
    • クラスター
      • サービス
      • タスク定義

クラスターというのは、サービスやタスク定義をまとめる単位です。

次にサービスは複数のコンテナを管理する単位です。例えば、Auto Scaling などでコンテナ数をコントールするのはサービスで管理できます。

タスク定義というのが実際のコンテナの設定部分です。 コンテナイメージはECRにアップされているものを指定します。

Fargateとは

公式ではコンテナ向けサーバレスコンピューティングエンジンと言われています。

コンテナを使うにはコンテナをのせる場所が必要です。AWSではコンテナをのせる場所としてEC2かFargateを選択することができます。

EC2の場合はEC2の管理もしなくてはいけないというのがデメリットでしたが、Fargateの場合はホストマシンの管理が不要になります。

特別な理由がなければEC2よりFargateを使った方が楽です。ただし、料金についてはEC2のほうがスペックあたりで比較すると割安です。

Fargateの料金は利用するメモリとCPUごとに値段が設定されており、それらの稼働時間によって計算されます。

詳しい料金は公式サイトに記載されてます。

Fargate Spot

最近でたのがこのFaragate Spot。

EC2のスポットインスタンスのようなものです。

なんとFargate価格から最大70%割引で利用できるとのこと。

EC2のスポットインスタンス同様に起動したタスクが中断される可能性があります。

Fargate Spotについては情報が少ないですが、クラメソさんの記事が参考になります。

Fargateの使い方

コンテナを実行するまでの流れは以下になります。今回はサービスを使わずに単体のタスクをFargateで起動することを想定しています。

Fargate 使い方

図にあるECRはDockerコンテナレジストリです。DockerHubのAWS版です。あらかじめECRでリポジトリで作成し、ローカルからDockerイメージをECRにpushします。

今回使用するイメージのDockerfileは以下です。

# ベースとなるDockerイメージ指定
FROM python:3.7.7

# python package
RUN pip install --upgrade pip
RUN pip install pandas wordcloud emoji neologdn boto3
RUN pip install -U ginza

COPY ./preprocess/ /home/work

# コンテナログイン時のディレクトリ指定
WORKDIR /home/work/

CMD ["sh", "init.sh"]

このDockerfileについては、以下の記事に書いてある内容を少し変えただけなので、よければ参考にしてください。

また、公式ドキュメントにも詳しいFargateに関する情報が記載されています。

クラスター作成

AWSコンソールからECSを選択します。ECSではまずクラスターを作成します。

Fargate 使い方

今回はAuto Scalingを使わないので左上のネットワーキングのみを選択します。

次はクラスター名などを決めます。クラスターはこれだけで終わりです。

Fargate 使い方

タスク定義

続いてタスク定義を行います。ECSからタスク定義のページにいき、新しいタスク定義の作成を選択します。

まず起動タイプはFargateを選択します。

タスク定義

あとは、タスク実行ロールと必要なメモリとCPUを指定します。メモリとCPUはあとから簡単に変更できるので適当で大丈夫です。ECSのクラスターからメトリクスが見れるので、CPUの使用率などをみて調整すると無駄のない調整ができます。

そのあとは、コンテナの追加からECRにあるイメージを指定して完了です。

タスク定義

注意として、タスク実行ロールにはコンテナで実行する処理に必要なロールを割り当てる必要があります。例えば、今回はS3にアクセスする処理があるのでS3のアクセス権が必要です。

コンテナ定期実行

作成したクラスターを選択し、そこからタスクのスケジューリングを選び、作成を押下します。

まずスケジュールの実行間隔を定義します。やり方はCloudWatch Eventsと同じです。

タスクのスケジューリング

その下でスケジュールで実行するターゲットを指定します。

Fargate 使い方

起動タイプはFargateで、さきほど作成したタスク定義を選択します。

Fargate 使い方

セキュリティグループやVPCを選びます。新しいVPCを作成していなければデフォルトのVPCで大丈夫です。サブネットはプライベートなものを選択します。

画像ではパブリックIPがDISABLEDになっていますが、ENABALEDにしないとタスクが実行されませんでした。

boto3は使える?

ローカルでboto3を使う場合はaws cliをdockerコンテナで使えるように認証を設定する必要があったので、ECSでboto3を使う場合も必要なのか疑問でした。

結論としては、コンテナにaws cliのインストールや認証情報の設定は必要なかったです。適切なロールを作成し、タスクに設定すれば大丈夫なようです。

ただ、ローカルでの検証時には認証情報が必要になるので、コンテナに認証情報をなんらかの方法で渡す必要があります。

感想

Fargateが思っていたよりも安く使い勝手がよく驚きました。

普段からDockerを使って環境構築を行っていたので簡単に利用開始できたのもよかったです。

気になっているのはFargate Spotがタスクのスケジュール実行で利用できているのかです。 一応キャパシティープロバイダーでFargate spotのBaseを1にしてFargateのほうを0にしてみました。 ログにはどちらのインスタンスが使われたのかが見当たらなかったので料金から逆算するしかないのかなーと考えてます。