Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

メドピア AWS勉強会 ECS編 / MedPeer AWS Seminar ECS

reireias
October 12, 2020

メドピア AWS勉強会 ECS編 / MedPeer AWS Seminar ECS

メドピア社内で定期的に開催しているAWSに関する勉強会を開催しています。本資料はそのうちのECSに関する回のものです。

reireias

October 12, 2020
Tweet

More Decks by reireias

Other Decks in Technology

Transcript

  1. 目次 1. AWSの基本 ◦ Region ◦ Availability Zone ◦ VPC/Subent

    2. ECS ◦ ECSの概念 ◦ Fargate ◦ スペックとスケール ◦ ログ ◦ デプロイ
  2. 一般的なMulti-AZ構成 Region (ap-northeast-1) AZ-C AZ-A Aurora(Writer) Aurora(Replica) ECS ALB ECS

    簡略化のためにAZ2つで説明 どっちかのAZが落ちてもサービ スは稼働する構成 ただし、Region全体のネット ワーク障害などの場合は死ぬ AZ間通信の場合、AZ内通信に くらべて、10ms程度レイテンシ が発生する
  3. Subnet VPCの中に作るサブ的なネットワーク空間 VPC内にEC2やRDSを作成する際に指定が必須になる Subnet単位でアクセスを制限したりする Availability Zone 1a Availability Zone 1c

    Availability Zone 1d VPC Private subnet 10.0.130.0/24 Public subnet 10.0.30.0/24 Private subnet 10.0.120.0/24 Public subnet 10.0.20.0/24 Private subnet 10.0.110.0/24 Public subnet 10.0.10.0/24
  4. 目次 1. AWSの基本 ◦ Region ◦ Availability Zone ◦ VPC/Subent

    2. ECS ◦ ECSの概念 ◦ Fargate ◦ スペックとスケール ◦ ログ ◦ デプロイ
  5. クラスター/サービス/タスク/コンテナの関係 Cluster Service A Task A Container A Container B

    Service B Task A Container A Container B Task B Container C Task B Container C
  6. タスク定義とデプロイ ① Dockerイメージをビルド ② タスク定義の新リビジョンの作成 ③ ECSサービスのタスク定義指定を更新 ④ ECSサービスがタスクを置き換える Task

    Definition Revision 10 Service Task(10) Image Image Revision 11 Task(10) Task(11) Task(11) Task Definition Revision 10 Service Task(10) Image Image Revision 11 Task(10) Task Definition Revision 10 Service Task(10) Image Image Revision 11 Task(10) Task Definition Revision 10 Service Task(10) Image Image Task(10)
  7. 実際の構成の例 ECSクラスター ECSサービス 起動タイプ ECSタスク (数) Dockerコンテナ prd-app prd-app Fargate

    prd-app (4) - nginx - rails - datadog prd-api prd-api Fargate prd-api (4) - nginx - rails - datadog prd-admin prd-admin EC2 prd-admin (1) - nginx - rails - datadog prd-worker prd-worker Fargate prd-worker (2) - worker(sidekiq) - datadog ※ 実際に運用しているサービスの名前とは微妙に異なります
  8. 比較 Fargate EC2 スケーリング速度 速い EC2の起動の分遅い 管理コスト 低 高 EC2の管理も自前

    コスト 低 デプロイ時のキャパシティ的に メモリの料金に無駄が出る ssh可能 (基本的に)不可能 可能
  9. コスト Fargate EC2 Fargate Task A cpu: 256 mem: 512

    EC2 cpu 512, mem: 1024 Task A cpu: 256 mem: 512 デプロイ中 デプロイ後 Fargate Task A cpu: 256 mem: 512 Fargate newTask A cpu: 256 mem: 512 Fargate newTask A cpu: 256 mem: 512 EC2 cpu 512, mem: 1024 Task A cpu: 256 mem: 512 newTask A cpu: 256 mem: 512 EC2 cpu 512, mem: 1024 newTask A cpu: 256 mem: 512 平常時にタスクの倍のスペックの EC2を用 意する必要があり、無駄コストとなる
  10. ECSのスペック ECSでスペックを指定できる箇所を起動タイプ別に以下に示す Fargate EC2 Task Fargate Container Container 必須 -

    CPU - メモリ FargateはTaskのCPUとメモリ のスペックで確保される 任意 - CPU/メモリ - 予約メモリ EC2 Instance 必須 - インスタンスタイプ Task Container Container Task Container 任意 - CPU/メモリ - 予約メモリ 必須 - メモリ 任意 - CPU
  11. 注意点 • メモリ使用量100%になると、コンテナが落ちる ◦ dockerのOOM Killerが発動し、コンテナが落ちる ◦ 基本的にどのコンテナも必須なので、 1つのコンテが落ちたらタスク全体が落ちる設定が多い •

    起動タイプEC2の場合、空きがないとタスクは起動しない ◦ タスクサイズ分のCPU/メモリの空きがEC2に無いと起動しない ◦ この空きは現在の使用量ではなく、タスクサイズで計算される ◦ 例:メモリ4GBのEC2上では、メモリ1.5GBのタスクは起動直後のメモリ消費が 100MBであっても、2 つまでしか起動できない
  12. 注意点:よくある失敗 元々の状態 EC2メモリ4GB + メモリ1.5GBのタスク1つ スケールアウトして下記の状態となった EC2メモリ4GB + メモリ1.5GBのタスク2つ この状態だと、空きメモリは

    `4GB - 1.5GB * 2 = 1GB` しかない デプロイ時のmaxを200%にしていると、デプロイ時に新規にタスクが起動できないた め、デプロイがエラーになって終了する →起動タイプEC2の場合、EC2とタスクの両方のスケーリングを正しく設定する必要が ある(無駄コストを払わないようにこれを実現するのはかなり複雑なのでFargateを使お う)
  13. ECSのデプロイ デプロイの仕組みというよりは、デプロイ時に発生する有名な問題の話を紹介 デプロイ自体はタスク定義の項で紹介したように以下の流れで行われる • 最新のソースコードでDockerイメージを作成 • ECRにimageをpush • タスク定義に上記イメージを使用する新しいリビジョンを追加 •

    ECSサービスで利用するタスク定義のリビジョンを最新に更新 • あとはECSが設定に基づき新しいタスクを起動し、古いタスクを停止 余談:上記処理はどこから実行しても良いので、GitHub Actionsからデプロイする仕組 みも実験中
  14. 仕組み Task Container V1 Task Container V2 ① htmlを新バージョンのアプリか ら取得(1/2の確率で発生)

    デプロイ中に新旧両方のバージョンが ロードバランサーに紐づくタイミングで発 生する ② htmlに記載されたcssを旧バー ジョンのアプリに取りに行く ③ 新バージョンのアプリの asset pipelineで作成されたcssは存在し ないので404を返す assets pipelineを使っているRailsが複数バージョン混 在するとエラーになるという当たり前の話 ELB
  15. 対策1. assetsファイルをCloudFrontで配信 Task Container V1 Task Container V2 /assets 等のパスはS3から取得す

    るように設定 新バージョンをデプロイする直前 にassets系ファイルをアップロード する デプロイ中は、CloudFrontから新旧両方の バージョンのassetsファイルを取得できるよう にする方法 S3に無限にassetsが溜まっていかないよう に、デプロイの最後、旧バージョンのコンテナ が停止した後で、古い assetsファイルを消す CloudFront S3 Bucket
  16. 対策2. CodeDeployで一括でトラフィック切り替え Task Container V1 Task Container V2 ELB Task

    Container V1 Task Container V2 ELB CodeDeployというAWSサービスと連携してECSへデプロイすることで、新旧バージョン が混在する瞬間を発生させずに、トラフィックを一括で切り替える タスクがいくつあっても一括で新旧 のバージョンへの トラフィックが切り替わる