Node 用 App Configuration サーバー SDK
App Configuration サービスは、Node.js マイクロサービスまたはアプリケーションと統合される SDK を提供します。
バージョン v0.4.0 では、 getCurrentValue メソッドの戻り値に変更が加えられています。 したがって、現在 v0.4.0 より前のバージョンを使用している場合は、SDKを最新バージョンにアップグレードする前に、 移行ガイドをお読みください。
Node 用サーバー SDK の統合
App Configuration サービスは、Node.js マイクロサービスまたはアプリケーションと統合される SDK を提供します。 App Configuration SDK を統合することで、機能フラグおよびプロパティーの値を評価できます。
-
SDK をインストールします。
npmレジストリーの以下のコードを使用します。npm install ibm-appconfiguration-node-sdk@latest -
次のコードを使用して、Node.js マイクロサービスに SDK モジュールを組み込みます。
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); -
App Configuration サービス・インスタンスと接続するように SDK を初期化します。
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); const appConfigClient = AppConfiguration.getInstance(); const region = '<region>'; const guid = '<guid>'; const apikey = '<apikey>'; const collectionId = 'airlines-webapp'; const environmentId = 'dev'; async function initialiseAppConfig() { appConfigClient.setDebug(true); // optional. (remove if not needed) appConfigClient.init(region, guid, apikey); await appConfigClient.setContext(collectionId, environmentId); } try { await initialiseAppConfig(); console.log("app configuration sdk init successful"); } catch (e) { console.error("failed to initialise app configuration sdk", e); }ここで、
region: 「 App Configuration 」サービスインスタンスが作成されるリージョンの名前。 対応拠点のリストは こちら。 例:us-south、au-sydなど。guid: 「 App Configuration 」サービスのインスタンスID。 App Configuration ダッシュボードの「サービス認証情報」セクションから取得してください。apikeyApiKey: App Configuration ( サービス)。 App Configuration ダッシュボードの「サービス認証情報」セクションから取得してください。collectionId: 「 App Configuration 」サービスインスタンスの「コレクション」セクション内に作成されたコレクションのID。environmentId:「環境」セクションの下のアプリ構成サービス・インスタンスで作成された環境の ID。
init()およびsetContext()は初期化方式であり、appConfigClientを使用して 1 回だけ 開始する必要があります。appConfigClientは、初期化された後、AppConfiguration.getInstance()を使用して複数のモジュールにわたって取得できます。
プライベート・エンドポイントの使用
オプションで、 IBM Cloud プライベート・ネットワークを介してのみアクセス可能なプライベート・エンドポイントを使用して、 App Configuration サービスに接続するように SDK を設定します。
appConfigClient.usePrivateEndpoint(true);
これは、SDK で init 関数を呼び出す前に行う必要があります。
構成に永続キャッシュを使用するオプション
万が一、アプリケーションの再起動中に App Configuration サービスが利用できなくなった場合でも、アプリケーションとSDKが引き続き動作し続けるようにするため、SDKが永続キャッシュを使用するように設定することができます。 SDK は、永続キャッシュを使用して、アプリケーションの再起動後に使用可能な App Configuration データを保管します。
// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId)
// 2. optional (with persistent cache)
appConfigClient.setContext(collectionId, environmentId, {
persistentCacheDirectory: '/var/lib/docker/volumes/'
})
ここで、
-
persistentCacheDirectory: ユーザーが読み取りおよび書き込み権限を持つディレクトリへの絶対パス。 このSDKは、指定されたディレクトリに「appconfiguration.json」というファイルを作成します。このファイルは、 App Configuration サービスの情報を保存するための永続キャッシュとして使用されます。永続キャッシュが有効になっている場合に SDK は、既知の最新の正常な構成を永続キャッシュに保持します。 App Configuration サーバーに接続できない場合、永続キャッシュ内の最新の設定がアプリケーションに読み込まれ、処理が継続されます。
キャッシュ・ファイルが失われたり削除されたりしていないことを確認してください。 例えば、 Kubernetes のポッドが再起動され、キャッシュファイル(appconfiguration.json )がポッドの一時ボリュームに保存されていた場合を考えてみましょう。 ポッドが再起動されると、 Kubernetes によってポッド内の一時ボリュームが破棄され、その結果、キャッシュファイルが削除されます。 そのため、SDK によって作成されたキャッシュ・ファイルが、永続ディレクトリーの正しい絶対パスを指定することによって、常に永続ボリュームに保管されるようにしてください。
オフライン・オプション
また、このSDKは、 App Configuration サービスに接続していなくても、設定の提供や、機能フラグおよびプロパティの評価を実行できるように設計されています。
appConfigClient.setContext(collectionId, environmentId, {
bootstrapFile: 'saflights/flights.json',
liveConfigUpdateEnabled: false
})
ここで、
bootstrapFile: 設定の詳細が記載されたJSONファイルの絶対パス。 必ず正しい JSON ファイルを指定してください。 このファイルは、 IBM Cloud App Configuration CLI のibmcloud ac exportコマンドを使用して生成できます。liveConfigUpdateEnabled: サーバーからのリアルタイムな設定更新。 サーバーから新しい設定値を取得しない場合は、この値を「false」に設定してください。
機能関連 API およびプロパティー関連 API の使用例
フィーチャー関連 API の使用については、以下の例を参照してください。
単一の機能を取得する
const feature = appConfigClient.getFeature('feature_id'); // feature can be null incase of an invalid feature id
if (feature !== null) {
console.log(`Feature Name ${feature.getFeatureName()} `);
console.log(`Feature Id ${feature.getFeatureId()} `);
console.log(`Feature Type ${feature.getFeatureDataType()} `);
if (feature.isEnabled()) {
// feature flag is enabled
} else {
// feature flag is disabled
}
}
すべての機能を取得する
const features = appConfigClient.getFeatures();
const feature = features['feature_id'];
if (feature !== null) {
console.log(`Feature Name ${feature.getFeatureName()} `);
console.log(`Feature Id ${feature.getFeatureId()} `);
console.log(`Feature Type ${feature.getFeatureDataType()} `);
console.log(`Is feature enabled? ${feature.isEnabled()} `);
}
機能評価
feature.getCurrentValue(entityId, entityAttributes) メソッドを使用して、機能フラグの値を評価できます。 このメソッドは、評価された値、機能フラグが有効な状況、および評価の詳細を含む JSON オブジェクトを返します。
const entityId = '<entityId>';
const entityAttributes = {
city: 'Bangalore',
country: 'India',
};
const result = feature.getCurrentValue(entityId, entityAttributes);
console.log(result.value); // Evaluated value of the feature flag. The type of evaluated value will match the type of feature flag (Boolean, String, Numeric).
console.log(result.isEnabled); // enabled status.
console.log(result.details); // a JSON object containing detailed information of the evaluation.
// the `result.details` will have the following
console.log(result.details.valueType); // a string value. Example: DISABLED_VALUE
console.log(result.details.reason); // a string value. Example: Disabled value of the feature flag since the feature flag is disabled.
console.log(result.details.segmentName); // (only if applicable, else it is undefined) a string value containing the segment name for which the feature flag was evaluated.
console.log(result.details.rolloutPercentageApplied); // (only if applicable, else it is undefined) a boolean value. True if the entityId was part of the rollout percentage evaluation, false otherwise.
console.log(result.details.errorType); // (only if applicable, else it is undefined) contains the error.message if any error was occured during the evaluation.
-
entityId: エンティティーの ID。 これは、フィーチャーが評価されるエンティティーに関連するストリング ID です。 例えば、エンティティーは、モバイル・デバイス上で実行されるアプリのインスタンス、クラウド上で実行されるマイクロサービス、またはそのマイクロサービスを実行するインフラストラクチャーのコンポーネントの場合があります。 いずれかのエンティティーが App Configuration と対話するには、固有のエンティティー ID を提供する必要があります。 -
entityAttributes: 指定されたエンティティーを定義する属性名とその値で構成される JSON オブジェクト。 フィーチャー・フラグがターゲット定義で構成されていない場合、これはオプション・パラメーターです。 ターゲットが構成されている場合は、ルール評価のためにentityAttributesを指定する必要があります。 属性は、セグメントを定義するために使用されるパラメーターです。 SDK は、属性値を使用して、指定されたエンティティーがターゲット・ルールを満たしているかどうかを判別し、適切なフィーチャー・フラグ値を返します。
単一のプロパティーを取得する
const property = appConfigClient.getProperty('property_id'); // property can be null incase of an invalid property id
if (property != null) {
console.log(`Property Name ${property.getPropertyName()} `);
console.log(`Property Id ${property.getPropertyId()} `);
console.log(`Property Type ${property.getPropertyDataType()} `);
}
すべてのプロパティーを取得する
const properties = appConfigClient.getProperties();
const property = properties['property_id'];
if (property != null) {
console.log(`Property Name ${property.getPropertyName()} `);
console.log(`Property Id ${property.getPropertyId()} `);
console.log(`Property Type ${property.getPropertyDataType()} `);
}
プロパティーの評価
property.getCurrentValue(entityId, entityAttributes) メソッドを使用して、プロパティーの値を評価できます。 このメソッドは、評価された値と評価の詳細を含む JSON オブジェクトを返します。
const entityId = '<entityId>';
const entityAttributes = {
city: 'Bangalore',
country: 'India',
};
const result = property.getCurrentValue(entityId, entityAttributes);
console.log(result.value); // Evaluated value of the property. The type of evaluated value will match the type of property (Boolean, String, Numeric).
console.log(result.details); // a JSON object containing detailed information of the evaluation. See below
// the `result.details` will have the following
console.log(result.details.valueType); // a string value. Example: DEFAULT_VALUE
console.log(result.details.reason); // a string value. Example: Default value of the property.
console.log(result.details.segmentName); // (only if applicable, else it is undefined) a string value containing the segment name for which the property was evaluated.
console.log(result.details.errorType); // (only if applicable, else it is undefined) contains the error.message if any error was occured during the evaluation.
-
entityId: エンティティーの ID。 これは、プロパティーが評価されるエンティティーに関連するストリング ID です。 例えば、エンティティーは、モバイル・デバイス上で実行されるアプリのインスタンス、クラウド上で実行されるマイクロサービス、またはそのマイクロサービスを実行するインフラストラクチャーのコンポーネントの場合があります。 いずれかのエンティティーが App Configuration と対話するには、固有のエンティティー ID を提供する必要があります。 -
entityAttributes: 指定されたエンティティーを定義する属性名とその値で構成される JSON オブジェクト。 プロパティーがターゲット定義で構成されていない場合、これはオプション・パラメーターです。 ターゲットが構成されている場合は、ルール評価のためにentityAttributesを指定する必要があります。 属性は、セグメントを定義するために使用されるパラメーターです。 SDK は、属性値を使用して、指定されたエンティティーがターゲット・ルールを満たしているかどうかを判別し、適切なプロパティー値を返します。
シークレット・プロパティーの取得
App Configurationに保管されている秘密参照を明示的に取得する方法。
const secretPropertyObject = appConfigClient.getSecret(propertyId, secretsManagerObject);
ここでは、
-
propertyID:propertyIDは固有のストリング ID です。これを使用すると、シークレットをフェッチするために必要なデータを提供するプロパティーをフェッチできます。 -
secretsManagerObject:secretsManagerObjectは、シークレット・プロパティーの評価時にシークレットを取得するために使用される Secrets Manager クライアント・オブジェクトです。 Secrets Manager クライアント・オブジェクトの作成方法について詳しくは、 こちらを参照してください。
シークレット・プロパティーの評価
secretPropertyObject.getCurrentValue(entityId, entityAttributes) メソッドを使用して、secret プロパティーの値を評価します。 このメソッド呼び出しの出力は、フィーチャーおよびプロパティー・オブジェクトを使用して開始された getCurrentValue とは異なります。 このメソッドは、 Secrets Manager からの応答で解決するか、エラーで拒否する
Promise を返します。 解決される値は、評価されたシークレット参照の実際のシークレット値です。 応答には、本文、ヘッダー、状況コード、および状況テキストが含まれます。 async または await を使用している場合は、try または catch を使用してエラーを処理してください。
const entityId = 'john_doe';
const entityAttributes = {
city: 'Bangalore',
country: 'India',
};
try {
const res = await secretPropertyObject.getCurrentValue(entityId, entityAttributes);
console.log(JSON.stringify(res, null, 2)); // view entire response.
console.log('Resulting secret:\n', res.result.resources[0].secret_data.payload); // the actual secret value.
} catch (err) {
// handle the error
}
ここでは、
-
entityId:entityIdは、プロパティーの評価対象となるエンティティーに関連するストリング ID です。 たとえば、エンティティとは、モバイルデバイス上で動作するアプリケーションのインスタンス、クラウド上で動作するマイクロサービス、あるいはそのマイクロサービスを実行するインフラストラクチャのコンポーネントなどを指す場合があります。 いずれかのエンティティーが App Configuration と対話するには、固有のエンティティー ID を提供する必要があります。 -
entityAttributes:entityAttributesは、指定されたエンティティーを定義する属性名とその値で構成される、タイプmap[string]interface{}のマップです。 プロパティーがターゲット定義で構成されていない場合、これはオプション・パラメーターです。 ターゲットが構成されている場合は、ルール評価のためにentityAttributesを指定する必要があります。 属性は、セグメントを定義するために使用されるパラメーターです。 SDK は属性値を使用して、指定されたエンティティーがターゲット・ルールを満たしているかどうかを判別し、適切な値を返します。
他のモジュールから appConfigClient を取得する
SDKの初期化が完了すると、以下に示すように、他のモジュールから appConfigClient を取得できるようになります
// **other modules**
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk');
const appConfigClient = AppConfiguration.getInstance();
feature = appConfigClient.getFeature('online-check-in');
const enabled = feature.isEnabled();
const featureValue = feature.getCurrentValue(entityId, entityAttributes)
サポート対象データ・タイプ
App Configuration を使用して、機能フラグやプロパティを設定できます。サポートされているデータ型は、Boolean、Numeric、 SecretRef,、String です。 「文字列」データ・タイプは、テキスト文字列、JSON、YAML のフォーマットにできます。 SDK は、表に示されているように各フォーマットを処理します。
| フィーチャーまたはプロパティーの値 | データ型 | データ形式 | getCurrentValue().value によって返されるデータのタイプ |
出力例 |
|---|---|---|---|---|
true |
BOOLEAN | 適用外 | boolean |
true |
25 |
NUMERIC | 適用外 | number |
25 |
| "文字列テキスト" | STRING | TEXT | string |
a string text |
{"firefox": {"name": "Firefox","pref_url": "about:config"}} |
STRING | JSON | JSONObject | {"firefox":{"name":"Firefox","pref_url":"about:config"}} |
men:- John Smith- Bill Joneswomen:- Mary Smith- Susan Williams |
STRING | YAML | java.lang.String |
`"men:
|
タイプがシークレット参照のプロパティーについては、README セクションの シークレット・プロパティーの評価 を参照してください。
機能フラグ
const feature = appConfigClient.getFeature('json-feature');
feature.getFeatureDataType(); // STRING
feature.getFeatureDataFormat(); // JSON
// Example (traversing the returned JSON)
let result = feature.getCurrentValue(entityId, entityAttributes);
console.log(result.value.key) // prints the value of the key
const feature = appConfigClient.getFeature('yaml-feature');
feature.getFeatureDataType(); // STRING
feature.getFeatureDataFormat(); // YAML
feature.getCurrentValue(entityId, entityAttributes);
プロパティー (Property)
const property = appConfigClient.getProperty('json-property');
property.getPropertyDataType(); // STRING
property.getPropertyDataFormat(); // JSON
// Example (traversing the returned JSON)
let result = property.getCurrentValue(entityId, entityAttributes);
console.log(result.value.key) // prints the value of the key
const property = appConfigClient.getProperty('yaml-property');
property.getPropertyDataType(); // STRING
property.getPropertyDataFormat(); // YAML
property.getCurrentValue(entityId, entityAttributes);
機能またはプロパティー変更を listen する
このSDKでは、機能フラグやプロパティの設定が変更された際に、リアルタイムで通知を行うイベントベースの仕組みが提供されています。 同じ appConfigClient を使用して configurationUpdate イベントを listen できます。
appConfigClient.emitter.on('configurationUpdate', () => {
// **add your code**
// To find the effect of any configuration changes, you can call the feature or property related methods
// feature = appConfigClient.getFeature('online-check-in');
// newResult = feature.getCurrentValue(entityId, entityAttributes);
});