Amazon ECS Deep Dive
# Amazon ECS Deep Dive
https://d1.awsstatic.com/webinars/jp/pdf/services/20190731_AWS-BlackBelt_AmazonECS_DeepDive_Rev.pdf
## Amazon ECSとは
コントロールプレーンとしての基盤
# Q&A
Q1. アプリケーションの設定値・秘密情報の配布方法
A.
- 設定値 -> 環境変数
- 秘密情報 -> AWS Secret Manager
- “valueForm” で Secrets のARNを入れられる(Task がSecrets Manager を見るのではなく、ECSから渡す)
Q2. サービスディスカバリの方法はALBを利用するのか?
A.
サービスディスカバリには以下の2つがある。
- LBベース
- ServiceA -> ALB -> ServiceB
- ECSがタスクを起動した上で、ターゲットグループに登録(停止時は登録を解除)
- LBの機能(Connection Draining , L4/L7, ELB healthcheck)が利用できる
- インターネットアクセスを利用可能
- LBのドメイン名で宛先を解決
- DNSベース
- ServiceA -> ServiceB
- ECSがサービスを起動し、DNSレコードを追加(停止時は削除)
- コンテナレベルでのヘルスチェックのみ有効
- セキュリティグループ設計などの設計がシンプルになる
負荷分散/ヘルスチェック目的だけであれば、低コストでシンプルな設計になるDNSベースのECS Service Discoveryがよい.
Q3. サイドカーコンテナのような依存関係のあるコンテナをどのように制御すれば良いか
A.
dependsOn パラメータで起動順・停止順を制御できる(複数種タイミングの制御ができる)
startTimeout, stopTimeout パラメータでタイムアウト制御ができる
Q4. Scheduled Task のエラーハンドリングの方法
A.
- 他のサービスとの連携でフロー管理したいのであれば AWS StepFunctions を利用
- 単純なエラー検知であれば、CloudWatch Events でコンテナの状態変更イベントを取得する方法もある
Q5. もっとカスタマイズしたデプロイやロールバックを実現したい
A.
- ローリングアップデート
- ECSでコントロール
- Blue/Green デプロイメント
- CodeDeploy, ALBでコントロール
- External Deployment Controller(より柔軟なデプロイ)
Q6. EC2起動タイプでawsvpcネットワークモードを使っているとEC2リソースは余っているのにタスクが立ち上がらない
A.
- デフォルトのままだとインスタンスサイズによってTaskに制限がある
- Awsvpc ネットワークモードをEC2起動タイプで利用している場合はENI Trunking 機能を利用することでENI上限値を高めて多くのタスクを配置できるようになる(だいたい10倍くらいになる)
Q7. アプリの立ち上がりが遅いので初回のヘルスチェックを遅らせたい
A.
- healthCheckGracePeriodSecondsを変更する
- ECSからのヘルスチェック時間は変わらない
- ALBからのヘルスチェックのタイミングを遅らせられる
Q8. スペック選定の方法
A.
- Cloudwatch Container Insights を利用する
- CPU
- メモリ
- Network
- Running/Pending のタスク数
- サービスで実行されているタスク数 など…
- ECSタスクメタデータエンドポイントを利用
## 雑感
ユースケースに合わせて適切な解決策を聞いていくのは面白いです。