【レポート】Deep Dive into AWS Fargate #reinvent #CON333
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.0
。LATEST
は最新バージョンを指す。
ネットワーク
Fargateのネットワーク構成。コンテナはFargateによって作成されるENIを利用して、VPCに配置される。
インターネットからのアクセスのためにパブリックIPを割り当てることができ、セキュリティグループやネットワークACLといったVPCのセキュリティ機能を設定することも可能。
VPCの設定
タスク定義でnetworkMode
をawsvpc
に定義し、タスク実行時に--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の新しいコンテナ実行サービスを楽しんでみてください!