본문 바로가기

AWS

[AWS] Amazon EKS에서 AWS Secrets Store CSI Driver Provider Add-on 구성 가이드

반응형

Amazon EKS가 AWS Secrets Store CSI Driver Provider Add-on을 공식 지원하게 되어, Kubernetes Pod에서 AWS Secrets ManagerAWS Systems Manager Parameter Store의 비밀을 쉽게 마운트할 수 있게 되었습니다.

1. 개요

AWS Secrets Store CSI Driver Provider Add-on은 Kubernetes에서 CSI 드라이버를 통해 외부 시크릿 스토어에 저장된 값을 Pod 내부 파일로 마운트하도록 하는 기능입니다. 이를 통해 시크릿을 코드에 하드코딩하지 않고 안전하게 마운트할 수 있습니다.

2. 사전 준비

EKS 클러스터

  • EKS 클러스터가 생성되어 있어야 합니다.
  • IAM OIDC Provider가 클러스터에 연결되어 있어야 합니다.
    (IAM Roles for Service Accounts를 활용하기 위함)

CLI 도구

  • AWS CLI, eksctl, kubectl이 설치 및 구성되어 있어야 합니다.
  • kubectl은 클러스터에 접근 가능해야 합니다.

3. Add-on 설치

EKS Add-on을 사용하는 것이 가장 간단한 설치 방법입니다. Add-on을 설치하면 AWS에서 관리하는 CSI 드라이버 Provider가 설치 및 업그레이드됩니다.

3.1. eksctl로 설치

eksctl create addon \
  --cluster <cluster-name> \
  --name aws-secrets-store-csi-driver-provider \
  --region <region>

EKS Add-on 설치는 AWS 관리 콘솔, AWS CLI, eksctl 등에서 가능하며 설치 뒤 자동으로 구성됩니다.

4. IAM 서비스 계정 및 정책 구성

Pod가 AWS Secrets Manager 또는 Parameter Store에 접근하려면 적절한 IAM 권한이 필요합니다.

4.1 IAM 정책 생성

예시: Secrets Manager에서 특정 Secret을 읽는 정책

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "ssm:GetParameters"
      ],
      "Resource": [
        "arn:aws:secretsmanager:<region>:<account-id>:secret:<secret-name>*",
        "arn:aws:ssm:<region>:<account-id>:parameter/<parameter-name>"
      ]
    }
  ]
}

4.2 IAM 서비스 계정 생성

eksctl create iamserviceaccount \
  --cluster <cluster-name> \
  --namespace <namespace> \
  --name csi-secrets-sa \
  --attach-policy-arn arn:aws:iam::<account-id>:policy/<policy-name> \
  --approve

이 서비스 계정은 이후 SecretProviderClass에서 참조됩니다.


5. SecretProviderClass 리소스 작성

SecretProviderClass는 CSI 드라이버가 어떤 시크릿을 어떻게 가져올지를 정의하는 Kubernetes 커스텀 리소스입니다.

5.1 예시 YAML

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
  namespace: default
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "my-db-secret"
        objectType: "secretsmanager"
        jmesPath:
          - path: "password"
            objectAlias: "db-password"
  • provider: aws: AWS Provider 사용
  • objectName: AWS Secrets Manager에 저장된 시크릿 이름
  • objectType: secretsmanager 또는 ssmparameter
  • jmesPath: 시크릿 JSON에서 추출할 필드 정의

6. Deployment에 CSI Driver 마운트 설정

SecretProviderClass를 정의했으면, Deployment에 이를 마운트하도록 설정합니다.

6.1 예시 Deployment YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-with-secret
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      serviceAccountName: csi-secrets-sa
      containers:
      - name: app
        image: my-app-image
        volumeMounts:
        - name: secrets-volume
          mountPath: /mnt/secrets
          readOnly: true
      volumes:
      - name: secrets-volume
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "aws-secrets"

이 설정에서 Pod는 /mnt/secrets/db-password 위치에 시크릿 값을 파일로 마운트합니다.


7. 환경 확인

Pod가 실행된 후 다음 명령으로 시크릿이 정상적으로 마운트되었는지 확인합니다.

kubectl exec -it <pod-name> -- cat /mnt/secrets/db-password

정상적으로 값이 노출되면 구성 성공입니다.

8. 참고 / 정리

핵심 요약

  • EKS Add-on으로 AWS Provider 설치 시 자동화되어 설치 및 업그레이드가 간단합니다.
  • SecretProviderClass를 통해 시크릿 소스 및 매핑을 정의합니다.
  • IAM 서비스 계정 기반으로 least privilege 접근 권한을 설정해야 합니다.

제한 / 주의

  • Fargate 노드 그룹에서는 일부 제한이 있을 수 있습니다.
  • Parameter Store와 Secrets Manager 둘 다 지원하지만 Kubernetes Secrets가 아닌 파일 마운트로 동작합니다.
반응형