最近のアクセス:
環境変数を使用したアプリケーション設定

設定ファイルではなく、環境変数から設定情報を読み取るのが一般的なシナリオがあります。ここでは、それに該当するシナリオとメリット、方法について説明します。

シナリオ

1) Docker コンテナを使用する場合と、その適切な使用方法
コンテナを使用する主なメリットの 1 つは、コンテナを任意でマウントできることです。
技術的な説明: テストに使用する Docker イメージを本番用に使用できるようにします。そうすることで、テストしたことを本番環境で確実に実行できます。
この場合、環境変数を使用します。
実行方法: コンテナをインスタンス化すると、さまざまな環境変数にさまざまな値を使用して実行されます。コンテナ内で実行されるアプリケーションは、これらの環境変数を読み取ります。
これを行わない場合、データベースの接続オプションは、Docker イメージに組み込まれる Web アプリケーション (コンテナ) の一部である接続ファイルにハードコーディングされます。そのため、テスト環境で使用するコンテナは、本番環境で使用できるコンテナとは異なります。本番環境では、別の資格情報を使用して別のデータベースにアタッチする必要があります。
2) 開発チームと本番チームのセキュリティと独立性: war または zip のデプロイメント
環境変数を使用しない場合、デプロイメントパッケージを本番環境で再利用する唯一の方法は、データベースの資格情報と本番環境のその他のプロパティを、GeneXus IDE を使用してパッケージを作成するときに把握しておくことです。これは、多くの会社やプロジェクトにとって実現が難しい作業です。
3) クラウドネイティブ: PaaS 環境でデータベースサービスに接続する場合、クラウドプロバイダーの特定の環境変数はクラウドプロバイダーが管理します。プロバイダーがデータベースサービスの URI を後で変更し (復元後など)、別の資格情報または接続オプションが必要になった場合は、アプリケーションが自動的に新しい値を取得できます。Web サーバーで他の設定を変更する必要はありません。
4) テストの俊敏性: Docker コンテナでアプリケーションを実行する際に、異なる設定で再度実行することが必要になる場合があります。たとえば、動作の違いをテストしたり、接続先データベースに応じてどのように動作するかをテストしたりする場合などです。

解決方法

アプリケーションの各設定のエントリーは、環境変数から読み取ることができます。この環境変数は、先頭に「GX_」を付けて、すべて大文字で指定する必要があります。

.NET

.NET の場合は、web.config での定義と同じように変数を呼び出します。
本番データベースを参照する Web アプリケーションが組み込まれた Docker イメージ (environmenttest.netenvironment) があるとします。ここで、テストデータベース (EnvTest) を参照する、そのイメージのインスタンスを呼び出します。そのためには、次のコマンドを実行します:
docker run --rm -e GX_CONNECTION-DEFAULT-DB=EnvTest environmenttest.netenvironment
フラグ -e は環境変数 GX_Connection-Default-DB (web.config での定義と同じ名前) を EnvTest に設定します。アプリケーションが起動し、プロパティ値の読み取りが必要になると、まずこの名前の環境変数があるかどうかを確認します。存在する場合は、その値を取得します。
同じイメージ (environmenttest.netenvironment) を本番用データベース (EnvProd) に対して呼び出す場合は、次のコマンドを実行します:
docker run --rm -e GX_CONNECTION-DEFAULT-DB=EnvProd environmenttest.netenvironment
web.config の設定プロパティについても同じです。設定プロパティを探すたびに、アプリケーションはまずこの名前の環境変数を検索します。

.NET Core

.NET Core は、.NET と同様に動作しますが、設定は appsettings.json というファイルに格納されます。

Java

Java の場合は、仕組みが異なる client.cfg (セクションあり) を使用するため、動作が少し違ってきます。
たとえば、com.environmenttest|DEFAULT (環境の既定の DBMS) というセクションがあり、DBMS への 次URL を持つ DB_URL エントリーがあるとします。 
jdbc:jtds:sqlserver://172.16.3.21:1435/EnvProd
この値を変えるには、セクションとプロパティを連結する環境変数を作成し (すべて大文字)、ポイントとパイプを下線に変える必要があります。たとえば、変数 GX_COM_ENVIRONMENTTEST_DEFAULT_DB_URL を作成する場合は、client.cfg の値を上書きします。この変数の値は、アプリケーションが処理する値になります。
次のように、名前空間を指定せずに変数を作成することもできます。GX_DEFAULT_DB_URL
この場合、この変数でコンテナを起動するには、次のコマンドを実行してテストデータベースに接続する必要があります:
docker run --rm -p 8890: 8080 -e GX_DEFAULT_DB_URL=jdbc:jtds:sqlserver://172.16.3.21:1435/EnvTest environmenttestjavaenvironment
本番用データベースの場合は次を実行します:
docker run --rm -p 8890: 8080 -e GX_DEFAULT_DB_URL=jdbc:jtds:sqlserver://172.16.3.21:1435/EnvProd environmenttestjavaenvironment
既定のデータストアで DB_URL 環境変数を検索すると、次の環境変数が検索されます:
GX_COM_ENVIRONMENTTEST_DEFAULT_DB_URL 
そのエントリーの値が見つからない場合は、GX_DEFAULT_DB_URL が検索されます。 
AWS MYSQL の例
docker run --rm -p 8890: 8080 -e GX_DEFAULT_DB_URL=jdbc:mysql://myrdsname.us-east-1.rds.amazonaws.com/mybdname?useSSL=false

クラウドサービス

この機能は、クラウドサービスのプロパティにも対応しています。たとえば、Microsoft Azure をストレージプロバイダーとして使用するようにアプリケーションを設定した場合、アカウントの詳細やコンテナ名などのいくつかのプロパティを設定する必要があります。これらのプロパティは、実行時に環境変数を介して変更することもできます。これらの変数についても、先頭に「GX_」を付けて、サービスのタイプとプロパティの名前をすべて大文字で指定する必要があります。したがって、パブリックコンテナ名を変更する場合は、GX_STORAGE_PUBLIC_CONTAINER_NAME という変数を作成し、任意の値を指定できます。生成された CloudServices.config ファイルを開いて、タイプとプロパティ名の詳細を確認できます。

プロパティのリダイレクト

環境変数を、さまざまなサービスに接続するための値付きで提供しているクラウドプロバイダーがあります。
この目的の環境変数がプロバイダーから提供されていない場合は、独自の環境変数を定義できます。
いずれの場合も、それらの変数を使用するには、特定のファイルを使用して、クラウドプロバイダーで定義された環境変数と設定プロパティとのマッピングを宣言します。これは confmapping.json というファイルで、必要なマッピングが設定された json octopus (プロパティ値) が含まれています。

Java の例

Amazon は環境変数 RDS_USERNAME や RDS_PASSWORD などを提供しており、RDS の対応する値が既にロードされています。その場合、Web アプリケーションの WEB-INF ディレクトリー内の confmapping.json ファイルに、次の json データが記述されています:
{"com.environmenttest|DEFAULT:USER_ID":"RDS_USERNAME","com.environmenttest|DEFAULT:USER_PASSWORD":"RDS_PASSWORD"}
Web アプリケーションで com.environmenttest |DEFAULT セクションの USER_ID プロパティが必要になると、RDS_USERNAME 環境プロパティの値を読み取ります (USER_PASSWORD / RDS_PASSWORD の場合も同じ)。 

.NET または .NET Core

.NET と .NET Core については、confmapping.json は次のようになります (XXX と YYY はクラウドプロバイダーで定義されている変数です)。
{"Connection-Default-DB":"XXX","Connection-Default-User":"YYY"}
注: どの値が考慮されているか、またはどの環境変数が設定されているかをテストするには、ConfigurationManager 外部オブジェクトを使用できます。

このソリューションに含まれていない設定情報 (ルールの例外)

いくつかの設定情報は環境変数で変更してはなりません。その理由は、プログラムのすべての部分 (gxcfg.js など) でそれらの変更が考慮されるわけではなく、不整合が発生する可能性があるためです。
これらの例外のリストを次に示します (次の設定エントリーの名前は .NET に対応します)。
  • AppMainNamespace
  • DateFormat
  • YearLimit
  • TimeAmPmFormat
  • VER_STAMP
  • StorageTimeZone
  • LANGUAGE
  • LANG_NAME
  • DECIMAL_POINT
  • DATE_FMT
  • CTOD_DATE_FMT
  • GX_BUILD_NUMBER
  • DocumentType

使用可能バージョン

この機能は、GeneXus 15 Upgrade 12 以降で利用できます。

参考情報

Docker にアプリケーションをデプロイする方法




サブページ
Created: 19/03/25 17:59 by Admin Last update: 23/02/19 15:54 by Admin
カテゴリ
Powered by GXwiki 3.0