🐷

Fargate の起動時間が短縮される Seekable OCI を試してみた

2023/12/07に公開

はじめに

今期の私のミッションで Four Keys の改善を挙げており、サービス復元時間の削減を検討していました。
当初は Docker イメージサイズの削減を1番に行う予定でしたが、弊社 EM よりSeekable OCIの利用が有効でないかと連携がありましたので、そちらを検証したものとなります。

本記事のまとめ

  • ECS の起動時間のみを観測すると48%の短縮
  • アプリケーションが利用可能になるまでの観点だと37%の短縮だった

2024/05/13 補足

2024/05/13 現在、SOCI インデックスを利用すると ECS の起動時にCannotPullContainerErrorが発生する頻度が上がるようです。
バッチ等で ECS の起動が多い場合はご注意ください。
※詳細は AWS サポートに問い合わせてみてください

検証内容

環境

  • Docker image
    Ruby の slim-buster をベースイメージとしたもので、Docker イメージサイズは950 MB程度です。
  • SOCI インデックス
    インデックスを作成する方法は、cfn-ecr-aws-soci-index-builder
    を利用する方法と手動でプッシュする2パターンあるようですが、今回は前者での検証となります。

準備

インフラは Terraform で管理しているため、以下のaws_cloudformation_stackを使ってcfn-ecr-aws-soci-index-builderをデプロイしました。

resource "aws_ecr_repository" "sample" {
  name = "${var.product}-${var.env}-sample"
}

resource "aws_cloudformation_stack" "soci_index_builder" {
  name         = "${var.product}-${var.env}-soci-index-builder"
  template_url = "https://aws-quickstart.s3.us-east-1.amazonaws.com/cfn-ecr-aws-soci-index-builder/templates/SociIndexBuilder.yml"
  capabilities = ["CAPABILITY_IAM"]

  parameters = {
    "SociRepositoryImageTagFilters" = "${aws_ecr_repository.sample.name}:latest"
  }
}

補足として、SociRepositoryImageTagFiltersに ECR リポジトリとタグを指定すると、インデックスを作成する ECR のイメージを制限できます。

上記の soci-index-builder をデプロイするだけで、あとは通常のデプロイフロー( Docker image を対象リポジトリへ push && ECS へ deploy )を行うと SOCI インデックスが自動的に作成されます。
ECR

インデックスの有無での検証結果

oci-index-builder のデプロイ後にまず、Amazon Web Services ブログにあった以下のコマンドでインデックス有り、無しの Fargate の起動時間を観測してみました。

#!/bin/bash
CLUSTER=<CLUSTER_NAME>
TASKDEF=<TASK_DEFINITION>
REGION="ap-northeast-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

※Fargate タスクは二つ起動して検証行っています。

  • インデックス無し
    差分:1:221:24

    | DescribeTasks |
    +----------------------------------+-----------------------------------+--------------------------------------------------------------------------------------------------------+
    | createdAt | startedAt | taskArn |
    +----------------------------------+-----------------------------------+--------------------------------------------------------------------------------------------------------+
    | 2023-11-22T17:13:38.117000+09:00| 2023-11-22T17:15:16.668000+09:00 | xxx |
    | 2023-11-22T17:13:38.117000+09:00| 2023-11-22T17:15:15.493000+09:00 | xxx |
    +----------------------------------+-----------------------------------+--------------------------------------------------------------------------------------------------------+
    
  • インデックス有り
    差分:0:440:45

    | DescribeTasks |
    +----------------------------------+-----------------------------------+--------------------------------------------------------------------------------------------------------+
    | createdAt | startedAt | taskArn |
    +----------------------------------+-----------------------------------+--------------------------------------------------------------------------------------------------------+
    | 2023-11-22T17:17:55.595000+09:00| 2023-11-22T17:18:39.860000+09:00 | xxx |
    | 2023-11-22T17:17:55.595000+09:00| 2023-11-22T17:18:40.514000+09:00 | xxx |
    +----------------------------------+-----------------------------------+--------------------------------------------------------------------------------------------------------+
    

    上記のコマンドから、SOCI インデックスを利用することで、 Fargate の起動時間がおおよそ48%程度削減できることが確認できました。

アプリケーションの起動ログの観測結果

上記の 検証で SOCI インデックスの有効性は確認できました。
しかし、短縮の仕組みとして遅延読み込みというのが少し気になったので、念のためアプリケーションログの起動ログも確認してみました。

  • インデックス無し

    Fargate のstartedAt アプリケーションの起動ログ 差分
    2023-11-22T17:15:16.668000+09:00 2023-11-22T17:15:00.242+09:00 16 秒
    2023-11-22T17:15:15.493000+09:00 2023-11-22T17:15:02.989+09:00 12 秒
  • インデックス有り

    Fargate のstartedAt アプリケーションの起動ログ 差分
    2023-11-22T17:18:39.860000+09:00 2023-11-22T17:18:49.685+09:00 -9 秒
    2023-11-22T17:18:40.514000+09:00 2023-11-22T17:18:49.947+09:00 -9 秒

SOCI インデックスの有無でアプリケーションの起動ログが出力されるまでの時間が逆転していることが確認できます。
そのため、Fargate のstartedAtではなく、アプリケーションの起動までを対象とすると起動時間短縮の実態は37%減であることがわかりました。

おそらく、SOCI インデックスを利用することで Fargate 自体の起動は速くなるものの、遅延読み込みの影響でアプリケーションの起動に時間がかかっているのだと思われます。

おわりに

今回は、Fargate の起動時間を短縮する SOCI インデックスの検証を行いました。
SOCI インデックスを利用した感想としては、デプロイフローの変更もなく、Cloud Formation を一つデプロイするだけで 40% 程度の起動時間短縮が見込めるため、積極的に利用していきたい、というかこれから周囲にも布教していきたいと思います。
連携いただいた EM に感謝です!!

一点、注意事項として、イメージをプッシュした後に SOCI インデックスが作成されるまでに 1 分から 6 分程度まで、時間のばらつきを確認しました。そのため、デプロイフローによっては、SOCI インデックスが期待通りに機能しない可能性もあり得ます。
それでも、オートスケーリングの時間短縮等も改善されることを考慮すると、導入は非常に有効だと思います。

参考

Linc'well, inc.

Discussion