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

プルリク作ったらデプロイされる仕組み on ECS / SRE NEXT 2022

プルリク作ったらデプロイされる仕組み on ECS / SRE NEXT 2022

https://sre-next.dev/2022/schedule#sp11

CARTA HOLDINGSで広告配信プラットフォームを提供しているfluctでは、広告配信のオペレーションを行なう管理画面の開発において、featureブランチ毎に自動デプロイされる環境を用意しています。
オンプレからクラウド、コンテナへと環境は変化し、現在ではAWSのコンテナ実行環境であるECSを使って実現しています。
また、1日10回以上デプロイされるワークフローを支える仕組みや開発者の手による改善、ARM環境対応を行ってきました。
これらについてどのように実現しているかをお話します。
・ featureブランチ毎のルーティングを実現するECSサービスディスカバリ
・ GitHub Actions によるデプロイワークフロー
・ ecspresso を使ったECSサービスのデプロイ
・ BuildKitによるキャッシュ利用とマルチアーキテクチャイメージ作成

CARTA Engineering

May 17, 2022
Tweet

More Decks by CARTA Engineering

Other Decks in Technology

Transcript

  1. 2 自己紹介 • 大渡 裕太 わっさん • 経歴 ◦ 2015年

    旧VOYAGE GROUP新卒入社 • twitter: @yowatari • やって(る|た)こと ◦ オンプレ刷新周り ▪ アップデート系 ◦ オンプレ -> AWS 移行周り ▪ データベースとかとか ◦ データエンジニアリング ▪ 広告効果計測周り ◦ インターン運営 ▪ パフォーマンスチューニング題材
  2. 6 ブランチ環境 • 開発中の機能を確認できる環境 ◦ 開発者だけでなく、ユーザでも確認できるように ◦ ユーザ = 社内の誰か

    ◦ データベース等は共通 • プルリクストを作ると自動かつ継続的にデプロイされる • https://${ブランチ名}.example.com でホストされる • 似たようなものに、Hashicorp Waypoint等がある push hoge https://hoge.example.com
  3. 8 古での仕組み • 単にサーバでやってた時代 ◦ nginx + php-fpm • 素朴な方法

    ◦ 1. git push を webhook で jenkins に通知してスク リプトを実行する(つらみ) ◦ 2. git worktree add 等で指定ブランチを用意する ◦ 3. nginxで server_name からブランチ名を取って いい感じに document root に 2. を指定する
  4. 9 古での仕組み: git worktree + nginx • git-worktree Documentation •

    git worktree add <path> <branch> で指定のパスに指定 のブランチをチェックアウトできる ◦ git worktree add /home/branch/hoge hoge • nginxではserver_nameからdocument rootのパスを決 める
  5. 10 ECS移行 • コンテナに移行することにした ◦ 当初はオンプレ->AWSの移行をゴールに変更の少 ないEC2で稼働させていた ◦ クラウド前提の今、デプロイやミドルウェアをア プリケーション側で面倒見れるようにしたい

    • 移行 ◦ サーバ前提な部分を書き直したり ◦ Dockerイメージのビルド戦略(タグやキャッシュ) • 本番そのものは容易だったが、前述の仕組みが無い ◦ 開発中において無くては困る
  6. 11 余談: ECS化でよかったこと • コンテナの追加や調整等 ◦ 変更は開発者自身で行えている ◦ コンテナ化に際して、すべての設定をアプリのリ ポジトリに揃えている

    ◦ その変更もブランチ環境で確認できる • ECSの下回り部分は詳しい人が見ている ◦ ECS on EC2でやっているので、その部分 ▪ こちらはこちらでスポットインスタンスの利 用などやりたいことがある ◦ VPC等
  7. 14 今の仕組み: サービスディスカバリ • Amazon ECS サービスディスカバリ | Amazon Web

    Services ブログ • サービス定義の serviceRegistries で設定可能 ◦ CloudMap サービスを指定する ◦ ヘルスチェックに基づいて、自動でRoute53のレ コードが更新される (サービス名.名前空間.)
  8. 18 Github Actions: composite • Creating a composite action -

    GitHub Docs ◦ .github/actions/*/action.yaml で定義 ◦ awsのクレデンシャル取得周りやDockerでのビル ド周りなどの共通なステップで利用してます
  9. 21 余談: arm 対応 • Apple Silicon や AWS Graviton

    2 の登場でarm対応に迫ら れがち • マルチアーキテクチャイメージで対応 ◦ 多少調整は必要になったが、比較的ラク ▪ mysqlイメージのarm版が当時は無かったり • ビルド時のエミュレーションは遅いので、キャッシュを最 大限利用するよう気を使う ◦ BuildKit (docker buildx) もしくはdocker/build-push- action ▪ cache-from/to type=gha ▪ 前者では crazy-max/ghaction-github-runtime も併 用
  10. 22 まとめ • プルリクストを作ったらデプロイされる環境について 話ました ◦ ECSサービスディスカバリ便利 • 自走できる環境作り ◦

    ミドルウェアを含めた変更も自身でトライアンド エラーができるようになった ◦ CIの速度が開発体験を律速するので、CIへの関心 も高まった気がする