【レポート】Deep Dive into AWS Fargate #reinvent #CON333

2017.12.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

re:Invent2017のセッション「CON333 - Deep Dive into AWS Fargate」を聴講したので、その様子をレポートします。

スピーカーはDan Gerdesmeier(Software Development Manager,AWS)とArchana Srikanta(Sr. Software Dev Engineer,AWS)です。

本セッションは、Scorekeepという○×ゲーム(tic tac toe)のサンプルWebアプリ実行環境の構築を通して、AWS Farfgateのコンポーネントを説明します。

Fargateの構成

Fargateは以下のコンポーネントで構成されます。

  • タスク定義(Task Definition)
  • タスク(Task)
  • サービス(Service)
  • クラスタ(Cluster)

タスク定義

タスク定義では、実行するコンテナのリストおよびコンテナについての定義を記述します。

主な定義項目を見ていきましょう。

CPU、メモリリソース

コンテナに割り当てるCPUとメモリのリソースには、タスクレベルとコンテナレベルの2段階があります。タスクレベルは、タスクに複数のコンテナが定義される場合に全体の割り当て、コンテナレベルは個別のコンテナへの割り当てとして機能します。

CPUはタスクレベルをコンテナでシェアする形で、コンテナレベルで割合を調整できる。

メモリは予約と上限がコンテナレベルで設定できる。

タスクレベルの割り当ては、以下のCPU/メモリの50通りの組み合わせから選択する。

課金はこれに連動する。

プラットフォームバージョン

ランタイム構成を定義するプラットフォームバージョンをタスク定義に指定できる。現在はバージョン1.0.0LATESTは最新バージョンを指す。

ネットワーク

Fargateのネットワーク構成。コンテナはFargateによって作成されるENIを利用して、VPCに配置される。

インターネットからのアクセスのためにパブリックIPを割り当てることができ、セキュリティグループやネットワークACLといったVPCのセキュリティ機能を設定することも可能。

VPCの設定

タスク定義でnetworkModeawsvpcに定義し、タスク実行時に--network-configurationとしてVPCの各パラメータを指定する。

インターネットアクセス

タスクのENIは、コンテナによるトラフィックの送受信のほか、以下の用途でENIを利用する。

  • イメージのPull
  • CloudWatch Logsへのログ書き出し

いずれのエンドポイントへも、ENIからアクセスできる必要がある。そのため、タスクENIからインターネットへの外向きのアクセスが必要で、インターネットからの内向きのアクセスはタスク(コンテナ)の用途によって必要かを判断する。

プライベートタスクのセットアップ

インターネットからの内向きアクセスが不要なプライベートタスクでは、インターネットへの外向きアクセスができるように、VPCにNAT Gatewayをセットアップしルーティングを構成する。

パブリックタスクのセットアップ

インターネットからの内向きアクセスが必要なプライベートタスクではENIをパブリックサブネットに配置し、パブリックIPを付与するassignPublicIp=ENABLEをネットワーク構成に指定する。

ELBのセットアップ

FargateではELBとの連携をサービスでサポートする。ALBとNLBが利用できるが、ALBについては以下の制約がある。

  • ALBは2つの異なるAZにある2つ以上のサブネットを構成すること
  • ALBのサブネットのAZは、タスクのサブネットのAZを含めること
  • ALBターゲットはIPタイプのみ(インスタンスタイプは非対応)

ELBの構成

タスク定義ではコンテナポートを指定し、サービス作成時に--load-balancersとして、紐付けるELBのパラメータを指定する。

Internet-facingなELBでの構成例

パーミッション

Fargateの動作には様々なパーミッションが関係する。

  • クラスタパーミッション : クラスタの操作に係るパーミッション
  • アプリケーションパーミッション : コンテナからAWSリソースにアクセスするパーミッション
  • ハウスキーピングパーミッション : Fargateの動作自体に必要なパーミッション

それぞれについて理解しておく必要がある。

クラスタパーミッション

クラスタに対するIAMポリシーの適用

アプリケーションパーミッション

AWSリソースにアクセスするためのクレデンシャルはタスクロールで付与できる。

AWS CLIやSDKは自動でタスクロールによるクレデンシャルを取得する。クレデンシャルは一時的なもので、定期的にローテーションする。

ハウスキーピングパーミッション

Fargateの動作のために、以下2つのパーミッション付与が必要

  • 実行ロール : ECRのイメージPullやCloudWatch Logのプッシュに使用。タスク定義でロールを指定する
  • ECSサービスリンクロール : FargateがAWSの各サービスを操作するパーミッション。クラスタ作成時に自動で付与される

ログとデバッグ

ECSと同様に、awslogsドライバを利用してCloudWatch Logsにコンテナの標準出力を転送する。

Fargateの管理画面にある[Logs]タブで参照できる

サービスのCloudWatchメトリクスは、[メトリクス]タブからグラフ形式でCPUとメモリの使用率。

タスク(コンテナ)のデバッグとしては、コンテナが予期せず終了する場合は、その終了ステータスを確認します。

タスクの実行中は、[Events]タブからメッセージを確認します。

ストレージ

コンテナレイヤーのために、EBSベースのエフェメラルストレージが最大10GB利用できます。

タスクのコンテナ間のボリュームとして、4GB利用できます。

ScoreKeepのデモ

タスク定義として以下を利用しました。コンテナなフロントエンドとバックエンドの2つを使用します。

(あらかじめ用意した設定ファイル、スクリプトなどを実行してタスク定義やIAMロールなどを構成していく)

続いて、管理コンソールからdefaultクラスタを確認

サービス作成でFARGATEを選択します。

インターネットからアクセスするので、Auto-asign public IPでENABLEDを選択

ロードバランサはALBを選択、コンテナポートも設定します。

一通り作成されました

ENI一覧を確認してみると、Descriptionにecsと入っているENIがいくつかあることがわかります。これらがFargateのコンテナに紐付くものです。

WebブラウザからScoreKeepにアクセスし、ゲームがプレイできています。

このあと、タスクの実行ログなどを確認していました。

所感

Fargateの機能、構成手順について一通り網羅された、良いセッションでした。みなさんもFargateをいろいろいじって、AWSの新しいコンテナ実行サービスを楽しんでみてください!