Kubernetes Secret にデータを保存する

このトピックでは、センシティブ データを 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 シークレットを作成する方法について説明します。

  1. Kubernetes シークレットに保存するファイルを作成します。このファイルは、Kubernetes シークレットに保存できるデータの種類に一覧表示されているファイル拡張子付きのサポートされている形式のいずれかにする必要があります。
  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 名前空間。
    • 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
    
  3. 作成後、すべてのクラスタに変更が反映されるまでに最大 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 ポリシーで apikeyOrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z を取得し、フロー変数 my-apikey に保存します。

シークレットの更新

kubectl では Kubernetes シークレットの更新がサポートされないため、まず既存のシークレットを削除して、Kubernetes シークレットの作成の手順に従って再作成します。