CFアプリ開発と管理#2 アプリケーションのデプロイ


注：アプリケーション言語やフレームワークに固有のデプロイ・ガイドについては、「[Ruby on Railsアプリケーションのデプロイメントガイド](http://docs.cloudfoundry.org/buildpacks/ruby/gsg-ror.html)」のような[ビルドパック](http://docs.cloudfoundry.org/buildpacks/)のドキュメントを参照してください。

*注意事項: この記事は、Cloud Foundry Documentaion [Deploy an Application](http://docs.cloudfoundry.org/devguide/deploy-apps/deploy-app.html) (last updated: June 2, 2017) からの独自の翻訳とコメントです。 内容を保証するものではありません。*

*コメント: IBM Bluemixコンソールからのサービスの追加、デプロイ、更新、保護、デプロイのリンク設定については、「[アプリの管理](https://console.bluemix.net/docs/manageapps/mngapps.html#manageapps)」に資料があります。*

## デプロイ・プロセスの概要

Cloud Foundry コマンドライン・インターフェイス（cf CLI）からcf pushコマンドを実行して、Cloud Foundryにアプリケーションをデプロイします。 詳細は、「[cf CLIのインストール](http://docs.cloudfoundry.org/cf-cli/install-go-cli.html)」を参照してください。また、*Bluemix CLI インストールは、[Bluemix CLI Home](https://clis.ng.bluemix.net/ui/home.html)を参照してください。* `cf push`または、`bx cf push` を実行してからアプリが利用可能になるまでの間に、Cloud Foundryは次のタスクを実行します。


* アプリファイルをアップロードして保存する
* アプリのメタデータを調べて保存する
* アプリの「droplet」（Cloud Foundryの実行単位）を作成します
* dropletを実行する適切なDiego[セル](http://docs.cloudfoundry.org/concepts/architecture/#diego-cell)を選択します。
* アプリを起動する

アプリケーションのライフサイクルの詳細については、「[アプリ・コンテナのライフサイクル](http://qiita.com/MahoTakara/items/905a61ccc56c8daef2de)」のトピックを参照してください。

データベース、メッセージング、電子メールサーバーなどのサービスを使用するアプリケーションは、サービスをプロビジョニングし、必要に応じてサービスをアプリケーションにバインドするまで完全に機能しません。 サービスの詳細については、「[サービスの概要](http://docs.cloudfoundry.org/devguide/services/)」のトピックを参照してください。

*注: [Bluemix コマンド・ライン・インターフェース (CLI)](https://console.bluemix.net/docs/cli/reference/bluemix_cli/bx_cli.html#bluemix_cli) では、ユーザーが Bluemixと対話できるように、名前空間別にグループ化したコマンドのセットが提供されています。 Bluemixコマンドには、既存の cf コマンドのラッパーになっているものもあれば、 Bluemix ユーザー向けの拡張機能を提供するものもあります。*

*注:BluemixのCLIからアプリをデプロイするための資料として、「[コマンド・ライン・インターフェースを使用した Cloud Foundry アプリのダウンロード、変更、および再デプロイ](https://console.bluemix.net/docs/starters/install_cli.html) 」も参照ください。*


## ステップ1：導入の準備

Cloud Foundryにアプリをデプロイする前に、次の点を確認してください。

* あなたのアプリは、cloud-ready ですか？  ファイルストレージ、HTTPセッション、およびポートの使用に関連するCloud Foundryの動作には、アプリケーションの変更が必要な場合があります。

* 必要なすべてのアプリ・リソースのアップロードが必要です。 たとえば、データベース・ドライバを含める必要があります。

* 余分なファイルや作成物はアップロードから除外してください。 特にアプリが大きい場合、アプリケーション・ディレクトリ構造内にある不要なファイルを明示的に除外する必要があります。

* アプリケーションに必要なすべてのサービスのインスタンスが作られていなければなりません。

* あなたがデプロイしようとするアプリのタイプをCloud Foundryのインスタンスがサポートする必要があります。 または、アプリをステージングできる外部で利用可能なビルドパックのURLが必要です。


アプリのデプロイメントの準備については、次を参照してください。

* [クラウドでのアプリの設計と実行に関する考慮事項](http://qiita.com/MahoTakara/items/6196d13df5ef98c0be6f)
* [ビルドパック](http://docs.cloudfoundry.org/buildpacks/)



## ステップ2：資格情報とターゲットを知る

アプリをCloud Foundryにプッシュする前に、次のことを知っておく必要があります。

* Cloud FoundryインスタンスのAPIエンドポイント。 [ターゲットURLとも呼ばれ、Cloud Foundryインスタンス内のCloud ControllerのURLです。](http://qiita.com/MahoTakara/items/4880612a0c402cbb87f7)

* Cloud Foundryインスタンスのユーザー名とパスワード。

* あなたのアプリを配備する組織とスペース。 クラウドファウンドリのワークスペースは組織に編成され、その中にはスペースがあります。 クラウドファウンドリユーザーは、1つ以上の組織とスペースにアクセスできます。



## ステップ3 :(オプション）ドメインの設定

Cloud Foundryは、ルートを使用して、アプリケーションへリクエストを転送します。 ルートは、ホストとドメインで構成されるURLです。

* -nフラグを付けてホスト名を指定しない限り、アプリの名前はそのアプリのデフォルトホストです。

* すべてのアプリは、ドメインに属するアプリ空間にデプロイされます。すべてのCloud Foundryインスタンスにはデフォルトドメインが定義されています。ドメインが登録されていてターゲットのアプリケーションスペースを含む組織にマップされている場合は、デプロイ時にデフォルトでないドメインまたはカスタムドメインを指定できます。

注：CFでは、アプリ名にアンダースコアを含めることはできますが、アプリのURLには含めることはできません。アプリ名からデフォルトのアプリURLを設定するとき、CFはアンダースコアをハイフンに変換します。

* アプリのURLは、Cloud Foundryがホストする他のアプリから一意である必要があります。 [cf CLI](http://docs.cloudfoundry.org/cf-cli/)で次のオプションを使用すると、一意のURLを作成できます。
   * -n：appに別のHOST名を割り当てる
   * アプリケーション名とランダムな単語を含むURLを作成する--random-route

注：このコマンドの他のオプションを表示するには、cf help pushを使用します。

ドメインの詳細については、「[ルートとドメイン](http://qiita.com/MahoTakara/items/c34b3a1b117683a6e326)」を参照してください。


## ステップ4：デプロイ・オプションを決定する

デプロイする前に、次の項目を決定する必要があります。

* Name: 任意の一連の英数字をアプリの名前として使用できます。
* Instances: 一般的に言えば、実行するインスタンスが増えるほど、アプリケーションのダウンタイムが短縮されます。 アプリがまだ開発中の場合は、1つのインスタンスを実行するだけでトラブルシューティングが簡単になります。 プロダクションアプリの場合、少なくとも2つのインスタンスをお勧めします。
* Memory Limit: アプリケーションの各インスタンスが消費できるメモリの最大量。 インスタンスがこの制限を超えると、Cloud Foundryはインスタンスを再起動します。 注：初期では、Cloud Foundryはメモリの制限を超えたインスタンスをただちに再起動します。 インスタンスが短時間にメモリ制限を繰り返し繰り返した場合、Cloud Foundryはインスタンスの再起動を遅延させます。
* Start Command: Cloud Foundryがアプリの各インスタンスを起動するために使用するコマンドです。 この開始コマンドは、アプリケーションフレームワークによって異なります。
* Subdomain (host) and Domain: ルートはサブドメインとドメインの組み合わせであり、グローバルに一意でなければなりません。 これは、ルートの一部を指定するか、Cloud Foundryがデフォルトを使用するかどうかにかかわらず、当てはまります。
* Services: アプリケーションは、データベース、メッセージング、Key-Valueストアなどのサービスにバインドできます。 アプリはアプリ空間にデプロイされます。 アプリケーションは、ターゲットアプリケーション空間に既存のインスタンスを持つサービスにしかバインドできません。


### デプロイ・オプションを定義する

デプロイ・オプションは、コマンドライン、マニフェストファイル、またはその両方で定義できます。アプリケーション設定がプッシュからプッシュに変更される方法、およびコマンドラインオプション、マニフェスト、cf scaleなどのコマンドがどのように相互作用するかについては、「[アプリケーション・マニフェストによるデプロイ](http://qiita.com/MahoTakara/items/888ffdadbf34fd2033d6)」を参照してください。

実行中にアプリをデプロイすると、Cloud Foundryはそのアプリのすべてのインスタンスを停止してからデプロイします。 cf pushが実行されている間に、アプリケーションを実行しようとするユーザーには "404 not found"というメッセージが表示されます。 2つのバージョンのコードが同時に実行されないようにするには、すべてのインスタンスを停止する必要があります。最悪の場合の例は、古いコードを実行するインスタンスが機能せず、ユーザーがデータを失う可能性があるため、データベーススキーマの移行に関連する更新プログラムを展開することです。

Cloud Foundryはファイル拡張子.svn、.git、および.darcsを持つバージョンコントロールファイルを除くすべてのアプリファイルをアップロードします。他のファイルをアップロードから除外するには、pushコマンドを実行するディレクトリの.cfignoreファイルで指定します。この方法は、.gitignoreファイルを使用するのと同様です。詳細については、「[クラウドでアプリケーションを設計および実行する際の考慮事項](http://qiita.com/MahoTakara/items/6196d13df5ef98c0be6f)」の「[プッシュする際に不要なファイルを無視する](http://qiita.com/MahoTakara/items/6196d13df5ef98c0be6f#push%E6%99%82%E3%81%AB%E4%B8%8D%E8%A6%81%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B)」セクションを参照してください。

マニフェストファイルの詳細については、「[アプリ・マニフェストによるデプロイ](http://qiita.com/MahoTakara/items/888ffdadbf34fd2033d6)」を参照してください。


### 実行前フックの設定

注意：Javaビルドパックは、実行前のフックをサポートしていません。

ランタイム前のフックを設定するには、`.profile`という名前のファイルを作成し、`app`ディレクトリのルートに配置します。ディレクトリに `.profile`スクリプトが含まれている場合、Cloud Foundryはアプリの各インスタンスが起動する直前にそれを実行します。 `.profile`スクリプトはbuildpackの後に実行されるため、スクリプトはbuildpackによって作成された言語ランタイム環境にアクセスできます。

注：アプリケーションのルート・ディレクトリーには、buildpackの初期化タスクを実行するbashスクリプトを含む`.profile.d`ディレクトリーも含まれます。開発者はカスタムビルドパックを使用していない限り、これらのスクリプトを編集しないでください。

`.profile`スクリプトを使用して、カスタム環境変数の設定など、アプリ固有の初期化タスクを実行できます。環境変数は、オペレーティング・システム・レベルで定義されたキーと値のペアです。これらのキーと値のペアは、システム上で実行されているアプリケーションを設定する方法を提供します。たとえば、どのアプリでもLANG環境変数にアクセスして、エラーメッセージと命令、照合順序、および日付形式に使用する言語を判断できます。

環境変数を設定するには、適切な`bash`コマンドを`.profile`ファイルに追加します。以下の例を参照してください。

### あなたのアプリケーションのデフォルトLANGを設定する
`export LANG = en_US.UTF-8`

注意：v4.3.18より前のバージョンのPHPビルドパックを使用している場合、ビルドパックはPHPアプリケーションの`.profile`スクリプトを実行しません。 PHPアプリケーションは`.profile`スクリプトの内容をホストします。これは、影響を受けるPHPビルドパックのバージョンを使用してステージングされたPHPアプリケーションが、`.profile`スクリプトに配置された資格情報をリークできることを意味します。


## ステップ5：アプリケーションをプッシュする

次のコマンドを実行して、マニフェストなしでアプリケーションをデプロイします。

~~~
cf push APP-NAME
~~~

マニフェストにアプリ名を指定すると、`cf push`にコマンドを減らすことができます。 「[アプリ・マニフェストによるデプロイ](http://qiita.com/MahoTakara/items/888ffdadbf34fd2033d6)」を参照してください。

あなたが提供したのはあなたのアプリケーションの名前なので、`cf push`は、インスタンスの数、メモリの量、およびあなたのアプリケーションの他の属性をデフォルト値に設定します。 コマンドラインオプションを使用して、これらの属性と追加の属性を指定することもできます。

以下の実行例は、`cf push`コマンドが与えられたときにCloud Foundryがデフォルト値を`app`に割り当てる方法を示しています。

注：独自のアプリケーションを配備する場合は、`my-app`のような総称名を使用しないでください。 Cloud Foundry はアプリ名を使用してアプリへのルートを作成します。アプリにグローバルにユニークなルートがない限り、デプロイメントは失敗します。

    $ cf push my-app
    Creating app my-app in org example-org / space development as a.user@shared-domain.example.com...
    OK

    Creating route my-app.shared-domain.example.com...
    OK

    Binding my-app.shared-domain.example.com to my-app...
    OK

    Uploading my-app...
    Uploading app: 560.1K, 9 files
    OK

    Starting app my-app in org example-org / space development as a.user@shared-domain.example.com...
    -----> Downloaded app package (552K)
    OK
    -----> Using Ruby version: ruby-1.9.3
    -----> Installing dependencies using Bundler version 1.3.2
           Running: bundle install --without development:test --path
             vendor/bundle --binstubs vendor/bundle/bin --deployment
           Installing rack (1.5.1)
           Installing rack-protection (1.3.2)
           Installing tilt (1.3.3)
           Installing sinatra (1.3.4)
           Using bundler (1.3.2)
           Updating files in vendor/cache
           Your bundle is complete! It was installed into ./vendor/bundle
           Cleaning up the bundler cache.
    -----> Uploading droplet (23M)

    1 of 1 instances running

    App started

    Showing health and status for app my-app in org example-org / space development as a.user@shared-domain.example.com...
    OK

    requested state: started
    instances: 1/1
    usage: 1G x 1 instances
    urls: my-app.shared-domain.example.com

         state     since                    cpu    memory        disk
    #0   running   2014-01-24 05:07:18 PM   0.0%   18.5M of 1G   52.5M of 1G



## ステップ6：サービス接続を設定する（オプション）

デプロイしたアプリにサービスをバインドした場合は、サービスのURLと資格情報を使用してアプリを設定する必要があります。 詳細については、アプリ・フレームワークに関する具体的なドキュメントを参照してください。

* [Ruby](http://docs.cloudfoundry.org/buildpacks/ruby/ruby-service-bindings.html)
* [Node.js](http://docs.cloudfoundry.org/buildpacks/node/node-service-bindings.html)
* [Spring](http://docs.cloudfoundry.org/buildpacks/java/configuring-service-connections/spring-service-bindings.html)
* [Grails](http://docs.cloudfoundry.org/buildpacks/java/configuring-service-connections/grails-service-bindings.html)


## ステップ7：デプロイ時の問題のトラブルシューティング

Cloud Foundryでアプリが起動しない場合は、アプリをローカルで実行できることを確認してください。

[cf CLI](http://docs.cloudfoundry.org/devguide/deploy-apps/troubleshoot-app-health.html)を使用してクラウド内のアプリのトラブルシューティングを行うことができます。 アプリケーションの展開と状態のトラブルシューティングを参照してください。