AWSを使ったクラウドUnityビルド環境の構築~ライセンスサーバー構築編~

エンジニアの岡村です。

最近まで、弊社でのUnityを使ったクライアント開発では、社内の物理サーバーに立てたgitとJenkinsを使ってバージョン管理及びCIを行っていました。GitHubは主にサーバー開発に使われており、Unityのコードは検証用のような小さなものを置いている位の状態でした。

しかし、UnityプロジェクトのGitHubでの管理が本格的に始まり、それに合わせてCI/CD環境もクラウド上に構築する機運が高まってきました。

この機会にCIの構成を見直し、より便利なUnityクライアントのCI環境の構築を目指して試行錯誤したので、何回かに分けてその内容をお届けしたいと思います。

Unityのフローティングライセンス

f:id:Sokuhatiku:20220328213403p:plain

Unityには通常のユーザーID, パスワード, シリアルナンバーで認証するライセンスのほかに、ライセンスサーバーを自分で建ててそこにライセンスを登録し、クライアントがUnity起動時に要求し、終了時に返却し、マシン間で限られたライセンスを融通できる、フローティングライセンス形態のライセンスが存在します。

unity.com

このライセンス形態は、Unityを実行するマシンに共通の設定ファイルを配置するだけで使えるので、Unityを実行するマシンを複数セットアップする場合に便利です。ただし、現状では、後述するUnity Build Server ライセンス以外はこの形態では提供されていないようです。

フローティングライセンスとして提供されているUnity Build Server ライセンスは、名前の通りUnityプロジェクトをビルドするサーバー向けのライセンスで、エディタをバッチモード以外で起動できないという制約がある代わりに、1シート当たりの値段を約1/3に抑えることができます。

Unity Pro Unity Pro Build Server
ライセンス形態 シリアルキー フローティング
認証に必要な情報 [ID, PASS, シリアルキー]
or
[手動ライセンスファイル]
認証サーバーのアドレス
価格 217,800円/年 79,200円/年
Editor GUI ×

CIを回す上ではGUIを開けないのは特にデメリットではなく、フローティングライセンスのセットアップの楽さ、値段の安さのメリットがあった為、このライセンスを使ってCI環境を作ってみることにしました。

ライセンスサーバーの構築

フローティングライセンスはクライアントの構築は楽ですが、自分でライセンスサーバーをホスティングする必要があります。実際に構築作業を行った内容をこれから紹介しますが、基本的にドキュメント通りにやれば構成できるので細かい手順は省略しつつ、要所要所を紹介しておきます。

ちなみに、構築にはAWSを選択しました。これは単純にサーバーを触るメンバーでAWSに慣れている人が多かった為です。

EC2インスタンスを立てる

f:id:Sokuhatiku:20220328215243p:plain

今回は上図のような最低限の構成でサーバーを構築します。SSHはきちんとIP制限を掛け、それ以外のトラフィックは許可しないようACLやセキュリティグループを設定しましょう。

ライセンスサーバーを実行するEC2のインスタンスタイプはt2.micro、HDD容量は10GBもあればまず不足することはないでしょう。OSはAmazon Linux2を選択しました。ライセンスサーバーはWindows/Linuxに対応しているので、どちらでも構いません。

ライセンスサーバーをセットアップする

ライセンスサーバーのセットアップの際には、サーバーをUnity IDポータルに登録し、生成したライセンスファイルをサーバーに読み込ませる必要があります。一度サーバーにライセンスシートを割り当てると手動では解除できず、リセットするにはUnity社に問い合わせる必要があるので注意してください。

まずはUnity公式からライセンスサーバーの実行ファイルとドキュメントを入手します。Unity Build Serverライセンスが利用可能であれば、Unity IDポータルから > 組織 > サブスクリプションとサービス > Unity Pro (or Enterprise) Build Server > ライセンスサーバーの設定 > Download new server と進むことで実行ファイル、及びドキュメントをダウンロードできます。 f:id:Sokuhatiku:20220329172612p:plain f:id:Sokuhatiku:20220328175813p:plain f:id:Sokuhatiku:20220328175836p:plain

このファイルはUnity IDポータルにログインしないとダウンロードできない為、一度作業PCにダウンロードしてからEC2インスタンスにアップロードするか、EC2インスタンス内でUnity IDポータルにログインする必要があります。

自分は今回のセットアップにはブラウザを使ったEC2 Instance Connectを利用しており、そのままではSCPによるファイル転送ができなかった為、一度手元にダウンロードしてからngrokを使ってEC2インスタンス内でwgetする方法を取りました。

zipをEC2インスタンス内にダウンロードしたら、ファイルを/opt/UnityLicensingServer/以下に解凍し、一緒にダウンロードしたドキュメントのQuickStartGuideの通りにセットアップを進めて下さい。

細かい手順はドキュメントに丁寧に書いてある為ここでの紹介は省きますが、自分が構築した際にハマったポイントや注意点を紹介します。

注意:セットアップ時に使用するユーザー権限について

/opt/UnityLicensingServer/フォルダをchown -Rでec2-user(ログイン中のユーザー)に所有権を移し、マニュアル内で指示されていない限りnot sudoで進めて下さい。./Unity.Licensing.Server setup はsudoでも動くのですが、そうした場合設定ファイルがrootユーザーの場所に生成され、かつサービスとして実行する際にセットアップで使っているユーザーのhomeを見に行くので、設定ファイルが読み込めず再起動を繰り返す状態になってしまいます。

注意:セットアップ時に使用するサーバーの情報について

ライセンスサーバーを構築する際、これらの情報がサーバー情報としてregistration-request.xmlに記録されます。

  • MACアドレス
  • プラットフォーム(Linuxの場合はUnix)
  • プロセッサの数
  • マシン名(hostname)

Unity ID Portalにサーバー情報をアップロードした後にEC2上のライセンスサーバーを再構築する際は、これらを変化させないように気を付けてください。

MACアドレスについては、EC2インスタンスが利用しているネットワークインターフェイスを再利用することで別のマシンに持ち越すことができます。デフォルトではEC2インスタンスを終了するとネットワークインターフェースも削除されてしまうので、忘れずに削除されない設定に変更しておきましょう。

f:id:Sokuhatiku:20220328193632p:plain

また、マシン名の方はこの辺りのページを参考にすると変更することが可能です。

注意:registration-request.xmlのダウンロードについて

前述のとおり自分はブラウザ上のEC2 Instance Connectを使ってセットアップを行っていたのですが、setupコマンドの実行後に吐き出されるregistration-request.xmlをダウンロードするのが面倒だった為、catで吐き出してコンソールをコピペしていました。するとその際シークレットキーに改行が入ってしまい、それが原因でキーの不一致が発生してライセンスの登録が出来ないというトラブルに陥りました。きちんとファイル転送が使える手段で接続している場合は全く考慮する必要はありませんが、一応ハマりポイントとして書き残しておきます。

次回予告

ライセンスサーバーの構築ができたら、同じサブネット上に別のインスタンスを立ててUnityをインストールし、ドキュメントで指示されている通りにservices-config.jsonを置けばUnityをバッチモードで実行出来るようになります。しかし、Unityを動かすマシンを常時起動していると料金がかかり、手動で落とすと手間がかかります。その為、次回は必要になったタイミングでEC2インスタンスを起動する仕組みをご紹介します。

synamon.hatenablog.com