このトピックでは、センシティブ データを Kubernetes シークレットに保存し、API プロキシフローのフロー変数からデータを取得する方法について説明します。
概要
有効期限がなく、API プロキシ ロジックにハードコードすべきでないデータについては、格納して実行時に取得されるようにすることが必要な場合があります。1 つの選択肢は、ハイブリッド Key-Value マップ(KVM)機能の使用です。センシティブ データ用のカスタム Vault でシークレット管理のためにすでに Kubernetes を使用している場合は、このトピックで説明する Kubernetes シークレット機能の使用を検討してください。KVM データと同様に、API プロキシフロー変数で Kubernetes シークレット データにアクセスできます。
Kubernetes シークレットに保存できるデータの種類
Apigee ハイブリッドでは、Kubernetes シークレットに保存できるデータファイルが次の種類に制限されます。以下の種類です。
ファイル形式 | サポートされているファイル拡張子 |
---|---|
TLS 証明書と鍵ファイル | *.crt 、*.key 、*.pem |
プロパティ ファイル | *.properties |
プロパティ ファイルは、Key-Value ペアが含まれるファイルです。例:
username=admin password=1f2d1e2e7df
Kubernetes シークレットの作成
このセクションでは、クラスタにセンシティブ データを保存するための Kubernetes シークレットを作成する方法について説明します。
- Kubernetes シークレットに保存するファイルを作成します。このファイルは、Kubernetes シークレットに保存できるデータの種類に一覧表示されているファイル拡張子付きのサポートされている形式のいずれかにする必要があります。
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 名前空間。
- org: Apigee の組織名。
- env: 組織内の環境の名前。
- filepath: シークレットに含めるファイルへのパス。シークレットに含める少なくとも 1 つのファイルを指定する必要があります。
- prop-file: シークレットに含めるプロパティ ファイルの名前。
- key-file: シークレットに含める TLS 鍵ファイルの名前。
- cert-file: シークレットに含める TLS 証明書ファイルの名前。
シークレットには 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 秒ごとにシークレットの変更をポーリングします。変更が検出されると、キャッシュが更新されます。
シークレットからデータを取得する
シークレットが作成され、使用可能になると(通常は作成から約 90 秒後)、シークレットが保存される組織 / 環境の API プロキシフローのフロー変数にアクセスできます。たとえば、次のように、API キーが含まれる credentials.properties
という名前の *.properties
ファイルがシークレットに含まれているとします。
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 |
変数に固有の名前空間。ハイブリッド クラスタに保存されているすべての Kubernetes シークレットでこの名前空間が共有されます。 |
credential.properties |
Kubernetes シークレットに保存されているファイルの名前。 |
apikey |
プロパティ ファイルに保存されているキーの名前。 |
この例では、Assign Message ポリシーで apikey
値 OrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z
を取得し、フロー変数 my-apikey
に保存します。
シークレットの更新
kubectl
では Kubernetes シークレットの更新がサポートされないため、まず既存のシークレットを削除して、Kubernetes シークレットの作成の手順に従って再作成します。