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 )
リポジトリの作成をクリック
namespaceにはAWSアカウントIDが含まれます。
後ほど、この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
以下のように、イメージを登録できました。
Fargate起動タイプのタスクを定義
新しいタスク定義の作成をクリックします。
FARGATEタイプを選択します。
タスク定義名を入力します。
メモリサイズ、CPUサイズを指定後、コンテナの追加をクリックします。
イメージには、ECRで作成した リポジトリURI
を指定します。
作成をクリックするとタスク定義が完了します。
Fargateクラスタを作成
「ネットワーキングのみ」を選択します
クラスター名を入力して、作成をクリックします。
クラスタ上でタスクのスケジュール設定
タスクのスケジューリングを選択して、作成をクリックします。
イベントの実行タイミングを設定します。今回は、3分ごとに実行するように設定しました。
先ほど定義したタスクを選択します。
ネットワークの設定を行います。サブネットの設定で気をつける点があります(後述)。
環境変数を上書きすることができます。
設定が完了したら作成をクリックします。
作成されたリソースを確認できます。
タスクのスケジューリングを登録できました。
動作確認
CloudWatchイベント
この画面から、トリガータイミングなど確認できます。
タスクが実行されてなかった
( 設定修正 )
トリガータイミングになってもCloudWatchでログ出力されなかったので、原因調査します。
タスク一覧ページで Stoppedステータス
のタスクを確認します。
STOPPED(Task faild
と表示されています。タスクの詳細ページを確認します。
CannotPullContainerError
と表示されています。コンテナイメージを取得できなかったようです。
原因としては、ネットワークの設定で、プライベートサブネットを選択したためです。そこで、パブリックサブネットに設定を修正しました。
今度は成功
( 実行結果確認 )
今度はタスクが実行され、以下のようにCloudWatchにログ出力されました。
環境変数が上書きされていることを確認できます。
タスクのスケジューリング機能を停止する
スケジューリング機能を停止するには、チェックを外して、更新をクリックします。