2023年7月、AWS FargateでSeekable OCI (SOCI) を使ったコンテナ起動の高速化が可能になりました。
ただ、発表当時は下記の制約があったため、ENECHANGEには合わないと判断して評価を見送りました。
- X86_64のECSタスクでしか使えない
- ENECHANGEではARM64の利用を優先している
- タスク定義に含まれるすべてのイメージのインデックス作成が必要
- ENECHANGEでは大小さまざまなイメージを使っている。SOCIは250MiBより大きいイメージでの利用が推奨されている
しかし2023年8月、ARM64のタスクでもSOCIが使えるようになりました。
また2023年11月には、一部のイメージのインデックス作成だけでもOKになりました。つまり、250MiB以下のイメージを含むタスクであっても、SOCIが効率的に使えるようになったのです。
これらのアップデートにより、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テンプレートを使ってみました。これにより、インデックス作成が簡単に自動化できました。
どのイメージのインデックスを作るかは、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のように進化しつづけることを目指します。