Slide 1

Slide 1 text

セルフホストランナーとインターネットとの間の 転送量を削減している話 サイボウズ株式会社 ⽣産性向上チーム 佐藤 礼於 1

Slide 2

Slide 2 text

佐藤 礼於 ▌さとう れお、さとれお など ▌Twitter(𝕏?), GitHub: @defaultcf ▌Bluesky: @default.cf ▌2022年10⽉にサイボウズ⽣産性向上チームにジョイン 2

Slide 3

Slide 3 text

セルフホストランナー使ってますか︖ ▌ランナーから社内ネットワークにアクセスしたい ▌スペックをカスタマイズしたランナーを使いたい ▌プリインストールするソフトウェアを選びたい ▌GitHub Enterprise Server で GitHub Actions を使いたい ↓ ▌セルフホストランナーを⽴てて運⽤︕ 3

Slide 4

Slide 4 text

サイボウズ ⽣産性向上チームの運⽤するセルフホストランナー ▌philips-labs/terraform-aws-github-runner を使ってスケーラブ ルなセルフホストランナーを運⽤している ▌詳しくは… n philips-labs/terraform-aws-github-runner でオートスケール するセルフホストランナーの構築・運⽤ - Cybozu Inside Out | サ イボウズエンジニアのブログ 4

Slide 5

Slide 5 text

構成図(簡易版) 5

Slide 6

Slide 6 text

セルフホストランナーからインターネットへの転送量が多い︕ ▌EC2 インスタンスはプライベートサブネットにある ▌ランナーからインターネットとの通信には NAT ゲートウェイを通る ↓ ▌転送量が多いほどお⾦がかかって⼤変 6 これ︕

Slide 7

Slide 7 text

どこでお⾦がかかっているか調べてみた ▌VPC フローログに対して Amazon Athena を使って分析を⾏った 7 これ︕

Slide 8

Slide 8 text

8 INNER JOIN フローログから条件に 合致するログを得る Route53の名前解決ログ を⽤意

Slide 9

Slide 9 text

転送量を分析した結果… ▌主に⼤きいのは3つ n Apache Maven n Amazon Corretto n Docker Hub 9

Slide 10

Slide 10 text

転送量対策 ▌Apache Maven n ワークフローでキャッシュする ▌Amazon Corretto n ランナーにキャッシュを含める ▌Docker Hub n プロキシを使ってキャッシュする ↓ ▌各種キャッシュによる転送量削減を試みる 10

Slide 11

Slide 11 text

Apache Maven との転送量を削減 11

Slide 12

Slide 12 text

Apache Maven ▌Java のプロジェクト管理ツール ▌https://repo.maven.apache.org は公式の Maven のリポジトリ ▌開発チームはワークフロー内でビルドを⾛らせ、その際に依存関係のパッケージ を Maven からダウンロードしている ▌ワークフローでキャッシュを使っていないため、通信量を⾷っているんじゃないか︖ ▌確かめてみる 12

Slide 13

Slide 13 text

Maven のパッケージをキャッシュしてない︖ ▌org, リポジトリを横断して maven パッケージをインストールしている箇 所を検索 ▌キャッシュしていないところがいくつかあった ↓ ▌キャッシュするようにお願いしたら、通信量上位から maven が消えた︕ 13

Slide 14

Slide 14 text

Amazon Corretto との転送量を削減 14

Slide 15

Slide 15 text

Amazon Corretto ▌AWS が提供する OpenJDK ディストリビューション ▌Corretto 17 は 194 MB ある ▌開発チームはワークフロー内で actions/setup-java を使って Corretto をダウンロードする ▌ダウンロードの度に通信が発⽣し、お⾦がかかっている ▌キャッシュを検討する 15

Slide 16

Slide 16 text

actions/setup-java のキャッシュ機能を考える ▌https://github.com/actions/setup-java ▌Java の実⾏環境を⽤意してくれる GitHub Action ▌ダウンロードしたファイルをキャッシュして次回使う機能はある ▌ただ毎回作り直されるランナーなので、このキャッシュ機能を活かすこと ができない 16

Slide 17

Slide 17 text

どうやってキャッシュさせる︖ ▌AMI に予めキャッシュを含める n actions/setup-java がどのようにキャッシュを読むかを調べて、そこ にキャッシュを置いておく 17 ココ

Slide 18

Slide 18 text

キャッシュを置いた結果 18 キャッシュできるようになった︕

Slide 19

Slide 19 text

Docker Hub との転送量を削減 19

Slide 20

Slide 20 text

Docker Hub ▌Docker 社が運営するコンテナレジストリ ▌コンテナを使うジョブがあり、ジョブが⾛る度に Docker Hub からイメージ をダウンロードしている ▌これをキャッシュするようにする 20

Slide 21

Slide 21 text

どのように削減するか ▌① プライベートの Container Registry のキャッシュサーバーを⾃前で ⽤意する n メリット: ユーザーにコードを変更してもらわずに移⾏できる n デメリット: キャッシュサーバーの構築・運⽤が必要になる 21

Slide 22

Slide 22 text

どのように削減するか ▌② ECR の Pull Through Cache を使う n メリット: キャッシュサーバーの構築・運⽤が不要 n デメリット: ユーザーにコード中のイメージ名を変更してもらう必要があ る 22

Slide 23

Slide 23 text

転送量削減の進捗 ▌✅ Apache Maven n 開発チームに依頼し、ワークフローでキャッシュするようになった ▌✅ Amazon Corretto n AMI 側でキャッシュするようにした ▌🔲 Docker Hub n 検討段階 23

Slide 24

Slide 24 text

転送量削減に成功︕ ▌Maven と Corretto が上位から消えた︕ 24

Slide 25

Slide 25 text

今後の課題 ▌新しい Corretto のバージョンが増えたら⾃動でキャッシュする n 現状はハードコーディングしている n 最新のバージョンをキャッシュに⾃動で加えたい ▌Docker Hub のキャッシュを導⼊する n それぞれのメリット・デメリットを検討する n 実際に導⼊したい 25

Slide 26

Slide 26 text

まとめ ▌VPC フローログを分析してランナーからインターネットへの転送量を分析し た ▌対策を検討して⼀部実施した n Apache Maven のパッケージをキャッシュするようにした n actions/setup-java のキャッシュ機能を活⽤して Corretto をラン ナーに予め⼊れるようにした n Docker Hub からのイメージ転送量削減について検討した 26