2023年9月21日 GitHub Actions Meetup Tokyo #2 にて発表
セルフホストランナーとインターネットとの間の転送量を削減している話サイボウズ株式会社 ⽣産性向上チーム佐藤 礼於1
View Slide
佐藤 礼於▌さとう れお、さとれお など▌Twitter(𝕏?), GitHub: @defaultcf▌Bluesky: @default.cf▌2022年10⽉にサイボウズ⽣産性向上チームにジョイン2
セルフホストランナー使ってますか︖▌ランナーから社内ネットワークにアクセスしたい▌スペックをカスタマイズしたランナーを使いたい▌プリインストールするソフトウェアを選びたい▌GitHub Enterprise Server で GitHub Actions を使いたい↓▌セルフホストランナーを⽴てて運⽤︕3
サイボウズ ⽣産性向上チームの運⽤するセルフホストランナー▌philips-labs/terraform-aws-github-runner を使ってスケーラブルなセルフホストランナーを運⽤している▌詳しくは…n philips-labs/terraform-aws-github-runner でオートスケールするセルフホストランナーの構築・運⽤ - Cybozu Inside Out | サイボウズエンジニアのブログ4
構成図(簡易版)5
セルフホストランナーからインターネットへの転送量が多い︕▌EC2 インスタンスはプライベートサブネットにある▌ランナーからインターネットとの通信には NAT ゲートウェイを通る↓▌転送量が多いほどお⾦がかかって⼤変6これ︕
どこでお⾦がかかっているか調べてみた▌VPC フローログに対して Amazon Athena を使って分析を⾏った7これ︕
8INNER JOINフローログから条件に合致するログを得るRoute53の名前解決ログを⽤意
転送量を分析した結果…▌主に⼤きいのは3つn Apache Mavenn Amazon Corretton Docker Hub9
転送量対策▌Apache Mavenn ワークフローでキャッシュする▌Amazon Corretton ランナーにキャッシュを含める▌Docker Hubn プロキシを使ってキャッシュする↓▌各種キャッシュによる転送量削減を試みる 10
Apache Maven との転送量を削減11
Apache Maven▌Java のプロジェクト管理ツール▌https://repo.maven.apache.org は公式の Maven のリポジトリ▌開発チームはワークフロー内でビルドを⾛らせ、その際に依存関係のパッケージを Maven からダウンロードしている▌ワークフローでキャッシュを使っていないため、通信量を⾷っているんじゃないか︖▌確かめてみる12
Maven のパッケージをキャッシュしてない︖▌org, リポジトリを横断して maven パッケージをインストールしている箇所を検索▌キャッシュしていないところがいくつかあった↓▌キャッシュするようにお願いしたら、通信量上位から maven が消えた︕13
Amazon Corretto との転送量を削減14
Amazon Corretto▌AWS が提供する OpenJDK ディストリビューション▌Corretto 17 は 194 MB ある▌開発チームはワークフロー内で actions/setup-java を使ってCorretto をダウンロードする▌ダウンロードの度に通信が発⽣し、お⾦がかかっている▌キャッシュを検討する 15
actions/setup-java のキャッシュ機能を考える▌https://github.com/actions/setup-java▌Java の実⾏環境を⽤意してくれる GitHub Action▌ダウンロードしたファイルをキャッシュして次回使う機能はある▌ただ毎回作り直されるランナーなので、このキャッシュ機能を活かすことができない16
どうやってキャッシュさせる︖▌AMI に予めキャッシュを含めるn actions/setup-java がどのようにキャッシュを読むかを調べて、そこにキャッシュを置いておく17ココ
キャッシュを置いた結果18キャッシュできるようになった︕
Docker Hub との転送量を削減19
Docker Hub▌Docker 社が運営するコンテナレジストリ▌コンテナを使うジョブがあり、ジョブが⾛る度に Docker Hub からイメージをダウンロードしている▌これをキャッシュするようにする20
どのように削減するか▌① プライベートの Container Registry のキャッシュサーバーを⾃前で⽤意するn メリット: ユーザーにコードを変更してもらわずに移⾏できるn デメリット: キャッシュサーバーの構築・運⽤が必要になる21
どのように削減するか▌② ECR の Pull Through Cache を使うn メリット: キャッシュサーバーの構築・運⽤が不要n デメリット: ユーザーにコード中のイメージ名を変更してもらう必要がある22
転送量削減の進捗▌✅ Apache Mavenn 開発チームに依頼し、ワークフローでキャッシュするようになった▌✅ Amazon Corretton AMI 側でキャッシュするようにした▌🔲 Docker Hubn 検討段階23
転送量削減に成功︕▌Maven と Corretto が上位から消えた︕24
今後の課題▌新しい Corretto のバージョンが増えたら⾃動でキャッシュするn 現状はハードコーディングしているn 最新のバージョンをキャッシュに⾃動で加えたい▌Docker Hub のキャッシュを導⼊するn それぞれのメリット・デメリットを検討するn 実際に導⼊したい25
まとめ▌VPC フローログを分析してランナーからインターネットへの転送量を分析した▌対策を検討して⼀部実施したn Apache Maven のパッケージをキャッシュするようにしたn actions/setup-java のキャッシュ機能を活⽤して Corretto をランナーに予め⼊れるようにしたn Docker Hub からのイメージ転送量削減について検討した26