CFアプリ開発と管理#13 CloudFoundry環境変数

環境変数は、Cloud Foundry（CF）ランタイムがデプロイされたアプリケーションとその環境について通信する手段です。 このページでは、ランタイムとビルドパックがアプリケーション用に設定した環境変数について説明します。

独自のアプリケーション固有の環境変数の設定については、「[アプリケーション・マニフェストによるデプロイ](https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html#env-block)」の「環境変数」を参照してください。

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


## 環境変数の表示
Cloud Foundryコマンドラインインターフェイス（cf CLI）をインストールし、cf envコマンドを使用してアプリケーションのCloud Foundry環境変数を表示します。 cf envコマンドは、次の環境変数を表示します。

* コンテナ環境で提供される`VCAP_APPLICATION`および`VCAP_SERVICES`変数
* cf-envコマンドを使用して設定されたユーザー提供の変数

~~~
$ cf env my-app
Getting env variables for app my-app in org my-org / space my-space as
admin...
OK
System-Provided:

{
 "VCAP_APPLICATION": {
  "application_id": "fa05c1a9-0fc1-4fbd-bae1-139850dec7a3",
  "application_name": "my-app",
  "application_uris": [
    "my-app.192.0.2.34.xip.io"
  ],
  "application_version": "fb8fbcc6-8d58-479e-bcc7-3b4ce5a7f0ca",
  "cf_api": "https://api.example.com",
  "limits": {
    "disk": 1024,
    "fds": 16384,
    "mem": 256
  },
  "name": "my-app",
  "space_id": "06450c72-4669-4dc6-8096-45f9777db68a",
  "space_name": "my-space",
  "uris": [
    "my-app.192.0.2.34.xip.io"
  ],
  "users": null,
  "version": "fb8fbcc6-8d58-479e-bcc7-3b4ce5a7f0ca"
  }

User-Provided:
MY_DRAIN: http://drain.example.com
MY_ENV_VARIABLE: 100
~~~

## アプリケーション固有のシステム変数
以下のサブセクションでは、Cloud Foundryがアプリケーション・コンテナで使用できる環境変数について説明します。 これらの変数の中には、単一のアプリケーションのインスタンス間で同じ変数があり、インスタンスごとに異なる変数もあります。

ビルドパックで定義された変数を含め、プログラムで環境変数にアクセスできます。 詳細は、[Java](https://docs.cloudfoundry.org/buildpacks/java/java-tips.html#env-var)、[Node.js](https://docs.cloudfoundry.org/buildpacks/node/node-tips.html#env-var)、および[Ruby](https://docs.cloudfoundry.org/buildpacks/ruby/ruby-tips.html#env-var)のbuildpackのマニュアルを参照してください。


| Env Var |Running |Staging | Task |
|:--      |:--:    |:--:    |:--:  |
|CF_INSTANCE_ADDR    |x|x|x|
|CF_INSTANCE_GUID    |x| |x| 
|CF_INSTANCE_INDEX   |x| | |	
|CF_INSTANCE_INTERNAL_IP|	x|x|x|
|CF_INSTANCE_IP	   |x|x|x|
|CF_INSTANCE_PORT    |x|x|x|
|CF_INSTANCE_PORTS   |x|x|x|
|CF_STACK            | |x| |
|DATABASE_URL        |x| |x|
|HOME                |x|x|x|
|INSTANCE_GUID       |x| | |
|INSTANCE_INDEX      |x| | |
|LANG	              |x|x|x|
|MEMORY_LIMIT        |x|x|x|
|PATH                |x|x|x|
|PORT	              |x| | |
|PWD	              |x|x|x|
|TMPDIR              |x| |x|
|USER	              |x|x|x|
|VCAP_APP_HOST       |x| | |	
|VCAP_APP_PORT       |x| | |
|VCAP_APPLICATION    |x|x|x|
|VCAP_SERVICES       |x|x|x|



## CF_INSTANCE_ADDR
アプリケーションインスタンスのCF_INSTANCE_IPおよびCF_INSTANCE_PORTは、IP：PORTの形式で指定します。

例:`CF_INSTANCE_ADDR=1.2.3.4:5678`


## CF_INSTANCE_GUID
アプリの特定のインスタンスのUUID

例：`CF_INSTANCE_GUID = 41653aa4-3a3a-486a-4431-ef258b39f042`

## CF_INSTANCE_INDEX
アプリケーションインスタンスのインデックス番号

例：`CF_INSTANCE_INDEX = 0`

## CF_INSTANCE_IP
アプリケーション・インスタンスを実行しているホストの外部IPアドレス

例：`CF_INSTANCE_IP = 1.2.3.4`

## CF_INSTANCE_INTERNAL_IP
アプリケーションインスタンスを実行しているコンテナの内部IPアドレス

例：`CF_INSTANCE_INTERNAL_IP = 5.6.7.8`

## CF_INSTANCE_PORT
値がPORTの内部またはコンテナ側のポートに対応する外部またはホスト側のポートです。この値は、通常、appインスタンスのPORTとは異なります。

例：'CF_INSTANCE_PORT = 61045'


## CF_INSTANCE_PORTS

インスタンスのコンテナに割り当てられた内部ポート、コンテナ側、外部、またはホスト側のポートのマッピングのリストです。 内部ポートのすべてが、アプリケーションがバインドするために必ず利用できるわけではありません。その一部は、コンテナ内で実行されるシステム提供のサービスによって使用される場合があります。 これらの内部および外部値は異なる場合があります。

例：`CF_INSTANCE_PORTS=[{external:61045,internal:5678},{external:61046,internal:2222}]`


## DATABASE_URL
実行時に、CFは`VCAP_SERVICES`環境変数に基づいてすべてのアプリケーション用に`DATABASE_URL`環境変数を作成します。

CFは`VCAP_SERVICES`環境変数の構造体を使用して`DATABASE_URL`を設定します。 CFは、`DATABASE_URL`の候補として次の形式のJSONオブジェクトを含むサービスを認識し、見つかった最初の候補を使用します。

~~~
{
  "some-service": [
    {
      "credentials": {
        "uri": "SOME-DATABASE-URL"
      }
    }
  ]
}
~~~

たとえば、次のVCAP_SERVICESを考えます。

~~~
VCAP_SERVICES =
{
  "elephantsql": [
    {
      "name": "elephantsql-c6c60",
      "label": "elephantsql",
      "credentials": {
        "uri": "postgres://exampleuser:examplepass@babar.elephantsql.com:5432/exampledb"
      }
    }
  ]
}
~~~

このVCAP_SERVICESに基づいて、CFは次のDATABASE_URL環境変数を作成します。

~~~
DATABASE_URL=postgres://exampleuser:examplepass@babar.elephantsql.com:5432/exampledb
~~~


## HOME
デプロイされたアプリのルートです。

例:`HOME=/home/vcap/app`


## LANG
一貫したスクリプトのロード順序を保証するために、LANGはbuildpacksによって必要とされます。

例:`LANG=en_US.UTF-8`

## MEMORY_LIMIT
アプリケーションの各インスタンスが消費できる最大メモリー量。 この値は、アプリケーションマニフェストで指定するか、アプリケーションをプッシュする時のcf CLIで指定します。 この値は、スペースおよび組織のクォータによって制限されます。

インスタンスが最大限度を超えた場合、インスタンスは再起動されます。 Cloud Foundryがインスタンスの再起動を頻繁に要求された場合、インスタンスは代わりに終了します。

例:`MEMORY_LIMIT=512M`

## PORT
アプリケーションが要求をリスンするポート。 Cloud Foundryランタイムは、アプリケーションの各インスタンスに対してポートを動的に割り当てるため、アプリケーションポートを取得または使用するコードはPORT環境変数を使用して参照する必要があります。

例:`PORT=61857`



## PWD
アプリケーションを処理したビルドパックが実行された現在の作業ディレクトリを示します。

例:`PWD=/home/vcap/app`

## TMPDIR
一時ファイルとステージングファイルが格納されるディレクトリの場所

例:`TMPDIR=/home/vcap/tmp`

## USER
アプリケーションが実行されるユーザーアカウント

例：`USER=vcap`

## VCAP_APP_PORT
上記で定義されたPORT変数の非推奨の名前


## VCAP_APPLICATION
この変数には、デプロイされたアプリケーションの関連属性が含まれています。 結果はJSON形式で返されます。 次の表に、戻される属性を示します。


|Attribute	      |Description |
|:--             |:--         |
|application_id  |アプリケーションを識別するGUID|
|application_name|アプリケーションがプッシュされたときに割り当てられた名前|
|application_uris|アプリケーションに割り当てられたURI|
|application_version|アプリケーションのバージョンを識別するGUID。 アプリケーションがプッシュまたは再起動されるたびに、この値が更新されます。|
|cf_api          |cf CLIにログインしたときにターゲットとしたAPIエンドポイント|
|host            |非推奨、アプリケーションインスタンスのIPアドレス|
|limits          |ディスク領域、ファイル数、およびアプリケーションに許可されているメモリの制限。 メモリとディスク領域の制限は、アプリケーションの展開時にコマンドラインまたはアプリケーションマニフェストのいずれかに指定されます。 許可されるファイルの数はオペレータの設定です。|
|name	          |application_nameと同じです。|
|space_id	      |アプリケーションの領域を識別するGUID|
|space_name      |アプリがデプロイされたスペースの名前、人が読める|
|start	          |インスタンスが開始されたときの人間が読めるタイムスタンプ。 Diegoセルでは提供されません。|
|started_at	   |startと同じです。Diegoセルでは提供されません。|
|started_at_timestamp	|インスタンスが開始された時間のUnixエポックタイムスタンプ。 Diegoセルでは提供されません。|
|state_timestamp |started_at_timestampと同じで、Dicegoセルでは提供されません|
|uris            |application_urisと同じです。 application_urisとurisの両方が同じ値に設定されていることを確認する必要があります。|
|users           |非推奨、Diegoセルで提供されません。|
|version	      |application_versionと同じです。|


次の例は、VCAP_APPLICATION環境変の設定を示しています。

~~~
VCAP_APPLICATION={"instance_id":"fe98dc76ba549876543210abcd1234",
"instance_index":0,"host":"0.0.0.0","port":61857,"started_at":"2013-08-12
00:05:29 +0000","started_at_timestamp":1376265929,"start":"2013-08-12 00:05:29
+0000","state_timestamp":1376265929,"limits":{"mem":512,"disk":1024,"fds":16384}
,"application_version":"ab12cd34-5678-abcd-0123-abcdef987654","application_name"
:"styx-james","application_uris":["my-app.example.com"],"version":"ab1
2cd34-5678-abcd-0123-abcdef987654","name":"my-app","uris":["my-app.example.com"]
,"users":null}
~~~


## VCAP_SERVICES

バインド可能なサービスの場合、Cloud Foundryは、アプリケーションインスタンスをアプリケーションにバインドした後、アプリケーションを再起動するときにVCAP_SERVICES環境変数に接続の詳細を追加します。

結果は、1つ以上のインスタンスがアプリケーションにバインドされている各サービスのオブジェクトを含むJSONドキュメントとして返されます。 サービスオブジェクトには、アプリケーションにバインドされているサービスの各サービスインスタンスの子オブジェクトが含まれています。 バインドされたサービスを記述する属性は、以下の表で定義されています。

JSONドキュメントの各サービスのキーは、"label"属性の値と同じです。

|Attribute	|Description |
|:--       |:--         |
|name      |ユーザーがサービスインスタンスに割り当てた名前|
|label     |サービス提供の名前|
|tags      |アプリケーションがサービスインスタンスを識別するために使用できる文字列の配列|
|plan      |サービスインスタンスの作成時に選択されたサービスプラン|
|credentials|サービスインスタンスにアクセスするために必要なサービス固有の認証情報を含むJSONオブジェクト|

Cloud Foundryにプッシュされたアプリケーションの`VCAP_SERVICES`の値を確認するには、「[環境変数の値を表示する](https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#view-env)」を参照してください。

以下の例は、[Pivotal Web Services Marketplace](http://run.pivotal.io)で利用可能ないくつかのサービスのバインドされたインスタンスのVCAP_SERVICESの値を示しています。

~~~
VCAP_SERVICES=
{
  "elephantsql": [
    {
      "name": "elephantsql-c6c60",
      "label": "elephantsql",
      "tags": [
        "postgres",
        "postgresql",
        "relational"
      ],
      "plan": "turtle",
      "credentials": {
        "uri": "postgres://exampleuser:examplepass@babar.elephantsql.com:5432/exampleuser"
      }
    }
  ],
  "sendgrid": [
    {
      "name": "mysendgrid",
      "label": "sendgrid",
      "tags": [
        "smtp"
      ],
      "plan": "free",
      "credentials": {
        "hostname": "smtp.sendgrid.net",
        "username": "QvsXMbJ3rK",
        "password": "HCHMOYluTv"
      }
    }
  ]
}
~~~


## 環境変数グループ
環境変数グループはシステム全体の変数で、オペレータは実行中のすべてのアプリケーションとすべてのステージングアプリケーションに別々に環境変数のグループを適用できます。

環境変数グループは、後で実行時またはステージング時にアプリケーション・コンテナに挿入される名前と値のペアの1つのハッシュで構成されます。これらの値には、HTTPプロキシ情報などの情報を含めることができます。環境変数グループに設定された変数の値は、大文字と小文字が区別されます。

環境変数グループを作成するときは、次の点を考慮してください。

* Cloud Foundry演算子のみが各グループのハッシュ値を設定できます。
* 認証されたすべてのユーザーは、アプリケーションに割り当てられた環境変数を取得できます。
* すべての変数の変更は、オペレータがアプリケーションを再起動または保守した後に有効になります。
* ユーザー定義の変数は、これらのグループによって提供される環境変数よりも優先されます。

環境変数グループのコマンドを次の表に示します。

|CLI Command |	Description |
|:--         |:--         |
|running-environment-variable-group or revg ||実行中の環境変数グループの内容を取得します。|
|staging-environment-variable-group or sevg |ステージング環境変数グループの内容を取得します。
|set-staging-environment-variable-group or ssevg|ステージング環境変数グループを作成するために、パラメータをJSONとして渡します。|
|set-running-environment-variable-group or srevg|パラメータをJSONとして渡して、実行中の環境変数グループを作成します。|

次の例は、環境変数を取得する方法を示しています。

~~~
$ cf revg
Retrieving the contents of the running environment variable group as
sampledeveloper@example.com...
OK
Variable Name   Assigned Value
HTTP Proxy      198.51.100.130

$ cf sevg
Retrieving the contents of the staging environment variable group as
sampledeveloper@example.com...
OK
Variable Name   Assigned Value
HTTP Proxy      203.0.113.105
EXAMPLE-GROUP   2001

$ cf apps
Getting apps in org SAMPLE-ORG-NAME / space dev as
sampledeveloper@example.com...
OK

name    requested state   instances   memory   disk   urls
my-app  started           1/1         256M     1G     my-app.com

$ cf env APP-NAME
Getting env variables for app APP-NAME in org SAMPLE-ORG-NAME / space dev as
sampledeveloper@example.com...
OK

System-Provided:

{
  "VCAP_APPLICATION": {
  "application_name": "APP-NAME",
  "application_uris": [
    "my-app.example.com"
  ],
  "application_version": "7d0d64be-7f6f-406a-9d21-504643147d63",
  "limits": {
  "disk": 1024,
  "fds": 16384,
  "mem": 256
  },
  "name": "APP-NAME",
  "space_id": "37189599-2407-9946-865e-8ebd0e2df89a",
  "space_name": "dev",
  "uris": [
    "my-app.example.com"
  ],
  "users": null,
  "version": "7d0d64be-7f6f-406a-9d21-504643147d63"
 }
}

Running Environment Variable Groups:
HTTP Proxy: 198.51.100.130

Staging Environment Variable Groups:
EXAMPLE-GROUP: 2001
HTTP Proxy: 203.0.113.105
~~~


次の例は、環境変数を設定する方法を示しています。

~~~
$ cf ssevg '{"test":"198.51.100.130","test2":"203.0.113.105"}'
Setting the contents of the staging environment variable group as admin...
OK
$ cf sevg
Retrieving the contents of the staging environment variable group as admin...
OK
Variable Name   Assigned Value
test            198.51.100.130
test2           203.0.113.105

$ cf srevg '{"test3":"2001","test4":"2010"}'
Setting the contents of the running environment variable group as admin...
OK
$ cf revg
Retrieving the contents of the running environment variable group as admin...
OK
Variable Name   Assigned Value
test3           2001
test4           2010
~~~