Kubernetes Secret へのデータの保存

このトピックでは、機密データを Kubernetes Secret に保存し、API プロキシフローのフロー変数からデータを取得する方法について説明します。

はじめに

有効期限がなく、API プロキシ ロジックにハードコードすべきでないデータについては、格納して実行時に取得されるようにすることが必要な場合があります。1 つの選択肢は、ハイブリッド 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 を作成する方法について説明します。

  1. Kubernetes Secret に保存するファイルを 1 つ以上作成します。このファイルは、Kubernetes Secret に保存できるデータの種類に記載されているファイル拡張子が付いた、サポート対象形式のいずれかにする必要があります。
  2. 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
    
  3. 作成後、すべてのクラスタに変更が反映されるまで最大 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 ポリシーで apikeyOrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z を取得し、フロー変数 my-apikey に保存します。

Secret の更新

kubectl では Kubernetes Secret の更新がサポートされないため、まず既存の Secret を削除し、Kubernetes Secret の作成の手順で再作成します。