Slide 1

Slide 1 text

Twelve-Factor Appから学ぶ ECS設計プラクティス 2025年04月24日 NRIネットコム株式会社 NTシステム事業二部 尾澤 公亮 NRIネットコム TECH AND DESIGN STUDY #63

Slide 2

Slide 2 text

1 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 2012年にHerokuの中の人によって提唱された、 モダンアプリケーションを作り上げるための方法論 Twelve-Factor App とは ref: https://12factor.net/ja/

Slide 3

Slide 3 text

2 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy インフラメンにも大事な Twelve Factor-App ↓アプリの話だけどインフラも知っておいた方が良い理由↓ タスク定義や構成で「なぜこうなっているのか」の意図が汲み取れない • なぜ環境変数にこの値が入っているのか • なぜこのコンテナが必要なのか • なぜDockerfileでこんなコマンドを実行しているのか • なぜECSを使うのか、etc... Twelve-Factor App とは

Slide 4

Slide 4 text

3 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ◼インフラエンジニア、クラウドアーキテクト ◼AWS、コンテナを中心とした、 Webシステム設計/開発/運用/保守 ◼ex.: ECS, EKS, Codeシリーズ 尾澤 公亮(KOSUKE OZAWA)

Slide 5

Slide 5 text

4 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 構成要素 コードベース 依存関係 設定 バックエンドサービス ビルド、リリース、実行 プロセス ポートバインディング 並行性 廃棄容易性 開発/本番一致 ログをイベントストリーム として扱う 管理タスクは一回限りの プロセス

Slide 6

Slide 6 text

5 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy コードベース バージョン管理されている1つのコードベースと複数のデプロイ GitHub Actions GitHub Amazon ECS Amazon ECS 本番 開発

Slide 7

Slide 7 text

6 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 依存関係を明示的に宣言し分離する →Gemfile.lock、package.json、etc... OSパッケージに依存しない →alpineイメージにcurl入ってない問題 依存関係

Slide 8

Slide 8 text

7 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 設定 設定を環境変数に格納する Parameter Store Amazon ECS Key参照で 直接読み込み

Slide 9

Slide 9 text

8 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う direnv、compose.yml等で ローカル用変数を定義

Slide 10

Slide 10 text

9 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する デプロイ アーティファクト 作成 BGデプロイ で必要

Slide 11

Slide 11 text

10 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy プロセス アプリケーションを1つもしくは複数の ステートレスなプロセスとして実行する 疎結合

Slide 12

Slide 12 text

11 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ポートバインディング ポートバインディングを通してサービスを公開する Fargateはデフォルトでアプリのデフォルトポートをバインドする

Slide 13

Slide 13 text

12 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 並行性 プロセスモデルによってスケールアウトする Amazon ECS Amazon EKS AWS Application Auto Scaling

Slide 14

Slide 14 text

13 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 廃棄容易性 高速な起動とグレースフルシャットダウンで堅牢性を最大化する コンテナイメージの軽量化 Seekable OCI PID 1問題

Slide 15

Slide 15 text

14 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy コンテナイメージの軽量化 マルチステージビルド ビルドに必要な実行ファイルのみを 稼働用イメージにCOPY →アプリ起動に不要なファイルを含めない

Slide 16

Slide 16 text

15 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy コンテナイメージの軽量化 キャッシュ戦略 特定ディレクトリをキャッシュ指定 →差分が発生するライブラリのみ取得 する →処理時間の短縮にも BuildKit環境の整備が必要 実行環境によって手順が異なる

Slide 17

Slide 17 text

16 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy Seekable OCI ref: https://aws.amazon.com/jp/blogs/news/under-the-hood-lazy-loading-container-images-with-seekable-oci-and-aws-fargate/ 実行に必要な処理箇所を特定し、 イメージの完全インストール前に起動する (Lazy Loading) → 起動時間の高速化

Slide 18

Slide 18 text

17 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy Seekable OCI 実行に必要な処理箇所を特定し、 イメージの完全インストール前に起動する (Lazy Loading) → 起動時間の高速化 ref: https://aws.amazon.com/jp/blogs/news/under-the-hood-lazy-loading-container-images-with-seekable-oci-and-aws-fargate/ 現状SOCI snapshotter環境構築コストがかかる イメージサイズ 250MB以上推奨

Slide 19

Slide 19 text

18 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy PID 1 問題 ENTRYPOINT [“nginx”, “-g”, “daemon off;”] → PID 1:nginx master ENTRYPOINT [“/bin/sh”, “-c”, “’nginx -g daemon off;’”] → PID 1:/bin/sh ref: https://note.shiftinc.jp/n/ndc63c45d9f97?gs=b214340a89d1 実行モジュール(Nginx)が /bin/sh のサブコマンドとして実行される 実行モジュールからのSIGTERMを /bin/sh が受け取れず、一定時間(10秒)後にSIGKILL →停止に時間がかかる、正常に終了しない

Slide 20

Slide 20 text

19 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ 時間のギャップ 人材のギャップ ツールのギャップ ※Twelve Factor Appの文言から抜粋

Slide 21

Slide 21 text

20 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ

Slide 22

Slide 22 text

21 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ 管理環境が多すぎると全部の冪等性を担 保するのって結構難しい →ドリフト検知はしておいても良いかも しれない

Slide 23

Slide 23 text

22 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ログをイベントストリームとして扱う サーバ側でバッファリングしない

Slide 24

Slide 24 text

23 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 管理タスクは1回限りのプロセス DBマイグレーションはタスク化 踏み台、ECS Execの活用

Slide 25

Slide 25 text

24 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy • Adam Wiggins「THE TWELVE-FACTOR APP」 • https://12factor.net/ja/ • Amazon Web Servicesブログ「詳解 : Seekable OCI を使用した AWS Fargate におけるコンテナイメージの遅延読み込み」 • https://aws.amazon.com/jp/blogs/news/under-the-hood-lazy-loading-container-images-with-seekable-oci-and-aws-fargate/ • SHIFT技術ブログ「Docker上のサーバーを強制終了ではなく正常に終了する PID1になるプロセスとは?を理解してみた」 • https://note.shiftinc.jp/n/ndc63c45d9f97?gs=b214340a89d1 参考文献

Slide 26

Slide 26 text

No content