CFアプリ開発と管理#21.7 外部ファイルシステムの使用（ボリュームサービス）



このトピックでは、Cloud Foundry（CF）アプリケーション開発者がアプリケーションからマウントされたファイルシステムを読み書きする方法について説明します。 CFではボリュームサービスがボリュームを提供しているので、アプリは信頼性の高い一時的でないファイルシステムに対して読み書きできます。


注意事項：この記事は、[Using an External File System (Volume Services)](https://docs.cloudfoundry.org/devguide/services/using-vol-services.html) の独自の翻訳とコメントです。 内容を保証するものではありません。

**重要** *コメント: Cloud Foundry をベースとして提供されている IBM Bluemixですが、残念ながら、ボリュームサービスが提供されていません。また、Bluemix Infrastructure には、ファイル・ストレージサービス(NFS)が提供されていますが、残念ながら、Cloud Foundry アプリから利用することはできません。 Bluemix のアプリケーション・コンテナ間で、ファイル共有が必要な場合は、[単一コンテナーとスケーラブル・コンテナーのボリュームへの永続データの保管](https://console.bluemix.net/docs/containers/container_volumes_ov.html#container_volumes_ui) を参照して、IBM Container サービス の Kubernetes へ移行します。*



# 前提条件

アプリケーションでボリュームサービスを使用するには、Cloud Foundryの管理者が展開にボリュームサービスを追加する必要があります。 詳細は、「[デプロイメントへのボリュームサービスの追加](https://docs.cloudfoundry.org/running/deploy-vol-services.html)」を参照してください。

クラウドファウンドリコマンドラインインターフェイス（cf CLI）cf marketplaceコマンドを実行して、ボリュームサービスが利用可能かどうかを判断できます。 NFSボリュームサービスの次の出力例を参照してください。

~~~
$ cf marketplace
service   plans      description
nfs       Existing   Service for connecting to NFS volumes
~~~

要件に合ったボリュームサービスが存在しない場合は、Cloud Foundry管理者にお問い合わせください。


# サービスインスタンスの作成とバインド

Cloud Foundry管理者によって導入されたボリュームサービスを使用するには、まず必要な特定のボリュームサービスのインスタンスを作成する必要があります。 このサービスインスタンスを作成するには、以下の手順に従ってください。

１． ターミナルウィンドウで、cf create-service SERVICE-NAME PLAN SERVICE-INSTANCE -c SHARE-JSONを実行してサービスインスタンスを作成します。 次の値を指定した値に置き換えます。

   + SERVICE：使用するボリュームサービスの名前。

   + PLAN：サービスプランの名前。 サービスプランは、プロバイダが同じサービスに対してさまざまなレベルのリソースまたは機能を提供する方法です。

   + SERVICE-INSTANCE：サービスインスタンスに指定した名前。 任意の一連の英数字、ハイフン、アンダースコアを使用します。 インスタンスの名前はいつでも変更できます。

   + SHARE-JSON（NFSのみ）：NFSボリュームサービスのインスタンスを作成する場合は、-cフラグを使用してJSON文字列、インラインまたはファイルで余分なパラメータを共有する必要があります。 このパラメータは、サービスに必要なNFSサーバーと共有についての情報をブローカに転送します。

次の例は、既存のNFSサービスプランのインスタンスを作成し、インラインJSON文字列を渡しています。

~~~
$ cf create-service nfs Existing nfs_service_instance -c '{"share": "10.10.10.10/export/myshare"}'
~~~



２．ターミナルウィンドウで、cf create-service SERVICE-NAME PLAN SERVICE-INSTANCE -c SHARE-JSONを実行してサービスインスタンスを作成します。 次の値を指定した値に置き換えます。

   + SERVICE：使用するボリュームサービスの名前。

   + PLAN：サービスプランの名前。 サービスプランは、プロバイダが同じサービスに対してさまざまなレベルのリソースまたは機能を提供する方法です。

   + SERVICE-INSTANCE：サービスインスタンスに指定した名前。 任意の一連の英数字、ハイフン、アンダースコアを使用します。 インスタンスの名前はいつでも変更できます。

   + SHARE-JSON（NFSのみ）：NFSボリュームサービスのインスタンスを作成する場合は、-cフラグを使用してJSON文字列、インラインまたはファイルで余分なパラメータを共有する必要があります。 このパラメータは、サービスに必要なNFSサーバーと共有についての情報をブローカに転送します。

次の例は、既存のNFSサービスプランのインスタンスを作成し、インラインJSON文字列を渡しています。

~~~
cf bind-service my-app nfs_service_instance -c '{"uid":"1000","gid":"1000","mount":"/var/volume1"}'
~~~


３．cf restage YOUR-APPを実行して、アプリケーションを再設定してサービスバインディングを完了します。 YOUR-APPをあなたのアプリの名前に置き換えてください。

~~~
$ cf restage my-app
~~~


## あなたのアプリケーションからボリュームサービスにアクセスする

アプリケーションからボリュームサービスにアクセスするには、コードで使用するファイルパスを知っている必要があります。 VCAP_SERVICES環境変数から利用可能なサービスバインディングの詳細で、ファイルパスを表示できます。 以下の手順に従ってください。


１. cf env YOUR-APPを実行して、アプリの環境変数を表示します。 YOUR-APPをあなたのアプリの名前に置き換えてください。

~~~
$ cf env my-app
"VCAP_SERVICES": {
"nfs": [
  {
    "credentials": {},
    "label": "nfs",
    "name": "nfs_service_instance",
    "plan": "Existing",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [
    "nfs"
    ],
    "volume_mounts": [
      {
        "container_dir": "/var/vcap/data/153e3c4b-1151-4cf7-b311-948dd77fce64",
        "device_type": "shared",
        "mode": "rw"
      }
    ]
  }
]
}
~~~



２. あなたのアプリが必要とする情報については、volume_mountsのプロパティを使用してください。 次の表を参照してください。

| Property | 	Description |
|:---      |:--           |
|container_dir| マウントされたボリュームへのパスを含む文字列で、それはアプリにバインドしています。|
|device_type|NFSボリュームリリース。 これは現在、共有デバイスのみをサポートしています。 共有デバイスは、すべてのアプリケーションインスタンスに同時にマウントできる分散ファイルシステムを表します。|
|mode |あなたのアプリケーションがNFSに対して行うアクセスのタイプ（読み取り専用、ro、読み取りと書き込み、rw）を知らせる文字列。|