😸

Cloud Workstations・Gemini Code Assistを活用した開発環境構築

Cloud Workstations・Gemini Code Assistを活用した開発環境構築

はじめに

こんにちは。バンダイナムネクサス データ戦略部の山野です。

今回は、Google Cloudのサービスを活用してエンジニア向けの開発環境を刷新した事例をご紹介します。私たちの課題と、それをどう解決したかについて、具体的なポイントを深掘りしていきます。

経緯と背景

エンジニア向けの開発環境を、ユーザーと管理者の両方にとってより使いやすく、効率的にしたいという要望がありました。そのため、以下の点に注目して改善を試みました。

  1. マネージドサービスを活用した運用の効率化:

    弊チームでは、これまでエンジニア向けの開発環境としてVM環境を提供してきました。しかし、運用コストの増大が課題となっていました。こうした背景から、より効率的でコスト効果の高い開発環境を模索した結果、Google CloudのマネージドサービスであるCloud Workstationsへの移行を決定しました。

    詳細な背景は以下です。

    • 以前の状況

      • 従来の開発環境は「ゴールデンイメージパターン」を採用し、Packer・Ansible・自作CLI・Terraformなどを利用していました。これにより迅速な環境構築が可能でしたが、ディスクの更新作業ではPackerを使っていても、VMの更新時にディスクを丸ごと入れ替える必要があり、その際にファイルを一時的に退避する必要がありました。また、Pythonパッケージの複雑な依存関係や、要求に応じてグローバルインストールパッケージを追加していった結果、依存関係が複雑化しました。
    • Cloud Workstationsの採用背景

      • 状況が変わり、VMよりもさらにポータブルなDockerが普及したり、利用者のリテラシーが向上して自分でpip installやpoetryを利用してPythonパッケージを管理することが一般的になりました。これにより、共通環境として提供するパッケージを減らすことができるようになり、グローバルpipにインストールするパッケージを減らすことが可能になりました。また、分析からプロダクションへのシームレスな移行を目指す中で、conda環境の相性が悪くなり、condaからの脱却が必要となりました。このタイミングでCloud Workstationsが発表され、後続の章に記載のメリットもあったため、移行することにしました。
    • 選定技術の推移

      項目 移行前 移行後
      イメージ作成 Packer Docker
      パッケージ管理 Ansible Docker
      バージョン管理 GCEディスク Artifact Registry
      Iac Terraform Terraform
      一時的な構成変更 自作CLI Workstations GUI
      共有ストレージ GCS Fuse GCS Fuse
  2. 生成AIを活用した開発の効率化:

    生成AIの登場は様々な領域で変革をもたらしていますが、ソフトウェア開発の現場でも同様です。生成AIを利用することで、コードの自動生成やデバッグ作業の効率化など、エンジニアの業務を大きくサポートすることが可能となりました。そこで、Gemini Code Assistを導入し、より効率的な開発環境の構築を目指しました。

Cloud Workstationsの導入による運用の効率化

ではまず、Cloud Workstationsの概要とその魅力についてお話しします。

Cloud Workstationsとは

Cloud Workstations は、Google Cloud 上で、事前構成された、カスタマイズ可能で安全なマネージド開発環境を提供します。Cloud Workstations には、ブラウザベースの IDE、複数のローカルコード エディタ(IntelliJ IDEA Ultimate、VS Code など)または SSH 経由でアクセスできます。 開発環境を手動で設定する代わりに、再現可能な方法で環境を指定するワークステーション構成を作成できます。

Cloud Workstations のドキュメント

管理者目線でのメリット

  • 管理の効率化: マネージドサービスを利用することで、インフラ関連の運用コストを削減できます。
  • 権限管理: ユーザーが自分のインスタンスのみを操作できるようにできます。
  • 自動スリープ機能: インスタンスが無駄に稼働しないようにし、コスト削減を実現できます。
  • 設定の反映タイミング: 設定の反映はユーザがインスタンスを再起動したタイミングなので、調整コストを削減できます。

ユーザーからの要望とCloud Workstationsによる対応

  • VS Codeの利用: ユーザーは使い慣れたローカルのVS CodeからWorkstationsに接続することができます。もちろん、クイックにブラウザベースでCode OSS(VS Codeのオープンソース版)を利用することもできます。ちなみに、Vertex AI Workbenchを選択しなかった理由は、ユーザーの要望がノートブックよりもVS Codeの使用に重きを置いていたからです。
  • Docker in Dockerの利用: Workstationsはコンテナとして動作していますが、dockerコマンドでさらに別のコンテナを起動できます。ユーザが使い慣れたDockerを使って各自で環境構築するので、グローバルpipにインストールするパッケージを減らしてシンプルな構成にできます。
  • スペック調整: 必要に応じてスペックをユーザ自身で変更し、リソースを効率的に利用することができます。(※注意点を後続に記載。基本的な思想としては設定は一元管理されます。)
  • GPUの利用: GPUのドライバなどがあらかじめセットアップされており、手間なくGPUを利用できます。
  • カスタム環境の要求: カスタムコンテナを指定できるため、事前に必要なライブラリなどをインストールし、自社の要件に合わせた開発環境をカスタマイズできます。

WorkStationsを利用する上での注意点

  • 設定は一元管理される:

    • Workstationごとに設定を行うのではなく、Configuration機能を使ってマシンタイプ、スタートアップスクリプト、自動停止設定などを一元管理します。これにより、各Workstationを同じConfigurationから起動することで、エンジニアが統一された環境で作業できるようになり、チーム内の一貫性が保たれます。結果として、環境の違いによるバグの発生を防ぎ、開発プロセスの標準化と効率化が実現できます。
    • Configurationの変更は再起動時に反映されるため、管理者が設定変更を管理しつつ、ユーザーが反映のタイミングをコントロールできるのも利点です。
    • なお、弊社ではユーザーごとに異なるマシンタイプのニーズがあったため、ユーザーごとに個別のConfigurationを作成することにしました。
  • クラスタに対して課金される:

    • Cloud Workstationでは、Workstation自体だけでなく、クラスタ(コントロール プレーン)にも課金が発生します。2024年7月時点では、クラスタに対して1時間あたり$0.20の料金がかかります。
    • https://cloud.google.com/workstations/pricing?hl=ja
  • ディスクごとの永続化について:

    • /homeディレクトリに対してPersistent Diskがアタッチされ、データが永続化されます。一方、それ以外のデータはVM停止時に削除されるので注意が必要です。特に、/usrディレクトリは永続化されないため、ユーザーがapt-getでインストールしたパッケージは、VM再起動時に削除されてしまいます。
  • Terraformで構築する時にディスクマウントするには:

    • GUIから構築する場合は特に意識する必要はありませんが、Terraformを使用する場合はディスクが自動的にマウントされないため、Terraformのコード内で明示的にディスクのマウントを指定する必要があります。
    {
      "mountPath": "/home",
      "gcePd": {
        "sizeGb": 200,
      }
    }
    
  • SSHセッションに環境変数を渡すには:

    • GUIエディタを起動したときとSSHセッションからbashを起動したときでは挙動が異なり、configで設定した環境変数がデフォルトではSSHセッションには反映されません。環境変数を後述の起動スクリプトに渡す際、これに気付かずに問題が発生することがあります。詳細はこちらを参照

Gemini Code Assistの導入による開発効率向上

Gemini Code Assist とは

Gemini for Google Cloud Code Assist は、開発チームがソフトウェア開発ライフサイクル全体を通してアプリケーションを構築、デプロイ、運用するための AI を活用した支援機能を提供します。

IDE(VS Code、IntelliJ、Cloud Workstations、Cloud Shell エディタなど)で Gemini Code Assist を使用すると、多くの一般的な言語で AI を活用したコーディング アシスタンスを受けることができます。コードを記述してコードを完成させ、コメントから完全な関数またはコードブロックを生成して、単体テストを生成し、コードのデバッグ、理解、文書化の支援を得ることができます。

https://cloud.google.com/gemini/docs/codeassist/overview?hl=ja

利用料金について:Gemini Code Assistは、プロジェクトの Gemini Code Assist を設定するに記載されている通り、一般的なGoogle Cloudサービスに見られるような従量課金体系ではなく、年/月単位でのサブスクリプションモデルになっています。金額についてはGemini for Google Cloud の料金 に記載されています。

Gemini Code Assist 利用ルール

生成AIをコードアシストとして利用する際には、権利侵害のリスクがあります。Geminiは引用情報を保持するため、どの部分が引用であるかを明確に判断できます。

また、設定項目 cloudcode.duetAI.recitation.maxCitedLength を0に設定することで、引用を行わずオリジナルなコードのみを生成するように変更できます。弊チームではこの設定を利用し、権利侵害対策をするようにしています。

Gemini Code Assist 利用方法・Tips

Gemini Code Assist によるコード を参考に、Gemini Code Assistを利用して効率的に開発をしています。

例えば、選択したコードを使用してチャットで Gemini Code Assist に指示する(説明してもらう、テスト生成してもらう等)、コーディング時にインラインの候補を受け取る等があります。

下記のように、リファクタリングされたコードの差分を表示したり、適用するか否かを画面上で選択することができます。

Gemini Code Assistをより効果的に活用するためには、いくつかのTipsがあります。

例えば、 プロンプトにプロジェクトの開発規約(コーディングスタイル、命名規則、コメント規定など)を明記することで、LLMによるコード生成がプロジェクトのスタイルに沿うようになります。

他にも、執筆時点ではGemini Code AssistにはリポジトリごとLLMに読んでもらえるような機能がないため、こちらなどを参考にソースコード全体をプロンプトに含めることで、LLMがコードの文脈を正確に理解し、適切な補完や生成が可能になります。

まとめ

このように、Google Cloudのサービスを活用することで、高効率で柔軟な開発環境を構築することができました。これからも、エンジニアと協力しながら、より良い開発環境を目指していきます。

Discussion