Post

EKS에서 AWS Secret Manager Secret 사용하기

Secrets Manager의 시크릿을 Amazon EKS의 Pod에 마운트된 파일로 표시하려면, Kubernetes Secrets Store CSI Driver와 함께 AWS Secrets and Configuration Provider(ASCP)를 사용해야 합니다. 해당 기능은 Parameter Store parameters도 사용할 수 있습니다. Fargate 노드 그룹에는 지원되지 않습니다.

Helm을 사용해 ASCP 설치

1. Helm 레포지토리 업데이트

helm repo update

2. Secrets Store CSI Driver 차트 추가

helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts

3. Secrets Store CSI Driver 설치

helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver

4. ACSP 차트 추가

helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws

5. ACSP 설치

helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws

마운트할 시크릿 식별

  • SecretProviderClass에는 마운트할 비밀과 마운트할 파일 이름이 나열되어있으며, 사용할 EKS Pod와 동일한 네임스페이스에 있어야 합니다

1. SecretProviderClass 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test-secrets
  namespace: weasel
spec:
  provider: aws
  secretObjects:
    - secretName: weasel-pod-secret
      type: Opaque
      data:
        - objectName: HOST  # Kubernetes Secret에서 사용할 키 이름
          key: HOST
        - objectName: PORT
          key: PORT
        - objectName: DATABASE
          key: DATABASE
        - objectName: USERNAME
          key: USERNAME
        - objectName: PASSWORD
          key: PASSWORD
  parameters:
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-1:393035689023:secret:/secret/prod/weasel-I4AhIF"
        jmesPath:
          - path: HOST
            objectAlias: HOST
          - path: PORT
            objectAlias: PORT
          - path: DATABASE
            objectAlias: DATABASE
          - path: USERNAME
            objectAlias: USERNAME
          - path: PASSWORD
            objectAlias: PASSWORD

4. EKS Pod에 Secret을 File로 마운트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test
  name: test
  namespace: weasel
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      serviceAccountName: weasel-eks-pod-sa
      containers:
      - image: amazon/aws-cli:2.0.30
        name: test
        command: ["/bin/bash", "-c", "while true; do sleep infinity; done;"]
        volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
      volumes:
      - name: secrets-store-inline
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "test-secrets"

5. 확인

1
2
3
4
5
6
7
8
❯ k exec -it test-5d6df6c995-6phfj -- /bin/bash
bash-4.2# cd /mnt/secrets-store/
bash-4.2# ls
DATABASE  HOST  PASSWORD  PORT  USERNAME
bash-4.2# cat PORT
53306
bash-4.2# cat DATABASE
weasel

6. Reference

https://secrets-store-csi-driver.sigs.k8s.io - [Introduction - Secrets Store CSI Driver]

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/manage-secrets.html - [Kubernetes가 있는 AWS Secrets Manager 비밀 사용 - Amazon EKS]

https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/integrating_csi_driver.html - [아마존 엘라스틱 쿠버네티스 서비스에서 AWS Secrets Manager 시크릿 사용하기 - AWS Secrets Manager]


궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji

This post is licensed under CC BY 4.0 by the author.