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

ECSにおけるBGデプロイの実現

Avatar for a2-ito a2-ito
March 14, 2025
64

 ECSにおけるBGデプロイの実現

Avatar for a2-ito

a2-ito

March 14, 2025
Tweet

Transcript

  1. • CodeDeploy を組み合わせることで、ECS の Blue/Green デプロイができるようになる • e-dash では CodeDeploy

    を使っておらず、導⼊コストや運⽤コストを鑑み採⽤を⾒送り ECS 標準機能としての BG デプロイ 8 ブルー/グリーンデプロイを使用した Amazon ECS サービスのデプロイ https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-blue-green.html
  2. どのレイヤで Blue と Green を切り替えるか? • ECSタスク • ECSサービス •

    ECSクラスタ ECS 標準機能でない Blue/Green デプロイ:基本戦略 11
  3. • ECS タスクセットを利⽤するには ECS サービスのパラメータ DeploymentController の設 定を EXTERNAL に変更する必要がある

    • DeploymentController オプション ◦ ECS ▪ デフォルト値 ▪ ローリングアップデートを⾏う ◦ CODE_DEPLOY ▪ CodeDeploy を利⽤して Blue/Green デプロイを⾏う ▪ 標準機能の Blue/Green デプロイを利⽤する場合はこちらを設定する ◦ EXTERNAL ▪ 外部のデプロイメントコントローラーを利⽤してデプロイを⾏う ECS 標準機能でない Blue/Green デプロイ:ECSタスク 13
  4. ECS 標準機能でない Blue/Green デプロイ:ECSタスク 14 タスクセットの作成コマンド例 aws ecs create-task-set \

    --cluster [ECS_CLUSTER_NAME] \ --service [ECS_BACKEND_SERVICE_NAME]\ --task-definition [BACKEND_TASK_DEF_ARN] \ --launch-type FARGATE \ --network-configuration 'awsvpcConfiguration={ subnets=[SUBNET_IDS], securityGroups='[SECURITY_GROUP_IDS]', assignPublicIp=DISABLED}' \ --scale value=100,unit=PERCENT
  5. ECS 標準機能でない Blue/Green デプロイ 17 • ECSサービス⽅式とECSクラスタ⽅式は⽐較的類似した構成だが、クラスタ⽅式を選択 ◦ 複数のECSサービスでプロダクトを構成している(例:フロント、バックのサービ ス)ということもあり、単⼀クラスタ内に

    Blue/Green のアプリが混在すると煩雑に なる • 余談)別で実装したPRプレビューの仕組みでは、ECSサービス⽅式を採⽤した ◦ 作業ブランチのアプリを、既存のECSサービスとは別のECSサービスとしてデプロイ する
  6. ECS Service Connect による名前解決が失敗する 27 • A が起動した時点で B が起動完了していなかったことが原因

    • 再デプロイすれば解決する • 初期構築時しか発⽣はしないが、動的にECSサービスやクラスタを作成する環境では注意 が必要
  7. ALB ターゲットグループの切り替え後に認証が失敗する 29 { "RuleArn": "[omit]", "Priority": "100", "Conditions": [

    { [omit] } ], "Actions": [ { "Type": "authenticate-oidc", "AuthenticateOidcConfig": [omit], "Order": 1 }, { "Type": "forward", "TargetGroupArn": [omit], "Order": 2, } ], "IsDefault": false }
  8. ALB ターゲットグループの切り替え後に認証が失敗する 30 { "RuleArn": "[omit]", "Priority": "100", "Conditions": [

    { [omit] } ], "Actions": [ { "Type": "authenticate-oidc", "AuthenticateOidcConfig": [omit], "Order": 1 }, { "Type": "forward", "TargetGroupArn": [omit], "Order": 2, } ], "IsDefault": false } Listener Rule に紐づく Target Group を切り替える
  9. ALB ターゲットグループの切り替え後に認証が失敗する 31 { "RuleArn": "[omit]", "Priority": "100", "Conditions": [

    { [omit] } ], "Actions": [ { "Type": "authenticate-oidc", "AuthenticateOidcConfig": [omit], "Order": 1 }, { "Type": "forward", "TargetGroupArn": [omit], "Order": 2, } ], "IsDefault": false } e-dash ではALBの OIDC連携機能を利用している
  10. • modify-rules を実⾏した際に OIDC 連携の設定が消えてしまったことが原因 • jq コマンドを利⽤して、取得したリスナールールのターゲットグループの指定を書き換え ることで対処 ALB

    ターゲットグループの切り替え後に認証が失敗する 33 jq 'del(.Conditions[].PathPatternConfig, .Conditions[].HostHeaderConfig, .IsDefault, .Priority, .Actions[].ForwardConfig)' | \ jq '(.Actions[] | select(.Type=="authenticate-oidc").AuthenticateOidcConfig) |= .+ {"UseExistingClientSecret": true}' | \ jq '(.Actions[] | select(.Type=="forward").TargetGroupArn) |= "'${TARGET_GROUP_ARN}'"'
  11. • ECS は優れたサービスだけど、はかゆいところに届かないことも • Kubernetes だと、Blue/Green デプロイやカナリアリリースなどの仕組みを実現する場合 は、Argo CD のような優れた

    OSS が利⽤可能 ◦ ⼀⽅で、運⽤コストが⾼くなる可能性もある • トレードオフなので、適材適所で使いましょう まとめ 34