このトピックでは、機密データを Kubernetes Secret に保存し、API プロキシフローのフロー変数からデータを取得する方法について説明します。
はじめに
有効期限がなく、API プロキシ ロジックにハードコードすべきでないデータについては、格納して実行時に取得されるようにすることが必要な場合があります。一つの選択肢は、ハイブリッドの Key-Value マップ(KVM)機能を使用することです。すでに Kubernetes を使って機密データ用のカスタム Vault で Secret 管理を行っている場合は、このトピックで説明する Kubernetes Secret 機能の使用を検討してください。KVM データと同様に、Kubernetes Secret データには API プロキシフロー変数でアクセスできます。
Kubernetes Secret に保存できるデータの種類
Apigee ハイブリッドでは、Kubernetes Secret に保存できるデータファイルが次の種類に制限されます。これには、次のようなものがあります。
ファイル形式 | サポートされているファイル拡張子 |
---|---|
TLS 証明書と鍵ファイル | *.crt 、*.key 、*.pem |
プロパティ ファイル | *.properties |
プロパティ ファイルは、Key-Value ペアが含まれるファイルです。次に例を示します。
username=admin password=1f2d1e2e7df
Kubernetes Secret の作成
このセクションでは、クラスタにセンシティブ データを保存するための Kubernetes Secret を作成する方法について説明します。
- Kubernetes Secret に保存するファイルを作成します。このファイルは、Kubernetes Secret に保存できるデータの種類に記載されているファイル拡張子が付いた、サポート対象形式のいずれかにする必要があります。
kubectl create secret generic
コマンドを実行します。次に例を示します。kubectl -n namespace create secret generic org-env-policy-secret \ --from-file=filepath/prop-file.properties \ --from-file=filepath/key-file.key \ --from-file="filepath/cert-file.pem
ここで
- namespace: ランタイム コンポーネントがデプロイされる Kubernetes Namespace。
- org: Apigee の組織名。
- env: 組織内の環境の名前。
- filepath: Secret に含めるファイルへのパス。Secret に含めるファイルを少なくとも 1 つ指定する必要があります。
- prop-file: Secret に含めるプロパティ ファイルの名前。
- key-file: Secret に含める TLS 鍵ファイルの名前。
- cert-file: Secret に含める TLS 証明書ファイルの名前。
Secret には、1 つ以上のファイルを含めることができます。次に例を示します。
kubectl -n apigee create secret generic myorg-test-policy-secret \ --from-file="$policy_secrets_path"/credential.properties \ --from-file="$policy_secrets_path"/secrets.properties \ --from-file="$policy_secrets_path"/public.key \ --from-file="$policy_secrets_path"/fullchain.pem
作成後、すべてのクラスタに変更が反映されるまで最大 90 秒かかることがあります。Message Processor は 30 秒ごとに Secret の変更をポーリングします。変更が検出されると、キャッシュが更新されます。
Secret からのデータの取得
Secret が作成され、使用可能になると(通常は作成から約 90 秒後)、Secret が保存されている組織 / 環境の API プロキシフローのフロー変数で Secret データにアクセスできます。たとえば、次のように、API キーが含まれる credentials.properties
という *.properties
ファイルが Secret に含まれているとします。
apikey=OrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z
この場合、Assign Message などのポリシーを使用して、フロー変数から API キーを取得できます。次に例を示します。
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>my-apikey</Name> <Ref>private.secret.credential.properties.apikey</Ref> </AssignVariable> </AssignMessage>
Ref
要素で参照される変数名 private.secret.credential.properties.apikey
は、以下の部分から構成されます。
変数名の各部 | 説明 |
---|---|
private.secret |
変数に固有の Namespace。ハイブリッド クラスタに格納されているすべての Kubernetes Secret でこの Namespace が共有されます。 |
credential.properties |
Kubernetes Secret に格納されているファイルの名前。 |
apikey |
プロパティ ファイルに格納されているキーの名前。 |
この例では、Assign Message ポリシーで apikey
値 OrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z
を取得し、フロー変数 my-apikey
に保存します。
Secret の更新
kubectl
では Kubernetes Secret の更新がサポートされないため、まず既存の Secret を削除し、Kubernetes Secret の作成の手順で再作成します。