Amazon Web Services ブログ
AWS Fargate はシーク可能な OCI を使用してより高速なコンテナ起動を可能に
コンテナを使った開発は、アプリケーションのデプロイとスケーリングの方法としてますます人気が高まっていますが、まだ改善の余地がある分野があります。コンテナ化されたアプリケーションのスケーリングに関する主な問題の 1 つは、起動時間が長いことです。特に、新しいインスタンスを追加する必要があるスケールアップ時にそれが言えます。この問題は、例えばウェブサイトをスケールアウトしてトラフィックを増やす必要がある場合など、カスタマーエクスペリエンスに悪影響を及ぼす可能性があります。
ある研究論文によると、コンテナイメージのダウンロードはコンテナの起動時間の 76% を占めていますが、コンテナが有用な作業を開始するのに必要なデータは平均で 6.4% にすぎません。コンテナ化されたアプリケーションを起動してスケールアウトするには、リモートコンテナレジストリーからコンテナイメージをダウンロードする必要があります。これにより、アプリケーションを起動する前にイメージ全体をダウンロードして解凍する必要があるため、大きな遅延が発生する可能性があります。
この問題の解決策の 1 つは、コンテナイメージの遅延読み込み (非同期読み込みとも呼ばれる) です。この方法では、アプリケーションの起動と並行してコンテナレジストリからデータをダウンロードします。例えば、コンテナ全体の起動時間を短縮することを目的としたプロジェクトである stargz-snapshotter などです。
昨年、Amazon Web Services (AWS) がオープンソース化したテクノロジーである Seekable OCI (SOCI) を導入しました。これにより、コンテナランタイムにコンテナイメージの遅延読み込みを実装して、コンテナイメージを変更せずにアプリケーションをより速く起動できます。その取り組みの一環として、SOCI Snapshotter をオープンソース化しました。これは、containerd 内の SOCI による遅延読み込みを可能にするスナップショットプラグインです。
SOCI 向け AWS Fargate のサポート
7月17日、AWS Fargate が Seekable OCI (SOCI) をサポートするようになったことを発表しました。SOCI は、コンテナイメージ全体のダウンロードを待たずにコンテナを起動できるようにすることで、アプリケーションのデプロイとスケールアウトを高速化します。リリース時には、この新機能は AWS Fargate で実行される Amazon Elastic Container Service (Amazon ECS) アプリケーションで使用できます。
AWS Fargate の SOCI サポートの仕組みを簡単にご紹介します。
SOCI は、既存のコンテナイメージ内にファイルのインデックス (SOCI index) を作成することで機能します。このインデックスは、イメージ全体をダウンロードすることなくコンテナイメージから個々のファイルを抽出する機能を提供し、コンテナをより速く起動するための重要なコンポーネントです。アプリケーションはその実行を開始する前に、コンテナイメージのプルと解凍が完了するのを待つ必要がなくなります。これにより、アプリケーションをより迅速にデプロイおよびスケールアウトでき、アプリケーション更新のロールアウト時間を短縮できます。
SOCI インデックスは、コンテナイメージとは別に生成され、保存されます。つまり、コンテナイメージを SOCI を使用するように変換する必要がないため、コンテナイメージ署名などのセキュアハッシュアルゴリズム (SHA) ベースのセキュリティが侵害されることはありません。その後、インデックスはコンテナイメージと一緒にレジストリに保存されます。リリース時には、AWS Fargate の SOCI サポートは Amazon Elastic Container Registry (Amazon ECR) と連携しています。
Amazon ECS と AWS Fargate を併用して SOCI インデックス付きのコンテナ化されたイメージを実行すると、AWS Fargate はイメージの SOCI インデックスが存在するかどうかを自動的に検出し、イメージ全体がプルされるのを待たずにコンテナを起動できます。これはまた、AWS Fargate は SOCI インデックスのないコンテナイメージを引き続き実行することになります。
それでは、始めましょう
コンテナイメージの SOCI インデックスを作成するには 2 つの方法があります。
- AWS SOCI インデックスビルダーの使用 – AWS SOCI インデックスビルダーは、AWS クラウド内のコンテナイメージをインデックス化するためのサーバーレスソリューションです。この AWS CloudFormation スタックは、Amazon EventBridge ルールをデプロイして Amazon ECR アクションイベントを識別し、定義されたフィルターと一致するように AWS Lambda 関数を呼び出します。次に、別の AWS Lambda 関数が SOCI インデックスを生成して Amazon ECR レジストリのリポジトリにプッシュします。
- SOCI インデックスの手動作成 – この方法では、Amazon ECR リポジトリ内の既存のコンテナイメージなど、SOCI インデックスの作成方法に柔軟性を持たせることができます。SOCI インデックスを作成するには、soci-snapshotter プロジェクトで提供される
soci
CLI を使用できます。
AWS SOCI インデックスビルダーでは、コンテナイメージ用の SOCI インデックスを開始して構築するためのプロセスを自動化できます。soci
CLI を使用すると、インデックス生成に関する柔軟性が向上し、インデックス生成を CI/CD パイプラインにネイティブに統合できます。
この記事では、soci-snapshotter
プロジェクトの soci
CLI を使用して SOCI インデックスを手動で生成します。
リポジトリの作成とコンテナイメージのプッシュ
まず、AWS CLI を使用してコンテナイメージ用に pytorch-soci
という名前の Amazon ECR リポジトリを作成します。
$ aws ecr create-repository --region us-east-1 --repository-name pytorch-soci
Amazon ECR URI の出力を保持し、それを変数として定義して、次のステップでリポジトリを参照しやすくします。
$ ECRSOCIURI=xyz.dkr.ecr.us-east-1.amazonaws.com/pytorch-soci:latest
サンプルアプリケーションでは、AWS Deep Learning Containers の PyTorch トレーニング (CPU ベース) コンテナイメージを使用します。デフォルトでは、Docker Engine はコンテナイメージを containerd イメージストアではなく Docker Engine イメージストアに保存するため、nerdctl
CLI を使用してコンテナイメージをプルします。
$ SAMPLE_IMAGE="763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04"
$ aws ecr get-login-password --region us-east-1 | sudo nerdctl login --username AWS --password-stdin xyz.dkr.ecr.ap-southeast-1.amazonaws.com
$ sudo nerdctl pull --platform linux/amd64 $SAMPLE_IMAGE
次に、前のステップで作成したリポジトリのコンテナイメージにタグを付けます。
$ sudo nerdctl tag $SAMPLE_IMAGE $ECRSOCIURI
次に、コンテナイメージを ECR リポジトリにプッシュする必要があります。
$ sudo nerdctl push $ECRSOCIURI
この時点で、コンテナイメージは既に Amazon ECR リポジトリにあります。
SOCI インデックスの作成
次に、SOCI インデックスを作成する必要があります。
SOCI インデックスは、コンテナイメージの遅延読み込みを可能にするアーティファクトです。SOCI インデックスは、1) SOCI インデックスマニフェストと 2) 一連の zTOC で構成されます。以下の画像は、SOCI インデックスマニフェストのコンポーネントと、それがコンテナイメージマニフェストを参照する方法を示しています。
SOCI インデックスマニフェストには、zTOC のリストと、マニフェストが生成された画像への参照が含まれています。zTOC、つまり圧縮データの目次は、次の 2 つの部分で構成されています。
- TOC は、ファイルのメタデータと解凍された TAR アーカイブ内の対応するオフセットを含む目次です。
- zInfo は、レイヤー内のさまざまなポイントにおける圧縮エンジンの状態を表すチェックポイントのコレクションです。
概念と用語の詳細については、soci-snapshotter
の用語ページをご覧ください。
SOCI インデックスを作成する前に、soci
CLI をインストールする必要があります。soci
のインストール方法の詳細については、soci-snapshotter の開始方法をご覧ください。
SOCI インデックスを作成するには、soci create
コマンドを使用します。
$ sudo soci create $ECRSOCIURI
layer sha256:4c6ec688ebe374ea7d89ce967576d221a177ebd2c02ca9f053197f954102e30b -> ztoc skipped
layer sha256:ab09082b308205f9bf973c4b887132374f34ec64b923deef7e2f7ea1a34c1dad -> ztoc skipped
layer sha256:cd413555f0d1643e96fe0d4da7f5ed5e8dc9c6004b0731a0a810acab381d8c61 -> ztoc skipped
layer sha256:eee85b8a173b8fde0e319d42ae4adb7990ed2a0ce97ca5563cf85f529879a301 -> ztoc skipped
layer sha256:3a1b659108d7aaa52a58355c7f5704fcd6ab1b348ec9b61da925f3c3affa7efc -> ztoc skipped
layer sha256:d8f520dcac6d926130409c7b3a8f77aea639642ba1347359aaf81a8b43ce1f99 -> ztoc skipped
layer sha256:d75d26599d366ecd2aa1bfa72926948ce821815f89604b6a0a49cfca100570a0 -> ztoc skipped
layer sha256:a429d26ed72a85a6588f4b2af0049ae75761dac1bb8ba8017b8830878fb51124 -> ztoc skipped
layer sha256:5bebf55933a382e053394e285accaecb1dec9e215a5c7da0b9962a2d09a579bc -> ztoc skipped
layer sha256:5dfa26c6b9c9d1ccbcb1eaa65befa376805d9324174ac580ca76fdedc3575f54 -> ztoc skipped
layer sha256:0ba7bf18aa406cb7dc372ac732de222b04d1c824ff1705d8900831c3d1361ff5 -> ztoc skipped
layer sha256:4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888 -> ztoc sha256:0b4d78c856b7e9e3d507ac6ba64e2e2468997639608ef43c088637f379bb47e4
layer sha256:089632f60d8cfe243c5bc355a77401c9a8d2f415d730f00f6f91d44bb96c251b -> ztoc sha256:f6a16d3d07326fe3bddbdb1aab5fbd4e924ec357b4292a6933158cc7cc33605b
layer sha256:f18dd99041c3095ade3d5013a61a00eeab8b878ba9be8545c2eabfbca3f3a7f3 -> ztoc sha256:95d7966c964dabb54cb110a1a8373d7b88cfc479336d473f6ba0f275afa629dd
layer sha256:69e1edcfbd217582677d4636de8be2a25a24775469d677664c8714ed64f557c3 -> ztoc sha256:ac0e18bd39d398917942c4b87ac75b90240df1e5cb13999869158877b400b865
上の出力から、soci
CLI が 4 つのレイヤーの zTOC を作成したことがわかります。つまり、コンテナイメージを起動する前に、これら 4 つのレイヤーだけが遅れてプルされ、他のコンテナイメージレイヤーは完全にダウンロードされます。これは、非常に小さなコンテナイメージレイヤーの遅延読み込みの方が、起動時間への影響が少ないためです。ただし、soci create
を実行するときに --min-layer-size
フラグを使用してこの動作を設定できます。
SOCI インデックスの検証とプッシュ
soci
CLI には、生成された SOCI インデックスの確認に役立つコマンドもいくつか用意されています。
すべてのインデックスマニフェストのリストを表示するには、次のコマンドを実行します。
$ sudo soci index list
DIGEST SIZE IMAGE REF PLATFORM MEDIA TYPE CREATED
sha256:ea5c3489622d4e97d4ad5e300c8482c3d30b2be44a12c68779776014b15c5822 1931 xyz.dkr.ecr.us-east-1.amazonaws.com/pytorch-soci:latest linux/amd64 application/vnd.oci.image.manifest.v1+json 10m4s ago
sha256:ea5c3489622d4e97d4ad5e300c8482c3d30b2be44a12c68779776014b15c5822 1931 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04 linux/amd64 application/vnd.oci.image.manifest.v1+json 10m4s ago
オプションですが、zTOC のリストを確認する必要がある場合は、次のコマンドを使用できます。
$ sudo soci ztoc list
DIGEST SIZE LAYER DIGEST
sha256:0b4d78c856b7e9e3d507ac6ba64e2e2468997639608ef43c088637f379bb47e4 2038072 sha256:4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
sha256:95d7966c964dabb54cb110a1a8373d7b88cfc479336d473f6ba0f275afa629dd 11442416 sha256:f18dd99041c3095ade3d5013a61a00eeab8b878ba9be8545c2eabfbca3f3a7f3
sha256:ac0e18bd39d398917942c4b87ac75b90240df1e5cb13999869158877b400b865 36277264 sha256:69e1edcfbd217582677d4636de8be2a25a24775469d677664c8714ed64f557c3
sha256:f6a16d3d07326fe3bddbdb1aab5fbd4e924ec357b4292a6933158cc7cc33605b 10152696 sha256:089632f60d8cfe243c5bc355a77401c9a8d2f415d730f00f6f91d44bb96c251b
このシリーズの zTOC には、SOCI がレイヤー内の特定のファイルを見つけるために必要な情報がすべて含まれています。各レイヤーの zTOC を確認するには、前述の出力のダイジェスト合計のいずれかを使って、次のコマンドを使用します。
$ sudo soci ztoc info sha256:0b4d78c856b7e9e3d507ac6ba64e2e2468997639608ef43c088637f379bb47e4
{
"version": "0.9",
"build_tool": "AWS SOCI CLI v0.1",
"size": 2038072,
"span_size": 4194304,
"num_spans": 33,
"num_files": 5552,
"num_multi_span_files": 26,
"files": [
{
"filename": "bin/",
"offset": 512,
"size": 0,
"type": "dir",
"start_span": 0,
"end_span": 0
},
{
"filename": "bin/bash",
"offset": 1024,
"size": 1037528,
"type": "reg",
"start_span": 0,
"end_span": 0
}
---Trimmed for brevity---
ここで、次のコマンドを使用して、すべての SOCI 関連のアーティファクトを Amazon ECR にプッシュする必要があります。
$ PASSWORD=$(aws ecr get-login-password --region us-east-1)
$ sudo soci push --user AWS:$PASSWORD $ECRSOCIURI
Amazon ECR リポジトリにアクセスすると、インデックスが作成されていることを確認できます。ここでは、コンテナイメージの横に、SOCI インデックスと イメージインデックスという 2 つの追加オブジェクトがリストされていることがわかります。イメージインデックスにより、AWS Fargate はコンテナイメージに関連付けられた SOCI インデックスを検索できます。
SOCI パフォーマンスについて
SOCI の主な目的は、コンテナ化されたアプリケーションの起動に必要な時間を最小限に抑えることです。SOCI を使用して AWS Fargate 遅延読み込みコンテナイメージのパフォーマンスを測定するには、SOCI を使用する場合と SOCI を使用しない場合のコンテナイメージの起動時間を把握する必要があります。
各コンテナイメージの起動に必要な時間を理解するために、Amazon ECS の DescribeTasks API
から入手できるメトリクスを使用できます。最初のメトリクスは createdAt
です。これは、タスクが作成されて PENDING
状態になったときのタイムスタンプです。2 番目のメトリクスは startedAt
です。これは、タスクが PENDING
状態から RUNNING
状態に移行した時のタイムスタンプです。
このため、SOCI インデックスを生成せずに、同じコンテナイメージを使用して pytorch-without-soci
という別の Amazon ECR リポジトリを作成しました。 これらのコンテナイメージを比較すると、pytorch-without-soci
には存在しない 2 つのオブジェクト (イメージインデックスと SOCI インデックス) が pytorch-soci
に追加されています。
アプリケーションのデプロイと実行
アプリケーションを実行するために、demo-pytorch-soci-cluster
という名前の Amazon ECS クラスター、VPC、および必要な ECS タスク実行ロールを作成しました。Amazon ECS を初めて使用する場合は、Amazon ECS の開始方法を参照すると、コンテナ化されたアプリケーションのデプロイおよび実行方法をよりよく理解できます。
それでは、起動タイプとして FARGATE
を使用して両方のコンテナイメージをデプロイして実行してみましょう。pytorch-soci
と pytorch-with-soci
のそれぞれに 5 つのタスクを定義しています。
$ aws ecs \
--region us-east-1 \
run-task \
--count 5 \
--launch-type FARGATE \
--task-definition arn:aws:ecs:us-east-1:XYZ:task-definition/pytorch-soci \
--cluster socidemo
$ aws ecs \
--region us-east-1 \
run-task \
--count 5 \
--launch-type FARGATE \
--task-definition arn:aws:ecs:us-east-1:XYZ:task-definition/pytorch-without-soci \
--cluster socidemo
数分後、ECS クラスターに 10 個の実行中のタスクがあります。
すべてのタスクが実行されていることを確認したら、次のスクリプトを実行して createdAt
と startedAt
の 2 つのメトリクスを取得します。
#!/bin/bash
CLUSTER=<CLUSTER_NAME>
TASKDEF=<TASK_DEFINITION>
REGION="us-east-1"
TASKS=$(aws ecs list-tasks \
--cluster $CLUSTER \
--family $TASKDEF \
--region $REGION \
--query 'taskArns[*]' \
--output text)
aws ecs describe-tasks \
--tasks $TASKS \
--region $REGION \
--cluster $CLUSTER \
--query "tasks[] | reverse(sort_by(@, &createdAt)) | [].[{startedAt: startedAt, createdAt: createdAt, taskArn: taskArn}]" \
--output table
SOCI インデックスのないコンテナイメージに対して上記のコマンド (pytorch-without-soci
) を実行すると、次のような出力が生成されます。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| DescribeTasks |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
| createdAt | startedAt | taskArn |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
| 2023-07-07T17:43:59.233000+00:00| 2023-07-07T17:46:09.856000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/dcdf19b6e66444aeb3bc607a3114fae0 |
| 2023-07-07T17:43:59.233000+00:00| 2023-07-07T17:46:09.459000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/9178b75c98ee4c4e8d9c681ddb26f2ca |
| 2023-07-07T17:43:59.233000+00:00| 2023-07-07T17:46:21.645000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/7da51e036c414cbab7690409ce08cc99 |
| 2023-07-07T17:43:59.233000+00:00| 2023-07-07T17:46:00.606000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/5ee8f48194874e6dbba75a5ef753cad2 |
| 2023-07-07T17:43:59.233000+00:00| 2023-07-07T17:46:02.461000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/58531a9e94ed44deb5377fa997caec36 |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
各タスクの平均集計デルタ時間 (startedAt
と createdAt
の間) から、pytorch-without-soci
(SOCI インデックスなし) が 129 秒後に正常に実行されました。
次に、SOCI インデックスありの pytorch-soci
で同じコマンドを実行します。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| DescribeTasks |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
| createdAt | startedAt | taskArn |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
| 2023-07-07T17:43:53.318000+00:00| 2023-07-07T17:44:51.076000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/c57d8cff6033494b97f6fd0e1b797b8f |
| 2023-07-07T17:43:53.318000+00:00| 2023-07-07T17:44:52.212000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/6d168f9e99324a59bd6e28de36289456 |
| 2023-07-07T17:43:53.318000+00:00| 2023-07-07T17:45:05.443000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/4bdc43b4c1f84f8d9d40dbd1a41645da |
| 2023-07-07T17:43:53.318000+00:00| 2023-07-07T17:44:50.618000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/43ea53ea84154d5aa90f8fdd7414c6df |
| 2023-07-07T17:43:53.318000+00:00| 2023-07-07T17:44:50.777000+00:00 | arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/0731bea30d42449e9006a5d8902756d5 |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
ここでは、SOCI が有効化されたコンテナイメージ (pytorch-soci
) が作成されてから 60 秒後に起動したことがわかります。
つまり、AWS Fargate で SOCI インデックスを使用してサンプルアプリケーションを実行すると、SOCI インデックスを使用しない場合と比べて約 50% 高速になります。
SOCI がある場合とない場合とで、アプリケーションの起動時間とスケールアウト時間をベンチマークすることをお勧めします。これにより、アプリケーションの動作や、アプリケーションが AWS Fargate の SOCI サポートの恩恵を受けるかどうかをよりよく理解できます。
お客様の声
プライベートプレビュー期間中、お客様から AWS Fargate の SOCI サポートについて多くのフィードバックをいただきました。以下では、お客様の声をご紹介します。
Autodesk は、建築、エンジニアリング、建設、製造、メディア、エンターテイメント業界にわたって重要なソフトウェアソリューションを設計、製造、運用しています。「SOCI のおかげで、AWS Fargate を使用して Amazon ECS で実行される、時間に敏感なシミュレーションワークロードの起動時のパフォーマンスが 50% 向上しました。これにより、アプリケーションのスケールアウトが高速化し、ユーザー需要の増加に迅速に対応でき、アイドル状態のコンピューティング容量を減らすことでコストを節約できます。SOCI インデックスを作成するための AWS パートナーソリューションは設定とデプロイが簡単です」– Autodesk の Innovyze SaaS エンジニアリング、AI およびアーキテクチャ部門の責任者、Boaz Brudner 氏。
Flywire は、世界で最も重要で複雑な決済を行うことを使命とする、グローバルな決済支援およびソフトウェア企業です。「AWS Fargate を使用して Amazon ECS でマルチステップのデプロイパイプラインを実行していますが、完了するまでに数分かかることがあります。SOCI を使用すると、アプリケーションや導入プロセスに変更を加えることなく、パイプライン全体の所要時間を 50% 以上短縮できます。これにより、アプリケーション更新のロールアウト時間を大幅に短縮できました。750 MB を超える大きなイメージの中には、SOCI によってタスクの起動時間が 60% 以上短縮されたものもあります」と、Flywire の シニアクラウドセキュリティエンジニア、Samuel Burgos 氏は言います。
Virtuoso は、機能的な UI とエンドツーエンドのテストソフトウェアを開発する大手ソフトウェア企業です。「SOCI のおかげで、コンピューティングの需要と可用性のギャップが縮小しました。当社の作業負荷は非常に高く、お客様はできるだけ早く作業を開始することを期待しています。SOCI により、ECS タスクのスピンアップが 40% 速くなり、アプリケーションを迅速にスケールし、アイドル状態のコンピューティング容量プールを減らすことができるため、より効率的に価値を提供できるようになりました。SOCI の設定はとても簡単でした。構築とデプロイのパイプラインをそのままにしておくことができる、クイックスタートの AWS パートナーのソリューションを使用することにしました」と、Virtuoso のサイト信頼性エンジニアリング部門の責任者、Mathew Hall 氏は語ります。
留意点
可用性 – AWS Fargate の SOCI サポートは、Amazon ECS、AWS Fargate、Amazon ECR が利用できるすべての AWS リージョンでご利用いただけます。
料金 – AWS Fargate の SOCI サポートは追加料金なしで利用でき、料金が発生するのは SOCI インデックスを Amazon ECR に保存する場合のみです。
開始方法 – AWS Fargate の SOCI サポートページで、利点と開始方法の詳細をご覧ください。
構築がうまくいきますように。
– Donnie
原文はこちらです。