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

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

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

Secrets Manager のシークレットを Amazon EKS のポッドにマウントされたファイルとして表示するには、Kubernetes シークレットストア CSI ドライバー向けの AWS シークレットおよび設定プロバイダー (ASCP) を使用します。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:GetSecretValuesecretsmanager:DescribeSecret のアクセス許可を付与するアクセス許可ポリシーを作成します。ポリシーの例については、「例: 個々のシークレットを読み、記述するアクセス許可」を参照してください。

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

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

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

ステップ 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 ポッドにシークレットをファイルとしてマウントする

次の手順は、サンプル YAML ファイル (ExampleSecretProviderClass.yamlExampleDeployment.yaml) を使用してシークレットをファイルとしてマウントする方法を示します。

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

  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>ID を使用してcsi-秘密-ストア-プロバイダー-awsポッドを使用します。

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