Amazon Elastic Kubernetes Service で AWS Secrets Manager シークレットを使用する - AWS Secrets Manager

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Elastic Kubernetes Service で AWS Secrets Manager シークレットを使用する

Secrets Manager からのシークレットを Amazon EKS ポッドにマウントされたファイルとして表示するには、Kubernetes AWS Secrets Store CSI ドライバーのシークレットと設定プロバイダー (ASCP) を使用できます。 https://secrets-store-csi-driver.sigs.k8s.io/ASCP は、Amazon EC2 ノードグループを実行する Amazon Elastic Kubernetes Service (Amazon EKS) 1.17 以降で動作します。 AWS Fargate ノードグループはサポートされていません。ASCP を使用すると、Secrets Manager でシークレットを保存および管理し、Amazon EKS で実行されているワークロードからシークレットを取得できます。シークレットに JSON 形式の複数のキー/値ペアが含まれている場合は、Amazon EKS にマウントするキー/値ペアを選択できます。ASCP は JMESPath 構文を使用して、シークレット内のキー/値のペアをクエリします。ASCP はパラメータストアパラメータを使用しても動作します。

プライベート Amazon EKS クラスターを使用する場合は、クラスターがある VPC に、Secrets Manager エンドポイントが存在している必要があります。Secrets Store CSI ドライバーは、このエンドポイントを使用して Secrets Manager を呼び出します。VPC エンドポイントの作成については、「VPC エンドポイント」を参照してください。

シークレットに Secrets Manager の自動ローテーションを使用する場合は、 シークレットストア CSI ドライバーのローテーション調整機能を使用して、Secrets Manager から最新のシークレットを取得することもできます。詳細については、「マウントされたコンテンツと同期された Kubernetes シークレットの自動ローテーション」を参照してください。

ステップ 1: アクセス制御を設定する

ASCP は Amazon EKS ポッド ID を取得し、IAM ロールと交換します。その IAM ロールの IAM ポリシーでアクセス許可を設定します。ASCP が IAM ロールを引き受けると、承認したシークレットにアクセスできます。他のコンテナは、IAM ロールに関連付けられていない限り、シークレットにアクセスできません。

ポッドに関連付けられたリージョンと IAM ロールを検索するための ASCP からの呼び出しが Kubernetes によってスロットリングされている場合、ステップ 2 に示すようにhelm install、 を使用してスロットリングクォータを変更できます。

Amazon EKS ポッドに Secrets Manager のシークレットへのアクセスを許可するには
  1. ポッドがアクセスする必要があるシークレットに secretsmanager:GetSecretValueと アクセス許可を付与するアクセスsecretsmanager:DescribeSecret許可ポリシーを作成します。ポリシーの例については、「例: 個々のシークレットを読み書きするアクセス許可」を参照してください。

  2. クラスター用に IAM OpenID Connect (OIDC) プロバイダーがない場合は作成します。詳細については、「Amazon EKS ユーザーガイド」の「クラスターの IAM OIDC プロバイダーを作成する」を参照してください。

  3. サービスアカウントの IAM ロールを作成し、ポリシーをアタッチします。詳細については、「Amazon EKS ユーザーガイド」の「サービスアカウントの IAM ロールを作成する」を参照してください。

  4. プライベート Amazon EKS クラスターを使用する場合は、クラスターがある VPC に AWS STS エンドポイントがあることを確認します。エンドポイントの作成の詳細については、「 ユーザーガイド」の「インターフェイス VPC エンドポイントAWS Identity and Access Management 」を参照してください。

ステップ 2: ASCP をインストールして設定する

ASCP は、secrets-store-csi-provider-aws リポジトリの GitHub で使用できます。リポジトリには、シークレットを作成してマウントするための YAML ファイルの例も含まれています。

インストール中に、FIPS エンドポイントを使用するように ASCP を設定できます。; エンドポイントのリストについては、「AWS Secrets Manager エンドポイント」を参照してください。

Helm を使用して ASCP をインストールするには
  1. リポジトリが最新のチャートを指していることを確認するには、 を使用します。 helm repo update.

  2. Secrets Store CSI ドライバーチャートを追加します。

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  3. グラフをインストールします。スロットリングを設定するには、次のフラグを追加します。 --set-json 'k8sThrottlingParams={"qps": "<number of queries per second>", "burst": "<number of queries per second>"}'

    helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  4. ASCP チャートを追加します。

    helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
  5. グラフをインストールします。FIPS エンドポイントを使用するには、次のフラグを追加します。 --set useFipsEndpoint=true

    helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
リポジトリで YAML を使用して をインストールするには
  • 次のコマンドを使用します。

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

ステップ 3: マウントするシークレットを特定する

ASCP が (ファイルシステム上のファイルとして) Amazon EKS 内にマウントするシークレットを判別するには、SecretProviderClass YAML ファイルを作成します。には、マウントするシークレットと、マウントするファイル名がSecretProviderClass一覧表示されます。SecretProviderClassは、参照する Amazon EKS ポッドと同じ名前空間にある必要があります。

以下の例は、SecretProviderClass を使用して、マウントするシークレットと、Amazon EKS ポッドにマウントされたファイルの名前を記述する方法を示しています。

例: 名前または ARN でシークレットをマウントする

以下は、Amazon EKS で 3 ファイルをマウントする SecretProviderClass の例です。

  1. 完全な ARN によって指定されたシークレット

  2. 名前で指定されたシークレット

  3. シークレットの特定のバージョン

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MySecret2-d4e5f6" - objectName: "MySecret3" objectType: "secretsmanager" - objectName: "MySecret4" objectType: "secretsmanager" objectVersionLabel: "AWSCURRENT"

例: シークレットからキーと値のペアをマウントする

以下は、Amazon EKS で 3 ファイルをマウントする SecretProviderClass の例です。

  1. 完全な ARN によって指定されたシークレット

  2. 同じシークレットから取得した username キー/値のペア

  3. 同じシークレットから取得した password キー/値のペア

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MySecret-a1b2c3" jmesPath: - path: username objectAlias: dbusername - path: password objectAlias: dbpassword

例: マルチリージョンシークレットのフェイルオーバーリージョンを定義する

接続停止時あるいはディザスタリカバリ設定において可用性を確保するために、ASCP では自動フェイルオーバー機能により、セカンダリリージョンからシークレットを取得することができます。

次に、複数のリージョンにレプリケートされたシークレットを SecretProviderClass により取得する例を示します。この例では、ASCP が us-east-1us-east-2 の両方からシークレットの取得を試行します。どちらかのリージョンが認証の問題などで 4xx エラーを返した場合、ASCP はいずれのシークレットもマウントしません。シークレットが us-east-1 から正常に取得されると、ASCP はそのシークレット値をマウントします。us-east-1 からはシークレットが正常に取得されないものの、us-east-2 からは正常に取得された場合、ASCP は取得された方のシークレット値をマウントします。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: region: us-east-1 failoverRegion: us-east-2 objects: | - objectName: "MySecret"

例: マウントするフェイルオーバーシークレットを選択する

次に、フェイルオーバー時にマウントするシークレットを SecretProviderClass により指定する例を示します。フェイルオーバーシークレットとレプリカは異なります。この例では、 ASCP が objectName で指定された 2 つのシークレットの取得を試行します。どちらかが認証の問題などで 4xx エラーを返した場合、ASCP はいずれのシークレットもマウントしません。シークレットが us-east-1 から正常に取得されると、ASCP はそのシークレット値をマウントします。us-east-1 からはシークレットが正常に取得されないものの、us-east-2 からは正常に取得された場合、ASCP は取得された方のシークレット値をマウントします。Amazon EKS にマウントされたファイルには、MyMountedSecret という名前が付けられています。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: region: us-east-1 failoverRegion: us-east-2 objects: | - objectName: "arn:aws:secretsmanager:us-east-1:111122223333:secret:MySecret-a1b2c3" objectAlias: "MyMountedSecret" failoverObject: - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MyFailoverSecret-d4e5f6"

ステップ 4: Amazon EKS ポッドにシークレットをファイルとしてマウントする

Amazon EKS にシークレットをマウントするには
  1. コマンド SecretProviderClassを使用して をポッドに適用しますkubectl apply -f ExampleSecretProviderClass.yaml

  2. コマンド を使用してポッドをデプロイしますkubectl apply -f ExampleDeployment.yaml

  3. ASCP はファイルをマウントします。

トラブルシューティング

ポッドデプロイを記述すると、ほとんどのエラーを表示できます。

コンテナのエラーメッセージを表示するには
  1. 次のコマンドで、ポッド名のリストを取得します。デフォルトの名前空間を使用していない場合は、-n <NAMESPACE> を使用してください。

    kubectl get pods
  2. ポッドを記述するには、次のコマンドで、前のステップで見つけたポッドの ポッド ID を使用します (<PODID> の場合)。デフォルトの名前空間を使用していない場合は、-n <NAMESPACE> を使用してください。

    kubectl describe pod/<PODID>
ASCP のエラーを表示するには
  • プロバイダーログで詳細情報を確認するには、次のコマンドで、<PODID>csi-secrets-store-provider-aws ポッドの ID を使用します。

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/<PODID>