Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodePipelineを用いたECS on EC2でのBlue/Greenデプロイメント

CodePipelineを用いたECS on EC2でのBlue/Greenデプロイメント

CodePipelineを用いたECS on EC2でのBlue/Greenデプロイメントについて説明しています。

hikaru-champion

February 02, 2022
Tweet

Other Decks in Technology

Transcript

  1. ECSについて OS/ライブラリ ECS on EC2 仮想サーバ上でコンテナを動作 コンテナエージェント ホストのスケーリング コンテナ コンテナ

    Fargate コンテナ コンテナ ECS (Elastic Container Service) はAWSが提供するフルマネージドコンテナオーケストレーションサービスであり、 コンテナの起動停止や、デプロイ、スケーリング等を管理してくれる。 PJ要件上、ECS on EC2を採用。 ECS on Fargate サーバレスでコンテナを動作 ▪特徴 ・カスタマイズできる ・OSアップデート等運用面が大変 ▪特徴 ・インフラ運用管理からの解放 ・ホストにsshできない、カスタマイズできない AWSが管理 ユーザが管理
  2. ECSデプロイメントの種類 ①Rolling Update ②Blue/Green ③外部デプロイ 機能 稼働中のタスクをグループごとに更新し、 新しいタスクを順にデプロイ 稼働している現環境と同じ台数の新環 境を作成し、最新のモジュールで動作

    後、デプロイ サードパーティー制のデプロイコントローラ を使用したデプロイ メリット ・デプロイ時間が短い ・ロールバックが可能 (ECSデプロイメン トサーキットブレーカー) ・ロールバックが可能 ・トラフィックを切り替える前に新環境で アプリのテストが可能 ・jenkinsをサポートしているため、既存 のjenkins環境を使用することができる デメリット ・一時的に既存のコンテナに負荷が集 中する可能性がある ・ダウンタイムが発生する ・現環境と同等の新環境を用意するた め、リソース(EC2インスタンス、ENI)を 消費する ・独自実装のため、コストがかかる 制約 ・特になし ・Capacity Providerがサポート (2021/3/31) ・DEAMONスケジューリング戦略をサ ポートしていない ・サービスAuto Scalingがサポートされ ていない ・ALB/NLBのみ使用可能 ・DEAMONスケジューリング戦略をサ ポートしていない デプロイ時に最新モジュールで動作確認が行えること、問題発生時にはロールバックして、切り戻しが行える ことからCodeDeployを使用したBlue/Greenデプロイメントを採用
  3. ローリングアップデート(1/5) ECSタスクを指定した数ずつ順番に更新していくデプロイ方法。 - デプロイ中に新旧バージョンが混在する状態になるため、アプリケーションの処理によっては予期せぬ動作が起きる。 - ECSデプロイメントサーキットブレイカーによるロールバックが可能に。(2020/12) desiredCount (タスクの必要数): 2 minimumHealthyPercent

    (デプロイ中のタスク数の下限をタスクの必要数の割合で表したもの) : 50 maximumPercent (デプロイ中のタスク数の上限をタスクの必要数の割合で表したもの) : 100 初期構成 Version 1 Listener Production Port HTTP:80 Target Group Target Group A ALB ELB ECS EC2 Version 1
  4. ローリングアップデート(3/5) STEP2 Listener Production Port HTTP:80 Target Group Target Group

    A ALB ELB ECS EC2 Version 1 Version 2タスクの起動 Version 2 Version 2のタスクを起動。 maximumPercent (デプロイ中のタスク数の上限をタスクの必要数の割合で表したもの) を100%に設定しているため、 ローリングアップデート中のタスク数の上限値はdesiredCount (タスクの必要数): 2の100%で2つになる。
  5. ローリングアップデート(4/5) STEP3 Listener Production Port HTTP:80 Target Group Target Group

    A ALB ELB ECS EC2 Version 1タスクの停止 Version 2 残りのVersion 1のタスクを停止。 minimumHealthyPercent (デプロイ中のタスク数の下限をタスクの必要数の割合で表したもの) を50%に 設定しているため、 ローリングアップデート中のタスク数の下限値はdesiredCount (タスクの必要数): 2の50% で1つになる。
  6. ローリングアップデート(5/5) STEP4 Listener Production Port HTTP:80 Target Group Target Group

    A ALB ELB ECS EC2 Version 2 Version 2タスクの起動 Version 2 最後のVersion 2のタスクを起動。 maximumPercent (デプロイ中のタスク数の上限をタスクの必要数の割合で表したもの) を100%に設定しているため、 ローリングアップデート中のタスク数の上限値はdesiredCount (タスクの必要数): 2の100%で2つになる。
  7. パイプライン構成 ECS CodeDeploy CodeBuild S3 Jenkinsサーバ Subversion trunk(検証稼働モジュール) docker ECR

    S3アップロードジョブ CodePipeline ①SVNチェックアウト ②ZIP化 application.zip Docker資材 デプロイスクリプト Dockerビルド実行 ③S3アップロード ECR Push Blue/Greenデプロイ Artifacts出力 S3 Artifacts ④ソースステージ ⑤ビルドステージ ⑥デプロイステージ Blue Green JekninsとCodepipelineを利用した実行環境・フローとする。 ➢ S3へのDockerfile等の資材のアップロードをトリガーにして、CodeBuild、CodeDeployを利用したBlue/Greenデプロイを行 う。
  8. AWSVPC Trunking制限緩和申請 AWSVPC Trunking制限緩和設定 インスタンスタイプ デフォルト設定 制限緩和後 c5.large 2 10

    c5.xlarge 3 20 c5.2xlarge 3 40 ECSでAWSVPCモードを利用する場合は、タスクごとにENIがアタッチされるため、EC2インスタンスで許容されて いるENI数に注意する必要があります。許容されているENI数を超えてしまった場合は、リソース不足でタスクが起 動しなくなるためAWSVPC Trunking制限緩和申請は行いましょう。
  9. buildspec.yml ECRのログイン方法には get-login-passwordコマンドを使用する。 ➢ 以前は get-loginコマンドが使用されていたが、認証情報がshellのhistoryやログファイル等に残ってしまう。また、コマン ドレファレンスにも現在非推奨であることが記載されている。 https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html ➢ --password-stdinオプションを使用すると、パスワードを標準入力から読み込ませることが可能。

    IMAGE_TAGにはSVNリビジョン番号を使用。 ➢ ソースステージにgitリポジトリを使用している場合は、ソースコードのリポジトリのコミットIDが格納される環境変数 ${CODEBUILD_RESOLVED_SOURCE_VERSION}が利用できる。今回はSVNリポジトリを使用しているため、 Jenkinsサーバ上でdocker資材zip化 S3アップロードジョブ内で、最新リビジョン番号で書き換える。
  10. ビルドステージでは、nginxとアプリケーションコンテナのdocker buildを実行。 イメージをpullする際にDockerHubの代わりに、ECR Publicを使用する。 ➢ CodeBuildでビルドする際に、イメージpull時に以下のエラーが発生。 ➢ 「error pulling image

    configuration: toomanyrequests: Too Many Requests. Please see https://docs.docker.com/docker-hub/download-rate-limit/」 ➢ Docker HubのDownload rate limit制限によって、Docker Hubのユーザ認証なしだとイメージpull制限回数に 引っかかってしまう。 ⇒ECR Publicを採用して回避。 buildspec.yml
  11. 【登壇内容について】 ECS on EC2でのBlue/Greenデプロイメントについて解説させていただきました。 ECSのデプロイメント方法は非常に奥深く、ローリングアップデートとBlue/Greenデプロイメント以外にも - ecs-copilot - ecs-cli -

    ecspresso など様々なデプロイツールや方法がありますが、使ってことがないので検証してアウトプットしていきたいと思います。 【勉強会登壇してみて】 ・初めての外部勉強会登壇でめちゃめちゃ緊張しましたが、やりきることができてよかったです。(アウトプット楽しい。。。) ・改めて知識の整理をすることができた。 ・ちょっとでも今回の登壇内容が役に立っていただけると嬉しいです。 まとめ