AWSで動かすGitLab CI runner の改善

AWS で GitLab Runnerを動かしているのですが、いろいろ改善している話です。

dockerhub registry mirror

みなさんご存じの通り、 dockerhubは、anonymous pull に制限をかけました。CIで dockerhubのイメージを利用していると、すぐ制限にひっかかります。

また、近いほうがimage pull が速いということもあります。

そこで、 dockerhub registry の mirrorを設置しました。

詳細は Docker Registry | Docker Documentation を見ていただくとして。

AWSなので、ストレージにはS3を利用しています。 s3 を利用する際、

package manager

JAVA系を利用していると maven central からパッケージをダウンロードしてくることが多いのですが、 maven central には dockerhub同様 ダウンロード制限がかかっており、 CIで大量にダウンロードしていると、制限にひっかかります。

そこで、パッケージマネージャ Nexus Repository OSS - Software Component Management | Sonatype を利用しています。

maven centralのほかにも、よく使うものを mirrorしておくことで、安定した環境を用意しています。

vpc endpoint

ci runner 自体に外からアクセスする必要はまずないので、 private subnet に置いています。 すると、 s3 からデータを取得するたびに、nat-gatewayを経由することになり、AWS内通信なのに通信料がすごくかかる。

ということもあり s3 のvpc endpoint を設置しています。 上記 dockerhub registry mirror のほか、 AWS ECRからの image pull もs3 経由ですので、それなりに効果があります。

vpc endpoint service

GitLab Server と CI runner は、AWSの別アカウントで管理しています。そのため、 CI runner から GitLab Serverへの通信がやはり internet経由となりnat-gateway を経由しており、ここでも通信料がかさんでしまう状態なので

GitLab Serverを vpc endpoint service として別アカウントに公開できるようにし、 CI runner の動いているアカウントで vpc endpoint として 利用しています。

auto scale

CI runner については Autoscaling GitLab Runner on AWS EC2 | GitLab のドキュメントに従い、docker-machine によるSpot instance を利用した auto scale で動かしています。

終わりに

値段とスケーリング、速度に関して、改善を行っている現状を記載しました。

これからもいろんな状況に応じて、いろんな改善を行っていくつもりです。