ENECHANGE Developer Blog

ENECHANGE開発者ブログ

さらに進化した!AWS FargateでのECSタスク起動を速くするSeekable OCI導入レポート

2023年7月、AWS FargateでSeekable OCI (SOCI) を使ったコンテナ起動の高速化が可能になりました。

aws.amazon.com

ただ、発表当時は下記の制約があったため、ENECHANGEには合わないと判断して評価を見送りました。

  • X86_64のECSタスクでしか使えない
    • ENECHANGEではARM64の利用を優先している
  • タスク定義に含まれるすべてのイメージのインデックス作成が必要
    • ENECHANGEでは大小さまざまなイメージを使っている。SOCIは250MiBより大きいイメージでの利用が推奨されている

しかし2023年8月、ARM64のタスクでもSOCIが使えるようになりました。

github.com

また2023年11月には、一部のイメージのインデックス作成だけでもOKになりました。つまり、250MiB以下のイメージを含むタスクであっても、SOCIが効率的に使えるようになったのです。

aws.amazon.com

これらのアップデートにより、ENECHANGEでもSOCIの利用が現実的になりました。

そこで実際に評価してみたところ、たしかにタスクの起動が速くなりました。以下、結果を共有します。

結果:13秒~20秒の高速化

今回SOCIを導入したアプリケーションでは、13秒~20秒の高速化となりました。

環境 導入前 導入後 差異
staging 64秒 44秒 20秒
production 71秒 58秒 13秒

stagingは2回計測した分の平均値、productionは1回計測しただけですが、3回とも速くなっています。

イメージは下記の構成です。

コンテナ名 イメージレジストリ サイズ インデックス
web ECRプライベートレジストリ 333.73MB あり
job ECRプライベートレジストリ 330.01MB あり
proxy ECRプライベートレジストリ 99.81MB なし
log_router ECRパブリックギャラリー - -

サイズの小さいイメージ (proxy) や、ECRパブリックギャラリー(SOCI未対応)にあるイメージ (log_router) が混じっていても、問題なく高速化できました。

劇的な効果ではないものの、タスク起動の高速化には、開発者体験が向上したり、不具合のロールバックが速くなったり、といったメリットがあると考えます。

導入:CloudFormationで簡単!

SOCIの導入はインデックスを作るだけではあるのですが、これを手動で作ろうと思うと、soci-snapshotterを導入して、インデックスを作成して、リポジトリにプッシュしてと、なかなか手間がかかります。

そこで今回は、AWSが提供しているCloudFormationテンプレートを使ってみました。これにより、インデックス作成が簡単に自動化できました。

aws-ia.github.io

どのイメージのインデックスを作るかは、SociRepositoryImageTagFilters パラメータで指定できます。ワイルドカードが使えるので、今回は app-repo:master-web-*,app-repo:master-job-*,app-repo:staging-web-*,app-repo:staging-job-* のように指定しました。

さらに、ENECHANGEではTerraformを主に利用しているので、下記のTerraformテンプレートも作りました。これにより、インデックス作成対象イメージが増えても、terraform apply で簡単にCloudFormationスタックが更新できます。

locals {
  repository_image_tag_filters = [
    "app-repo:master-web-*",
    "app-repo:master-job-*",
    "app-repo:staging-web-*",
    "app-repo:staging-job-*",
  ]
}

resource "aws_cloudformation_stack" "this" {
  capabilities = [
    "CAPABILITY_IAM",
  ]
  disable_rollback = false
  name             = "cfn-ecr-aws-soci-index-builder"
  parameters = {
    IamPermissionsBoundaryArn     = "none"
    QSS3BucketName                = "aws-quickstart"
    QSS3KeyPrefix                 = "cfn-ecr-aws-soci-index-builder/"
    SociRepositoryImageTagFilters = join(",", local.repository_image_tag_filters)
  }
  tags = {
    "Name" = "cfn-ecr-aws-soci-index-builder"
  }
  template_url       = "https://aws-quickstart.s3.us-east-1.amazonaws.com/cfn-ecr-aws-soci-index-builder/templates/SociIndexBuilder.yml"
  timeout_in_minutes = 0
}

注意:ECRライフサイクルポリシーの変更が必要かも

注意点として、下記のインデックスがECRリポジトリ内に作られるため、場合によってはECRライフサイクルポリシーの変更が必要です。

種類 イメージタグ
イメージインデックス sha256- から始まる文字列
SOCIインデックス なし

インデックスが誤って削除されても起動が遅くなるだけですが、イメージが誤って削除されるとタスクが起動できなくなるかもしれません。ご注意ください。

おわりに

以上、ENECHANGEでのSOCIの導入レポートでした。

SOCIは、利用上の制約が減り、ユースケースが広がっています。導入もCloudFormationで簡単です。タスクの起動が速くなれば、開発者体験やビジネスの柔軟性が向上するはずです。

ENECHANGEでは、SOCIを導入したアプリケーションはまだ1件だけです。ただ、他のアプリケーションにも展開したく、社内のエンジニアに声をかけているところです。

社内・社外を問わず、この記事を読んだ方がSOCIを試して結果を共有してくださると、筆者としてはとてもうれしく思います。

今回の記事は、ENECHANGE VPoTの岩本 (iwamot) が担当しました。ぼくも、SOCIのように進化しつづけることを目指します。