このページでは、決定的なインスタンス テンプレートを作成する条件と理由について説明します。確定的なインスタンス テンプレートを使用すると、インスタンス テンプレートのデプロイ時に、インスタンスにインストールするサードパーティのサービスまたはアプリのタイプを明確にできます。確定的なインスタンス テンプレートを作成することにより、インスタンス テンプレートのあいまいさや予期せぬ動作を最小限に抑えることができます。
確定的なインスタンス テンプレートを作成する理由
通常、インスタンス テンプレートのプロパティは可能な限り明示的で確定的にすることをおすすめします。サードパーティのサービスをインストールまたは使用するインスタンス テンプレートで起動スクリプトを使用する場合は、インストールするアプリのバージョンなど、それらのスクリプトによって明示的な情報が提供されるようにしてください。Compute Engine はテンプレートで定義された情報のみに依存しており、参照されているサードパーティのサービスを制御することはできません。テンプレートが曖昧な場合、インスタンス テンプレートが予想外の動作をすることがあります。
たとえば、次のコマンドで、apache2 をインストールするとともに外部サーバー上でホストされたファイルを使用する起動スクリプトを含む、インスタンス テンプレートを作成するとします。
gcloud compute instance-templates create example-template-with-startup \
--image-family debian-9 \
--image-project debian-cloud \
--metadata startup-script='#! /bin/bash
sudo apt install -y apache2
scp myuser@108.59.87.185:index.php /var/www/'
この起動スクリプトには 2 つの潜在的な問題があります。
- このスクリプトはインストールする apache2 のバージョンを明示的に定義しておらず、
apt
リポジトリにある使用可能な現行バージョンに依存しています。 - このスクリプトはサードパーティ上でホストされているバージョン指定のないファイルに依存しています。このファイルは、インスタンス テンプレートが前回使用された後に変更されている可能性があります。
オートスケーラーを使用する場合、インスタンス テンプレートが確定的でなければ、新しいインスタンスが異なる構成(バージョンの異なる apache2 など)でマネージド インスタンス グループに追加される可能性があります。
同様に、このテンプレートをマネージド インスタンス グループに適用し、グループを別のテンプレート サービスに更新して、以前のテンプレートにロールバックすることにした場合、インスタンスが起動時に常に最新バージョンをフェッチするため、更新前とは異なるバージョンの apache2 または index.php ファイルを使用するインスタンスが存在することになるかもしれません。
あいまいなまたは予期せぬインスタンス テンプレートの動作の回避
テンプレートの予期しない動作を防止するため、以下のいずれかの方法を使用してください。
コンテナ用に最適化されたイメージ、または Docker タグの付いた Docker を使用します。たとえば、Docker イメージの新しいビルドに毎回新しいタグを割り当て、そのタグをインスタンス テンプレートで(デフォルトの最新タグの代わりに)使用することをおすすめします。コンテナ用に最適化されたイメージについては、マニフェスト ファイル内でイメージの特定のビルドを明示的に参照できます。下の例では、「version_2_1_3」というタグの付いたバージョンの Docker イメージ「myimage」を使用しています。
version: v1beta2 containers: - name: simple-echo image: myimage:version_2_1_3 [ rest of your manifest file ]
テンプレートのイメージとして使用するカスタム イメージを作成します。これは、すべてのインスタンスが必ず同一になるため、起動スクリプトよりも好ましい方法です。起動スクリプトを使用する場合は、配布パッケージの更新後に結果が変わる可能性があります。プロトタイピングや迅速な開発にはインスタンス テンプレートの起動スクリプトを使用し、本番環境に対応できるサービスをデプロイする準備ができたらカスタム イメージを使用するようにしてください。
起動スクリプトを使用する場合は、スクリプトを更新して確定的なものにすることを検討してください。たとえば、以前のテンプレートの新バージョンを作成して、次のように確定的な起動スクリプトを指定します。
gcloud compute instance-templates create example-template-with-startup-2-1-3 \ --image-family debian-9 \ --image-project debian-cloud \ --metadata startup-script='#! /bin/bash sudo apt install -y apache2=2.2.20-1ubuntu1 scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
ここで、「version_2_1_3」はサービスのバージョン 2.1.3 用の PHP スクリプトが格納されたサブディレクトリです。