Amazon Elastic Kubernetes Service での Parameter Store パラメータの使用 - AWS Systems Manager

Amazon Elastic Kubernetes Service での Parameter Store パラメータの使用

Amazon EKS ポッドにマウントされたファイルとして Secrets Manager からのシークレットと、Parameter Store からのパラメータを表示するには、Kubernetes Secrets Store CSI Driver の AWS Secrets and Configuration Provider (ASCP) を使用できます。(Parameter Store は AWS Systems Manager の一機能です)。ASCP は Amazon Elastic Kubernetes Service (Amazon EKS) 1.17+ で動作します。AWS Fargate (Fargate) ノードグループはサポートされていません。

ASCP を使用すると、Parameter Store で保存・管理されているパラメータを取得できます。その後、Amazon EKS で実行中のワークロードでパラメータを使用できます。パラメータに JSON 形式のキー値ペアが複数含まれている場合は、オプションで Amazon EKS にマウントするように選択できます。ASCP は、JMESpath 構文を使用して、パラメータのキー値のペアを照会できます。

AWS Identity and Access Management (IAM) ロールとポリシーを使用して、パラメータへのアクセスを、クラスター内の特定の Amazon EKS ポッドに制限できます。ASCP はポッドアイデンティティを取得し、それを IAM ロールと交換します。ASCP はポッドの IAM ロールを引き継ぎます。その後、そのロールで認可されている Parameter Store からパラメータを取得できます。

Secrets Manager を Amazon EKS と統合する方法については、「Amazon Elastic Kubernetes Service での Secrets Manager シークレットの使用」を参照してください。

ASCP のインストール

ASCP は、secrets-store-csi-driver-provider-aws リポジトリの GitHub で入手できます。リポジトリには、シークレットを作成してマウントするための YAML ファイルの例も含まれています。最初に Kubernetes Secrets Store CSI ドライバー、その次に ASCP をインストールします。

Kubernetes Secrets Store CSI ドライバーと ASCP をインストールするには
  1. Kubernetes Secrets Store CSI ドライバーをインストールするには、次のコマンドを実行します。詳細なインストール手順については、Kubernetes Secrets Store CSI ドライバーブックの「インストール」を参照してください。Helm のインストールについては、「Amazon EKS での Helm の使用」を参照してください。

    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
  2. ASCP をインストールするには、GitHub リポジトリのデプロイディレクトリで YAML ファイルを使用します。kubectl のインストールについては、「kubectl のインストール」を参照してください。

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

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

Parameter Store で Amazon EKS ポッドのパラメータへのアクセス許可を付与するには、最初にポッドがアクセスする必要のあるパラメータへのアクセスを制限するポリシーを作成します。次に、サービスアカウントの IAM ロールを作成して、ポリシーをアタッチします。IAM ポリシーを使用して Systems Manager パラメータへのアクセスを制限する方法の詳細については、「IAM ポリシーを使用して Systems Manager パラメータへのアクセスを制限する」を参照してください。

注記

Parameter Store パラメータを使用する場合は、ポリシーでアクセス許可 ssm:GetParameters が必要です。

ASCP はポッド ID を取得し、IAM ロールとその ID を交換します。ASCP はポッドの IAM ロールを引き受け、承認したパラメータへのアクセスを付与します。他のコンテナは、IAM ロールに関連付けない限り、パラメータにアクセスできません。

ステップ 2: Amazon EKS でパラメータをマウントする

Amazon EKS でパラメータを、ファイルシステム上のファイルのように表示するには、パラメータに関する情報と Amazon EKS ポッドへのマウント方法を含む情報が含まれた SecretProviderClass YAML ファイルを作成します。

SecretProviderClassは、参照する Amazon EKS ポッドと同じ名前空間にある必要があります。

SecretProviderClass

SecretProviderClass YAML ファイルの形式は次のとおりです。

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: <NAME> spec: provider: aws parameters:
parameters

マウントリクエストの詳細が含まれます。

objects

マウントするパラメータの YAML 宣言を含む文字列。YAML 複数行の文字列またはパイプ (|) 文字を使用することをお勧めします。

objectName

パラメータのわかりやすい名前。これは、Amazon EKS ポッドのパラメータのファイル名になります (objectAlias を指定する場合は除きます)。Parameter Store で、これはパラメータの Name である必要があり、完全な Amazon リソースネーム (ARN) であることはできません。

jmesPath

(オプション) JSON エンコードパラメータのキーと、Amazon EKS にマウントされるファイルのマップ。以下の例は、JSON エンコードパラメータがどのようになるのかを示しています。

{ "username" : "myusername", "password" : "mypassword" }

キーは usernamepassword です。username に関連付けられている値は myusernamepassword に関連付けられている値は mypassword です。

path

パラメータのキー。

objectAlias

Amazon EKS ポッドにマウントされるファイル名。

objectType

Parameter Store には、このフィールドは必須です。ssmparameter を使用します。

objectAlias

(オプション) Amazon EKS ポッド内のパラメータのファイル名。このフィールドを指定しない場合は、objectName がファイル名として表示されます。

objectVersion

(オプション) パラメータのバージョン番号。このフィールドは、パラメータを更新するたびに更新する必要があるため、使用しないようお勧めします。デフォルトで、最新バージョンが使用されます。Parameter Store パラメータでは、objectVersion または objectVersionLabel を使用できますが、両方は使用できません。

objectVersionLabel

(オプション) バージョンのパラメータラベル。デフォルトは最新バージョンです。Parameter Store パラメータでは、objectVersion または objectVersionLabel を使用できますが、両方は使用できません。

region

(オプション) パラメータの AWS リージョン。このフィールドを使用しない場合、ASCP はノード上のアノテーションからリージョンを検索します。この検索では、マウントリクエストにオーバーヘッドが追加されるため、大量のポッドを使用するクラスターでリージョンを指定することをお勧めします。

pathTranslation

(オプション) ファイル名(objectName または objectAlias) に、Linux のスラッシュ (/) のようなパス区切り文字が含まれている場合に使用する単一の置換文字。パラメータ名にパス区切り文字が含まれている場合、ASCP はその名前でマウントされたファイルを作成できません。その代わり、パス区切り文字をこのフィールドに入力することで、別の文字に置き換えることができます。このフィールドを使用しない場合、デフォルトはアンダースコア (_) になります。たとえば、My/Path/ParameterMy_Path_Parameter としてマウントします。

文字の置換を防ぐには、文字列 False を入力してください。

次の設定例では、SecretProviderClass と Parameter Store パラメータリソースを示しています。

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "MyParameter" objectType: "ssmparameter"

ステップ 3: デプロイ YAML を更新する

デプロイ YAML を更新して secrets-store.csi.k8s.io ドライバーを使用し、前の手順で作成した SecretProviderClass リソースを参照します。これにより、クラスターが Secrets Store CSI ドライバーを使用していることを確認できます。

以下は、aws-secrets という名前の SecretProviderClass を使用したデプロイ YAML のサンプルです。

volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "aws-secrets"

チュートリアル: Amazon EKS ポッドでのパラメータの作成とマウント

このチュートリアルでは、Parameter Store でパラメータの例を作成し、Amazon EKS ポッドにパラメータをマウントしてデプロイします。

開始する前に、ASCP をインストールします。詳細については、「ASCP のインストール」を参照してください。

シークレットを作成してマウントするには
  1. bash コマンドで使用できるように、AWS リージョン とクラスターの名前をシェル変数として設定します。リージョンでは、Amazon EKS クラスターを実行する AWS リージョン を入力します。clustername では、クラスターの名前を入力します。

    REGION=region CLUSTERNAME=clustername
  2. テストパラメータを作成します。

    aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$REGION"
  3. ポッドのリソースポリシーを作成し、前のステップで作成したパラメータへのアクセスを制限します。parameter-arn では、パラメータの ARN を使用します。ポリシー ARN をシェル変数に保存します。パラメータ ARN を取得するには、get-parameter を使用します。

    POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn --output text iam create-policy --policy-name nginx-parameter-deployment-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ssm:GetParameter", "ssm:GetParameters"], "Resource": ["parameter-arn"] } ] }')
  4. クラスター用に IAM OpenID Connect (OIDC) プロバイダーがない場合は作成します。詳細については、「クラスターの IAM OIDC プロバイダを作成する」を参照してください。

    eksctl utils associate-iam-oidc-provider --region="$REGION" --cluster="$CLUSTERNAME" --approve # Only run this once
  5. ポッドが使用するサービスアカウントを作成し、ステップ 3 で作成したリソースポリシーをそのサービスアカウントに関連付けます。このチュートリアルでは、サービスアカウント名として nginx-deployment-sa を使用します。詳細については、「サービスアカウントの IAM ロールの作成」を参照してください。

    eksctl create iamserviceaccount --name nginx-deployment-sa --region="$REGION" --cluster "$CLUSTERNAME" --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts
  6. SecretProviderClass を作成して、ポッドにマウントするパラメータを指定します。次のコマンドは、ExampleSecretProviderClass.yaml という名前の SecretProviderClass ファイルの場所を使用します。独自の SecretProviderClass の作成については、「SecretProviderClass」を参照してください。

    kubectl apply -f ./ExampleSecretProviderClass.yaml
  7. ポッドをデプロイします。次のコマンドでは、ExampleDeployment.yaml という名前のデプロイファイルを使用します。独自の SecretProviderClass の作成については、「ステップ 3: デプロイ YAML を更新する」を参照してください。

    kubectl apply -f ./ExampleDeployment.yaml
  8. パラメータが正しくマウントされていることを確認するには、次のコマンドを使用して、パラメータ値が表示されていることを確認します。

    kubectl exec -it $(kubectl get pods | awk '/nginx-deployment/{print $1}' | head -1) cat /mnt/secrets-store/MyParameter; echo

    パラメータ値が表示されます。

    "EKS parameter"

トラブルシューティング

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

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

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

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

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/pod-id