CloudWatchイベントをトリガーにFargateタスクを実行

CloudWatchイベントをトリガーにFargateタスクを実行してみます。Lambdaの実行上限時間で終わらないタスクを実行するのに便利です。ECRにDockerイメージの登録 Fargeteタイプのタスク定義 タスクのスケジュール設定 といった作業を行っていきます。

Dockerイメージを作成

Dockerfileを作成します。

FROM node:10-alpine

ENV SAMPLE_ENV1=abcdefg
ENV SAMPLE_ENV2=1234567

RUN mkdir /app
RUN echo "console.log(process.env); setTimeout(() => { console.log('end')}, 10000);" > /app/index.js

CMD ["node", "/app/index.js"]

Dockerfileからイメージを生成します。

$ docker image build -t sample_fargate_node:latest .

作成したイメージを実行してみます。

$ docker container run sample_fargate_node
{ PATH:
   '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
  HOSTNAME: '755675595ec0',
  NODE_VERSION: '10.15.3',
  YARN_VERSION: '1.13.0',
  SAMPLE_ENV1: 'abcdefg',
  SAMPLE_ENV2: '1234567',
  HOME: '/root' }
end

リポジトリ作成( ECR )

643-aws-fargate-cloudwatch_ecr1.png

リポジトリの作成をクリック

643-aws-fargate-cloudwatch_ecr2.png

namespaceにはAWSアカウントIDが含まれます。

643-aws-fargate-cloudwatch_ecr3.png

後ほど、このURIを利用します。

DockerイメージをECRに登録

ECRに登録するためのイメージを作成

$ docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
sample_fargate_node   latest              822aa745ff11        37 minutes ago      71MB

先ほど作成した リポジトリのURI を指定してイメージを作成します。

$ docker tag sample_fargate_node:latest xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/fargate_test
$ docker image ls
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/fargate_test   latest              822aa745ff11        37 minutes ago      71MB
sample_fargate_node                                              latest              822aa745ff11        37 minutes ago      71MB

ECRにログイン

下記コマンドを実行するとECRへログインするためのコマンドが出力されます。

aws ecr get-login \
--region ap-northeast-1 \
--no-include-email

出力されたコマンドを実行してECRにログインします。

イメージをECRにプッシュ

$ docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/fargate_test

以下のように、イメージを登録できました。

643-aws-fargate-cloudwatch_ecr4.png

Fargate起動タイプのタスクを定義

643-aws-fargate-cloudwatch_task1.png

新しいタスク定義の作成をクリックします。

643-aws-fargate-cloudwatch_task2.png

FARGATEタイプを選択します。

643-aws-fargate-cloudwatch_task3.png

タスク定義名を入力します。

643-aws-fargate-cloudwatch_task4.png

メモリサイズ、CPUサイズを指定後、コンテナの追加をクリックします。

643-aws-fargate-cloudwatch_task5.png

イメージには、ECRで作成した リポジトリURI を指定します。

643-aws-fargate-cloudwatch_task6.png

作成をクリックするとタスク定義が完了します。

Fargateクラスタを作成

643-aws-fargate-cloudwatch_cluster1.png

「ネットワーキングのみ」を選択します

643-aws-fargate-cloudwatch_cluster2.png

クラスター名を入力して、作成をクリックします。

クラスタ上でタスクのスケジュール設定

643-aws-fargate-cloudwatch_task_schedule1.png

タスクのスケジューリングを選択して、作成をクリックします。

643-aws-fargate-cloudwatch_task_schedule2.png

イベントの実行タイミングを設定します。今回は、3分ごとに実行するように設定しました。

643-aws-fargate-cloudwatch_task_schedule3.png

先ほど定義したタスクを選択します。

643-aws-fargate-cloudwatch_task_schedule4.png

ネットワークの設定を行います。サブネットの設定で気をつける点があります(後述)。

643-aws-fargate-cloudwatch_task_schedule5.png

環境変数を上書きすることができます。

設定が完了したら作成をクリックします。

643-aws-fargate-cloudwatch_task_schedule6.png

作成されたリソースを確認できます。

643-aws-fargate-cloudwatch_task_schedule7.png

タスクのスケジューリングを登録できました。

動作確認

CloudWatchイベント

643-aws-fargate-cloudwatch_event.png

この画面から、トリガータイミングなど確認できます。

タスクが実行されてなかった
( 設定修正 )

トリガータイミングになってもCloudWatchでログ出力されなかったので、原因調査します。

タスク一覧ページで Stoppedステータス のタスクを確認します。

643-aws-fargate-cloudwatch_run_ng1.png

STOPPED(Task faild と表示されています。タスクの詳細ページを確認します。

643-aws-fargate-cloudwatch_run_ng2.png

CannotPullContainerError と表示されています。コンテナイメージを取得できなかったようです。

原因としては、ネットワークの設定で、プライベートサブネットを選択したためです。そこで、パブリックサブネットに設定を修正しました。

今度は成功
( 実行結果確認 )

今度はタスクが実行され、以下のようにCloudWatchにログ出力されました。

643-aws-fargate-cloudwatch_run_ok1.png

環境変数が上書きされていることを確認できます。

タスクのスケジューリング機能を停止する

643-aws-fargate-cloudwatch_stop.png

スケジューリング機能を停止するには、チェックを外して、更新をクリックします。

参考