Amazon Elastic Kubernetes Service で Parameter Store パラメータを使用する
Amazon EKS ポッドにマウントされたファイルとして Secrets Manager からのシークレットと、Parameter Store からのパラメータを表示するには、Kubernetes Secrets Store CSI Driver
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
Kubernetes Secrets Store CSI ドライバーと ASCP をインストールするには
-
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
-
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 ポリシーを使用して Parameter Store パラメータへのアクセスを制限する」を参照してください。
注記
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" }
キーは
username
とpassword
です。username
に関連付けられている値はmyusername
、password
に関連付けられている値は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/Parameter
がMy_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 のインストール」を参照してください。
シークレットを作成してマウントするには
-
bash
コマンドで使用できるように、AWS リージョン とクラスターの名前をシェル変数として設定します。リージョン
では、Amazon EKS クラスターを実行する AWS リージョン を入力します。clustername
では、クラスターの名前を入力します。REGION=
region
CLUSTERNAME=clustername
-
テストパラメータを作成します。
aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$REGION"
-
ポッドのリソースポリシーを作成し、前のステップで作成したパラメータへのアクセスを制限します。
では、パラメータの ARN を使用します。ポリシー ARN をシェル変数に保存します。パラメータ ARN を取得するには、parameter-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
"] } ] }') -
クラスター用に IAM OpenID Connect (OIDC) プロバイダーがない場合は作成します。詳細については、「クラスターの IAM OIDC プロバイダを作成する」を参照してください。
eksctl utils associate-iam-oidc-provider --region="$REGION" --cluster="$CLUSTERNAME" --approve # Only run this once
-
ポッドが使用するサービスアカウントを作成し、ステップ 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
-
SecretProviderClass
を作成して、ポッドにマウントするパラメータを指定します。次のコマンドは、ExampleSecretProviderClass.yaml
という名前のSecretProviderClass
ファイルの場所を使用します。独自のSecretProviderClass
の作成については、「SecretProviderClass」を参照してください。kubectl apply -f ./ExampleSecretProviderClass.yaml
-
ポッドをデプロイします。次のコマンドでは、
ExampleDeployment.yaml
という名前のデプロイファイルを使用します。独自のSecretProviderClass
の作成については、「ステップ 3: デプロイ YAML を更新する」を参照してください。kubectl apply -f ./ExampleDeployment.yaml
-
パラメータが正しくマウントされていることを確認するには、次のコマンドを使用して、パラメータ値が表示されていることを確認します。
kubectl exec -it $(kubectl get pods | awk '/nginx-deployment/{print $1}' | head -1) cat /mnt/secrets-store/MyParameter; echo
パラメータ値が表示されます。
"EKS parameter"
トラブルシューティング
ポッドデプロイを記述すると、ほとんどのエラーを表示できます。
コンテナのエラーメッセージを表示するには
-
次のコマンドで、ポッド名のリストを取得します。デフォルトの名前空間を使用していない場合は、
-n <NAMESPACE>
を使用してください。kubectl get pods
-
次のコマンドでポッドを記述するには、
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