1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【EKS】Pod IdentityでAWS Secrets Manager and Config Provider(ASCP)を利用する

Last updated at Posted at 2025-03-29

※ 参考 : ASCP と Pod Identity の統合を発表: Amazon EKS でのシークレット管理のセキュリティ強化 | AWS ブログ

Secrets Store CSI Driver と secrets-store-csi-driver-provider-aws のインストール

Secrets Store CSI Driver と secrets-store-csi-driver-provider-aws をインストールします。
今回はterraformのhelmプロバイダを利用してインストールしました。
※ バージョンが古いとPod Identityで利用できなかったので注意

最新バージョンの確認

helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm search repo secrets-store-csi-driver
# NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
# secrets-store-csi-driver/secrets-store-csi-driver       1.4.8           1.4.8           A Helm chart to install the SecretsStore CSI Dr...

helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
helm search repo secrets-store-csi-driver-provider-aws
# NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
# aws-secrets-manager/secrets-store-csi-driver-pr...      0.3.11                          A Helm chart for the AWS Secrets Manager and Co...

terraformの定義

/**
 * Secrets Store CSI Driver チャートのインストール
 * 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
 */
resource "helm_release" "csi_secrets_store" {
  //helm_release - helm - terraform: https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release
  name       = "csi-secrets-store"
  repository = "https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts"
  chart      = "secrets-store-csi-driver"
  version    = "1.4.8"  # helm search repo secrets-store-csi-driver
  namespace  = "kube-system"
  create_namespace = true

  // Option Values - Secrets Store CSI Driver: https://secrets-store-csi-driver.sigs.k8s.io/getting-started/installation.html#optional-values
  set {
    // KubernetesのSecretオブジェクトへの同期を有効化
    name = "syncSecret.enabled"
    value = true
  }

  set {
    // シークレット情報変更時のローテーションを有効化
    name = "enableSecretRotation"
    value = true
  }
}

/**
 * ASCP (aws secrets store csi provider) チャートのインストール
 * helmコマンドでのインストール
 * $ helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
 * $ helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
 */
resource "helm_release" "secrets_provider_aws" {
  //helm_release - helm - terraform: https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release
  name       = "secrets-provider-aws"
  repository = "https://aws.github.io/secrets-store-csi-driver-provider-aws"
  chart      = "secrets-store-csi-driver-provider-aws"
  version    = "0.3.11"  # helm search repo secrets-store-csi-driver-provider-aws
  namespace  = "kube-system"
  create_namespace = true

  depends_on = [
    helm_release.csi_secrets_store
  ]
}

SecretsManagerでシークレットの作成

リソース名

/baseport/prd/ascp-test

シークレット文字列

{"username":"hogehoge", "password":"piyopiyo"}

サービスアカウントに紐づけるIAMロール

Pod Identityでサービスアカウントに紐づけるIAM ロールを作成します。

※ 参考: IAM ロールを Kubernetes サービスアカウントに割り当てる | AWS

ロール名

baseport-prd-PodIdentityTest

信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ]
        }
    ]
}

ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:ap-northeast-1:111122223333:secret:/baseport/prd/*"
        }
    ]
}

Pod Identity Assosiation

Pod Identityの関連付けを作成します。

aws eks create-pod-identity-association \
  --cluster-name クラスタ名 \
  --role-arn arn:aws:iam::111122223333:role/baseport-prd-PodIdentityTest \
  --namespace pod-identity-test \
  --service-account test

マニフェスト

ネームスペース pod-identity-test を作成

ns.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: pod-identity-test

サービスアカウント test を作成

sa.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: test
  namespace: pod-identity-test

SecretProviderClassのマニフェスト。
先ほど作成したSecretsManager /baseport/prd/ascp-test を参照します。

spec.parameters.usePodIdentity"true" を設定するのを忘れずに

spc.yaml
---
# https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_csi_driver_SecretProviderClass.html
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  namespace: pod-identity-test
  name: ascp-test-secrets
spec:
  provider: aws
  secretObjects:
    - secretName: db-secret
      type: Opaque
      data:
        - key: username
          objectName: alias_username
        - key: password
          objectName: alias_password
  parameters:
    usePodIdentity: "true"  # ★重要
    objects: |
        - objectName: "/baseport/prd/ascp-test"
          objectType: "secretsmanager"
          jmesPath:
            - path: "username"
              objectAlias: "alias_username"  # ポッドにマウントするファイル名
            - path: "password"
              objectAlias: "alias_password"  # ポッドにマウントするファイル名

アプリのマニフェスト。
SecretProviderClassをvolumeとしてマウントし、環境変数から参照します。

app.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: pod-identity-test
  name: ascp-test
spec:
  selector:
    matchLabels:
      app: ascp-test
  replicas: 2
  template:
    metadata:
      labels:
        app: ascp-test
    spec:
      serviceAccountName: test
      containers:
        - name: ascp-test
          image: ubuntu
          command: ["sleep", "infinity"]
          env:
          - name: DB_USER
            valueFrom:
              secretKeyRef:
                name: db-secret # SecretObjectsのsecretName
                key: username
          - name: DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: db-secret # SecretObjectsのsecretName
                key: password
          volumeMounts:
            - name: csi-secret-volume
              mountPath: /mnt/secrets-store
              readOnly: true
      volumes:
        # CSIストレージ指定
        - name: csi-secret-volume
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: ascp-test-secrets

アプライ

kubectl apply -f ns.yaml
kubectl apply -f sa.yaml
kubectl apply -f spc.yaml
kubectl apply -f app.yaml

動作確認

# ポッドを確認
kubectl get po -n pod-identity-test 
# NAME                         READY   STATUS    RESTARTS   AGE
# ascp-test-5759cdfc5b-cvr2l   1/1     Running   0          46m
# ascp-test-5759cdfc5b-qq82d   1/1     Running   0          46m

# podにログイン
kubectl -n pod-identity-test exec -ti ascp-test-5759cdfc5b-cvr2l /bin/bash

以下Pod内での操作

# 環境変数に設定されていることを確認
printenv | grep "^DB_"
# DB_PASSWORD=piyopiyo
# DB_USER=hogehoge

# シークレットファイルがマウントされていることを確認
ls /mnt/secrets-store/
# _baseport_prd_ascp-test  alias_password  alias_username


# 中身を確認
echo $(cat /mnt/secrets-store/_baseport_prd_ascp-test )
# {"username":"hogehoge", "password":"piyopiyo"}
echo $(cat /mnt/secrets-store/alias_username )
# hogehoge
echo $(cat /mnt/secrets-store/alias_password )
# piyopiyo
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?