アプリケーションをパッケージ化する
この記事では、Service Fabric アプリケーションをパッケージ化し、デプロイの準備をする方法について説明します。
パッケージのレイアウト
アプリケーション マニフェスト、1 つまたは複数のサービス マニフェスト、その他の必要なパッケージ ファイルをデプロイ用の特定のレイアウトで Service Fabric クラスターにまとめる必要があります。 この記事のマニフェスト例は、次のディレクトリ構造でまとめる必要があります。
tree /f .\MyApplicationType
D:\TEMP\MYAPPLICATIONTYPE
│ ApplicationManifest.xml
│
└───MyServiceManifest
│ ServiceManifest.xml
│
├───MyCode
│ MyServiceHost.exe
│
├───MyConfig
│ Settings.xml
│
└───MyData
init.dat
フォルダーには、それぞれの対応する要素の Name 属性と一致する名前が付けられます。 たとえば、MyCodeA と MyCodeB という名前の付いた 2 つのコード パッケージがサービス マニフェストに含まれている場合、各コード パッケージと同じ名前のフォルダーにそれぞれのコード パッケージに必要なバイナリが含まれます。
SetupEntryPoint の使用
SetupEntryPoint を使用する際の一般的なシナリオは、サービス開始前に実行可能ファイルを実行する必要がある場合や、昇格した特権で操作を実行する必要がある場合になります。 次に例を示します。
- サービス実行可能ファイルが使用する可能性がある環境変数の設定と初期化などです。 これは、Service Fabric のプログラミング モデルによって記述された実行可能ファイルだけに限定されません。 たとえば、npm.exe には、Node.js アプリケーションのデプロイに対して構成されているいくつかの環境変数が必要です。
- セキュリティ証明書のインストールによるアクセス制御の設定
SetupEntryPoint の構成方法について詳しくは、エントリ ポイント セットアップ サービスのポリシーの構成に関するページをご覧ください
構成
Visual Studio を使用したパッケージ構築
Visual Studio を使用して、アプリケーションを作成する場合、[パッケージ] コマンドを使用して、前述のレイアウトと一致するパッケージを自動的に作成できます。
パッケージを作成するには、"ソリューション エクスプローラー" でアプリケーション プロジェクトを右クリックして [パッケージ] コマンドを選択します。
パッケージ化が完了したら、[出力] ウィンドウにパッケージの場所が表示されます。 アプリケーションを Visual Studio でデプロイまたはデバッグする場合、パッケージ化の手順は自動で行われます。
コマンド ラインを使用したパッケージ構築
msbuild.exe
を使用して、アプリケーションをプログラムによってパッケージ化することもできます。 これは内部的には Visual Studio で実行されているため、出力は同じです。
D:\Temp> msbuild HelloWorld.sfproj /t:Package
パッケージのテスト
パッケージ構造を PowerShell の Test-ServiceFabricApplicationPackage コマンドを使用して、ローカルで検証することができます。 このコマンドは、マニフェストの解析の問題をチェックし、すべての参照を検証します。 このコマンドは、パッケージ内のディレクトリとファイルの構造的な正確性を検証するだけです。 コードやデータ パッケージのコンテンツのいずれについても検証は行われず、それらがすべてそろっているかどうかは確認されません。
Test-ServiceFabricApplicationPackage .\MyApplicationType
False
Test-ServiceFabricApplicationPackage : The EntryPoint MySetup.bat is not found.
FileName: C:\Users\servicefabric\AppData\Local\Temp\TestApplicationPackage_7195781181\nrri205a.e2h\MyApplicationType\MyServiceManifest\ServiceManifest.xml
このエラーは、 SetupEntryPoint サービス マニフェストで参照される MySetup.bat ファイルがコード パッケージに見つからないことを示しています。 不足しているファイルを追加すると、アプリケーションの検証に合格します。
tree /f .\MyApplicationType
D:\TEMP\MYAPPLICATIONTYPE
│ ApplicationManifest.xml
│
└───MyServiceManifest
│ ServiceManifest.xml
│
├───MyCode
│ MyServiceHost.exe
│ MySetup.bat
│
├───MyConfig
│ Settings.xml
│
└───MyData
init.dat
Test-ServiceFabricApplicationPackage .\MyApplicationType
True
アプリケーションでアプリケーション パラメーターが定義されている場合、それらのパラメーターを Test-ServiceFabricApplicationPackage に渡して適切に検証できます。
アプリケーションがデプロイされるクラスターが明らかな場合は、ImageStoreConnectionString
パラメーターを渡すことをお勧めします。 この場合、パッケージは、既にクラスターで実行されている以前のバージョンのアプリケーションに対しても検証されます。 たとえば、この検証によって、バージョンは同じでコンテンツが異なるパッケージが既にデプロイされているかどうかを検出できます。
アプリケーションが正常にパッケージ化され、検証に合格したら、デプロイ操作を迅速化するためにパッケージを圧縮することを検討してください。
パッケージを圧縮する
パッケージが大きい場合や多数のファイルを含む場合は、短時間でデプロイできるようにこのパッケージを圧縮できます。 圧縮により、ファイル数を減らし、ファイルのサイズを小さくすることができます。 圧縮されたアプリケーション パッケージの場合は、圧縮されていないパッケージと比較して、(圧縮がコピーの一部として実行される場合は特に) パッケージのアップロードに時間がかかる場合があります。 圧縮されたパッケージの場合、アプリケーションの種類の登録と登録解除が高速になります。
デプロイのメカニズムは、圧縮されているパッケージでも圧縮されていないパッケージでも変わりません。 パッケージが圧縮されている場合、パッケージはクラスター イメージ ストアに格納され、アプリケーションが実行される前にノード上で圧縮が解除されます。 圧縮によって、有効な Service Fabric パッケージが、圧縮されたバージョンで置き換えられます。 フォルダーへの書き込みのアクセス許可を与える必要があります。 既に圧縮済みのパッケージの圧縮を実行しても、変化はありません。
CompressPackage
スイッチを指定して PowerShell コマンド Copy-ServiceFabricApplicationPackage を実行すると、パッケージを圧縮できます。 UncompressPackage
スイッチを使用して同じコマンドを実行すると、パッケージの圧縮を解除することができます。
次のコマンドでは、パッケージをイメージ ストアにコピーせずに圧縮しています。 必要に応じて、Copy-ServiceFabricApplicationPackage を SkipCopy
フラグを指定せずに実行して、圧縮されたパッケージを 1 つまたは複数の Service Fabric クラスターにコピーすることができます。
このパッケージには、code
、config
、data
の各パッケージの zip 圧縮されたファイルが含まれています。 アプリケーション マニフェストとサービス マニフェストは、多くの内部操作に必要なため、圧縮されません。 たとえば、パッケージ共有、特定の検証のためのアプリケーションの種類名とバージョンの抽出では、必ずマニフェストへのアクセスが必要になります。 マニフェストを zip 圧縮すると、これらの操作が非効率的になります。
tree /f .\MyApplicationType
D:\TEMP\MYAPPLICATIONTYPE
│ ApplicationManifest.xml
│
└───MyServiceManifest
│ ServiceManifest.xml
│
├───MyCode
│ MyServiceHost.exe
│ MySetup.bat
│
├───MyConfig
│ Settings.xml
│
└───MyData
init.dat
Copy-ServiceFabricApplicationPackage -ApplicationPackagePath .\MyApplicationType -CompressPackage -SkipCopy
tree /f .\MyApplicationType
D:\TEMP\MYAPPLICATIONTYPE
│ ApplicationManifest.xml
│
└───MyServiceManifest
ServiceManifest.xml
MyCode.zip
MyConfig.zip
MyData.zip
または、Copy-ServiceFabricApplicationPackage を使用して 1 ステップでパッケージを圧縮してコピーできます。 パッケージのサイズが大きい場合は、パッケージの圧縮とクラスターへのアップロードの両方の時間を確保するのに十分な大きいタイムアウト値を指定してください。
Copy-ServiceFabricApplicationPackage -ApplicationPackagePath .\MyApplicationType -ApplicationPackagePathInImageStore MyApplicationType -ImageStoreConnectionString fabric:ImageStore -CompressPackage -TimeoutSec 5400
内部的に、Service Fabric がアプリケーション パッケージのチェックサムを計算して検証を行います。 圧縮を使用すると、各パッケージの zip 圧縮バージョンでチェックサムが計算されます。 同じアプリケーション パッケージから新しい zip を生成すると、異なるチェックサムが作成されます。 検証エラーを防ぐには、diff プロビジョニングを使用します。 このオプションを使用する場合は、変更されていないパッケージを新しいバージョンに含めないでください。 代わりに、新しいサービス マニフェストから直接参照してください。
diff プロビジョニングが選択肢とならず、パッケージを含める必要がある場合は、チェックサムの不一致を避けるために code
、config
、および data
の各パッケージの新しいバージョンを生成してください。 圧縮されたパッケージを使用する場合は、以前のバージョンで圧縮が使用されているかどうかを問わず、変更されていないパッケージの新しいバージョンを生成する必要があります。
これでパッケージは正しくパッケージ化、検証、および (必要に応じて) 圧縮されたため、1 つまたは複数の Service Fabric クラスターにデプロイする準備ができました。
Visual Studio を使ってデプロイするときにパッケージを圧縮する
CopyPackageParameters
要素を発行プロファイルに追加し、CompressPackage
属性を true
に設定することで、デプロイ時にパッケージを圧縮するよう Visual Studio に指示できます。
<PublishProfile xmlns="http://schemas.microsoft.com/2015/05/fabrictools">
<ClusterConnectionParameters ConnectionEndpoint="mycluster.westus.cloudapp.azure.com" />
<ApplicationParameterFile Path="..\ApplicationParameters\Cloud.xml" />
<CopyPackageParameters CompressPackage="true"/>
</PublishProfile>
sfpkg の作成
バージョン 6.1 より、Service Fabric では外部ストアからのプロビジョニングが可能になりました。
この場合、アプリケーション パッケージをイメージ ストアにコピーする必要はありません。 代わりに、sfpkg
ファイルを作成して外部ストアにアップロードし、プロビジョニング時にダウンロード URI を Service Fabric に提供することができます。 同じパッケージを複数のクラスターにプロビジョニングできます。 外部ストアからプロビジョニングすることにより、パッケージを各クラスターにコピーするのに要する時間を節約できます。
sfpkg
ファイルは、初期アプリケーション パッケージを含む、拡張子が .sfpkg
の zip です。 zip には、圧縮されているアプリケーション パッケージと圧縮されていないアプリケーション パッケージのどちらも含めることができます。 zip 内のアプリケーション パッケージの圧縮は、前述のように、コード、構成、およびデータ パッケージ レベルで行われます。
sfpkg
ファイルを作成するには、圧縮されているかどうかにかかわらず、元のアプリケーション パッケージを含むフォルダーから開始します。 その後、任意のユーティリティを使用してフォルダーを圧縮して、拡張子 ".sfpkg" を付けます。 たとえば、ZipFile.CreateFromDirectory を使用します。
ZipFile.CreateFromDirectory(appPackageDirectoryPath, sfpkgFilePath);
sfpkg
は、Service Fabric の外部の帯域外の外部ストアにアップロードする必要があります。 外部ストアには、REST http または https エンドポイントを公開している任意のストアを指定できます。 プロビジョニング中、Service Fabric は、GET 操作を実行して sfpkg
アプリケーション パッケージをダウンロードします。そのため、ストアではパッケージの READ アクセスを許可する必要があります。
パッケージをプロビジョニングするには、ダウンロード URI とアプリケーションの種類の情報を必要とする外部プロビジョニングを使用します。
注意
現在、イメージ ストアの相対パスに基づくプロビジョニングでは、sfpkg
ファイルはサポートされていません。 したがって、sfpkg
をイメージ ストアにコピーしてはいけません。
次のステップ
「アプリケーションのデプロイと削除」では、PowerShell を使用してアプリケーション インスタンスを管理する方法について説明しています
「複数の環境のアプリケーション パラメーターの管理」では、複数のアプリケーション インスタンスに対してパラメーターと環境変数を構成する方法について説明しています。
「アプリケーションのセキュリティ ポリシーの構成」では、セキュリティ ポリシーの下でサービスを実行して、アクセスを制限する方法について説明しています。