LoginSignup
4
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-08-09

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

独自のアプリケーション固有の環境変数の設定については、「アプリケーション・マニフェストによるデプロイ」の「環境変数」を参照してください。

注意事項: この記事は、Cloud Foundry Documentaion Cloud Foundry Environment Variables (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がアプリケーション・コンテナで使用できる環境変数について説明します。 これらの変数の中には、単一のアプリケーションのインスタンス間で同じ変数があり、インスタンスごとに異なる変数もあります。

ビルドパックで定義された変数を含め、プログラムで環境変数にアクセスできます。 詳細は、JavaNode.js、およびRubyの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の値を確認するには、「環境変数の値を表示する」を参照してください。

以下の例は、Pivotal Web Services Marketplaceで利用可能ないくつかのサービスのバインドされたインスタンスの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
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2