# Kubernetes Secretからの環境変数の注入

Kubernetes Secretから機密データ(パスワード、APIキー、トークンなど)を環境変数としてジョブ(データ統合、ビッグデータ、データサービス)およびルートタスクに注入することで、資格情報を簡単かつ安全に使用できるようにします。

情報メモ重要: 機密データはKubernetes Secretに保存され、組織のセキュリティポリシーによって管理されます。Dynamic Engineのカスタマイズパターンは、Dynamic Engine環境にデプロイされたタスクへのこの情報へのアクセスのみを提供します。Qlikはユーザーの機密データを管理しません。

## 始める前に

[前提条件および重要な考慮事項](https://help.qlik.com/talend/ja-JP/dynamic-engine-configuration-guide/Cloud/custom-kubernetes-resource-mounting)をご覧ください。

## 手順

1. 機密データを含むKubernetes Secretリソースファイルを作成します。

   機密データを含むexternal-secret-as-env.yamlという名前のファイルを作成します。
   ```
   cat <<EOF > external-secret-as-env.yaml
   apiVersion: v1
   kind: Secret
   metadata:
     name: external-secret-as-env
     namespace: qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_ID
   type: Opaque
   stringData:
     DATABASE_PASSWORD: "mySecurePassword123"
     API_KEY: "your_key"
     AUTH_TOKEN: "Bearer your_token"
   EOF
   ```

   サンプルの認証情報を実際の機密データに置き換えます。

   Dynamic Engineは機密データを管理しません。Kubernetes Secretでデータがどのようにエンコードされるかについての詳細については、Kubernetesドキュメントの[Secret](https://kubernetes.io/docs/concepts/configuration/secret/)を参照してください。
2. Secretを参照するHelm値ファイルを作成します。

   たとえば、secret-values.yamlという名前のファイルを作成します。ユースケースに合う方法を選択します。
   * additionalSpec.envFromを使用して、すべてのSecretキーを環境変数として注入する(一括注入):

     ```
     configuration:
       jobDeployment:
         additionalSpec:
           enabled: true
           envFrom:
             - secretRef:
                 name: external-secret-as-env
     ```

     このアプローチでは、Secretに保存されているすべてのキー(DATABASE\_PASSWORD、API\_KEY、AUTH\_TOKENなど)を環境変数として読み込みます。

   * additionalSpec.envを使用して、特定のSecretキーを選択的に注入する(きめ細やかな制御が可能)：

     ```
     configuration:
       jobDeployment:
         additionalSpec:
           enabled: true
           env:
             - name: DATABASE_PASSWORD
               valueFrom:
                 secretKeyRef:
                   name: external-secret-as-env
                   key: DATABASE_PASSWORD
             - name: API_KEY
               valueFrom:
                 secretKeyRef:
                   name: external-secret-as-env
                   key: API_KEY
     ```

     このアプローチでは、必要なキーのみを選択的に注入し、その他のSecretキーはポッドからアクセスできないようにします。
3. Dynamic Engine環境をデプロイまたはアップグレードして必要なネームスペースを作成します。
   ```
   helm upgrade --install dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
     oci://ghcr.io/talend/helm/dynamic-engine-environment \
     --version ${DYNAMIC_ENGINE_VERSION} \
     -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml
   ```

   ${DYNAMIC\_ENGINE\_VERSION}を自分の環境のバージョンに置き換えます。

   このコマンドを実行すると、Dynamic Engine環境とそれに関連付けられたネームスペースqlik-processing-env-$DYNAMIC\_ENGINE\_ENVIRONMENT\_IDを作成します。
4. Dynamic Engine環境のネームスペースにSecretを作成します。
   ```
   kubectl apply -f external-secret-as-env.yaml
   ```

   このコマンドにより、Kubernetesクラスター内にSecretリソースが作成されます。環境ネームスペース内のすべてのポッドでSecretが使用できるようになりました。
5. このSecret設定を使用して、Dynamic Engine環境をアップグレードします。
   ```
   helm upgrade dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
     oci://ghcr.io/talend/helm/dynamic-engine-environment \
     --version ${DYNAMIC_ENGINE_VERSION} \
     -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml \
     -f secret-values.yaml
   ```

   ${DYNAMIC\_ENGINE\_VERSION}を自分の環境のバージョンに置き換えます。

   このコマンドにより、Secret設定がDynamic Engine環境に適用されます。機密データは、デプロイされたすべてのタスクで環境変数として使用できるようになりました。
6. 実行中のポッドでSecret環境変数を使用できることを確認します。

   選択した注入方法に対応するコマンドを使用して、Secretが正しく注入されていることを確認します。

   envFromで一括注入を使用した場合:
   ```
   kubectl get pod -n qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_ID <pod-name> \
     -o jsonpath='{.spec.containers[*].envFrom}'
   ```

   想定される出力により、Secret参照が確認できる:
   ```
   [{"secretRef":{"name":"external-secret-as-env"}}]
   ```

   envで選択的な注入を使用した場合:
   ```
   kubectl get pod -n qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_ID <pod-name> \
     -o jsonpath='{.spec.containers[*].env}'
   ```

   想定される出力結果は、選択したSecretキーが環境変数としてマウントされていることを示しています。

## タスクの結果

Dynamic Engine環境内のタスクから、Kubernetes Secretに保存された機密認証情報に安全にアクセスできるようになりました。認証情報はSecretを更新することでローテーションでき、変更は次のように反映されます。

* データ統合(ビッグデータタスクを含む)は一度限りのタスクです。更新された値は、次回のタスク実行開始時に読み込まれます。
* ルートとデータサービスは常時稼働するタスクであり、Secretの変更は自動的に再読み込みされません。[Talend Management Consoleでタスクを更新する](https://help.qlik.com/talend/ja-JP/dynamic-engine-configuration-guide/Cloud/updating-data-service-and-route-tasks-in-dee "Dynamic Engine環境にデプロイされたデータサービスやルートタスクは、ダウンタイムなしでそのアーティファクトバージョンをアップデートしたり、設定を変更したりできます。")ことで、Dynamic Engine環境への再デプロイがトリガーされます。