blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2021.05.25 インターンレポート

SDKのドキュメントをGKEでホストする

by negimaq

#docker #google-cloud #gke #python #terraform #helm #helmfile #circleci

はじめに

こんにちは、システム本部データ統括部AI基盤部でインターンをしている横田 ( @negimaq ) です。 普段は主に、バックエンド開発とインフラの技術に関連する個人開発や、大学で深層学習を用いた画像処理の研究を行っています。 今回のインターンでは、 Hekatoncheir というDeNA社内の機械学習基盤を構築するプロジェクトに参加しました。 Hekatoncheirでは、データサイエンティストや開発者が利用するためのPython SDKを提供しているのですが、社内での利用が広まってきたこともあり、APIリファレンスを含む利用方法のドキュメントを充実させたいという課題がありました。 そこで、Pythonで開発されたSDKのドキュメントをSphinxで生成し、GKE上でホストするフローをコード化するタスクに取り組みました。 この記事では、その内容を簡単に紹介します。

ドキュメントをホストするGCPリソースの選定

Hekatoncheirでは、プロジェクト全体をGCP上で運用しています。 それに合わせてドキュメントをホストするリソースもGCPを利用した方が管理がしやすいことから、以下のGCPリソースが候補となりました。

  • Cloud Storage
  • Cloud Run
  • App Engine
  • Compute Engine
  • GKE

まず、要件として限定的にドキュメントページを公開するため、接続元IPアドレスの制限もしくはIAP認証を実現する必要があります。 Sphinxによって生成されるドキュメントはHTMLファイルなどの静的ファイルですが、適切なアクセス制限を行うことが難しいという理由でCloud Storageのバケットを公開する方法は選択しませんでした。 また、App EngineやCompute Engineのファイアウォール設定でアクセス制限を実現するという選択肢もありましたが、チーム内で実験的にGKEを利用する流れがあったため、技術選定も含めてGKE上でドキュメントをホストするタスクを任せていただきました。

Sphinxによるドキュメントの生成

Sphinx はPythonで書かれたドキュメント自動生成ツールです。 Pythonパッケージのリファレンスを生成する場合は、それぞれのクラスや関数のdocstringを書くことでその内容を反映することができます。 SDKのリリースごとに更新されるドキュメントがあることで、開発を行う際にdocstringを書く動機を作ることが今回のタスクの目的でした。

Terraformによるリソース管理のコード化

Hekatoncheirプロジェクトでは、ほぼ全てのGCPリソースをTerraformで管理しています。 Terraformの terraform-provider-google プラグインを使用してGCPリソースの管理をコード化していたため、まずはその使い方のキャッチアップを行いました。

続いて、今回のタスクで必要となるGKE Autopilotのクラスタとそれに付随するVPCなどのリソースや、ドキュメントホスト用のDockerイメージを管理するArtifact RegistryのリポジトリをTerraformにより追加しました。 特にGKE Autopilotについては、今回のインターン期間中にリリースされたterraform-provider-google v3.63.0 で新たにTerraformから設定できるようになったため、急遽そちらを利用することにしました。 その際、新しい機能であったこともあり、公式リファレンスの少ない情報から試行錯誤しなければならない苦労もありました。

HelmfileによるKubernetesマニフェストの管理

作成したGKEクラスタにアプリケーションをデプロイするためには、コンポーネントの設定をマニフェストファイルに記述する必要があります。 複数のサービスをGKEクラスタにデプロイする場合、各サービスごとの設定をHelm Chartにまとめることで、マニフェスト管理の煩雑さを避けることができます。 また、Helmfileを使用することで複数のHelm Chartを管理し、デプロイすることができます。

今回のタスクでは、ドキュメントをホストするサービスをHelm Chartとして定義しました。 そして、NGINX Ingress Controllerを使用し、接続元IPアドレスによるアクセス制限と、URLのパスに対応したサービスに転送する設定を行いました。

CircleCIによるドキュメント生成の自動化

SDKの新バージョンをリリースする際に、ドキュメントを最新のものに更新する必要があります。 今回のタスクでは、SDKを開発しているリポジトリにリリースタグの付いたコミットがpushされたときをトリガーとして、CircleCI上でドキュメントの生成と、ドキュメントホスト用のDockerイメージのビルド、Artifact Registryへのpushをする設定を行いました。

最後に

メンターをしてくださった藤原さん ( @shuhei_fujiwara )、開発チームの川瀬さん、鴨志田さん、林さんには技術面で手厚くサポートしていただき、経験したことがないタスクを順調に進めることができました。 また、加茂さん ( @yurfuwa )、齋藤さんにはキャリア面で相談に乗っていただき、大変勉強になりました。 最後に、インターン期間中に関わってくださった皆様に深く感謝いたします。

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。