External Secrets를 이용한 Amazon EKS(Fargate) 클러스터 Pod내 SSM Parameter Store 데이터 환경변수 주입 방법

Devvoo·2024년 5월 28일
0

AWS

목록 보기
3/4
post-thumbnail

AWS SSM Parameter Store 값 환경변수 주입방법

Helm으로 External Secrets Install

$ helm repo add external-secrets https://charts.external-secrets.io

$ helm install external-secrets \
	   external-secrets/external-secrets \
	   -n external-secrets \
	   --create-namespace \
	   --set installCRDs=true \
	   --set webhook.port=9443

위 명령어 실행 후 확인

external-secrets, external-secrets-cert-controller, external-secrets-webhook 총 세 종류의 파드가 정상적으로 확인되어야한다.

EKS Service Account에 IAM Policy 설정

미리 생성해놓은 victor-eks-fargate-svc-role에 아래와 같이 설정해주었다.

Parameter Store 연동

Secret Store 생성

victor-secretstore.yaml내용

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: victor-parameterstore
  namespace: kube-system # namespace는 당연히 모두 같아야 함.
spec:
  provider:
    aws:
      service: ParameterStore
      region: ap-northeast-2
      auth:
        jwt:
          serviceAccountRef: # 인증에 사용할 IAM Service Account 정보 정의
            name: victor-eks-fargate-svc-role-sa 

apply 해준다.

$ kubectl apply -f victor-secretstore.yaml

Valid 상태가 되면 잘 된것이다.

External Secret 생성

현재 AWS SSM 파라미터 스토어에 저장되어있는 test-key 파라미터의 값을 사용할 것이다.

victor-externalsecret.yaml 내용

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: victor-externalsecret
  namespace: kube-system
spec:
  secretStoreRef: # 위에서 생성한 SecretStore 정보 정의
    name: victor-parameterstore
    kind: SecretStore
  target:
    name: victor-k8s-secret # EKS 클러스터 내에 만들어질 secret name 정의
  data:
  - secretKey: test-key # secret 내 key name 정의
    remoteRef:
      key: test-key # 클러스터 내에서 쓸 AWS SSM Parameter store데이터의 key name 명시

apply 해준다.

$ kubectl apply -f victor-externalsecret.yaml

apply 후 확인해보니 SecretSynced 상태이고

EKS 클러스터 내 secret에 방금 yaml파일 target 내 지정한 이름으로 잘 생성이 되어있다.

해당 값을 deployment에 환경변수 주입

deployment 파일 수정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-deployment
  template:
    metadata:
      labels:
        app: app-deployment
    spec:
      containers:
      - name: app-deployment
        image: # 비공개
        envFrom:
          - configMapRef:
              name: env-configmap
        # 이 아래부분 부터
        env:
          - name: TEST_KEY # 컨테이너 내에서 등록될 환경변수의 이름
            valueFrom:
              secretKeyRef:
                name: victor-k8s-secret # secret의 이름
                key: test-key # secret data에 명시된 키
                optional: false # 환경변수가 제대로 주입이 안될 경우 컨테이너 생성이 안되게 함
        ########################################################################
        ports:
        - containerPort: 3000

그리고, apply 해준다.

$ kubectl apply -f app-deployment.yaml

배포된 deployment(pod)에 Shell로 접속해서 환경변수로 주입이 잘 되어있는지 확인해보자.

잘 확인된다.

[부록] AWS SSM Parameter Store 값 환경변수 주입방법 (JSON 형식)

참고: Parameter Store에 저장되어있는 중첩되있는 값들이나 array들도 gjson 문법으로 액세스가 가능하다. (https://github.com/tidwall/gjson/blob/master/SYNTAX.md)

AWS SSM Parameter Store에 위와 같은 JSON 및 array 형태의 키와 값을 저장해줬다.

Secret Store 생성

victor-secretstore.yaml내용

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: victor-parameterstore
  namespace: kube-system
spec:
  provider:
    aws:
      service: ParameterStore
      region: ap-northeast-2
      auth:
        jwt:
          serviceAccountRef:
            name: victor-eks-fargate-svc-role-sa # 인증에 사용할 IAM Service Account 정보 정의

apply 해준다.

$ kubectl apply -f victor-secretstore.yaml

Valid 상태 확인

External Secret 생성

victor-externalsecret.yaml 내용

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: victor-externalsecret
  namespace: kube-system
spec:
  refreshInterval: 1m # 1분마다 refresh해서 Parameter store 값 업데이트해서 가져옴
  secretStoreRef: # 위에서 생성한 SecretStore 정보 정의
    name: victor-parameterstore
    kind: SecretStore
  target:
    name: victor-k8s-secret-db # EKS 클러스터 내에 만들어질 secret name 정의
  data:
  - secretKey: account-id # secret 내 key name 정의
    remoteRef:
      key: victor-secret-db # EKS 클러스터로 가져올 AWS SSM Parameter store 데이터의 key name 명시
      property: account.id # root

  - secretKey: account-password
    remoteRef:
      key: victor-secret-db
      property: account.password # root1234

  - secretKey: endpoint-url-0
    remoteRef:
      key: victor-secret-db
      property: endpoints.0.url # test01.com

  - secretKey: endpoint-tag-0
    remoteRef:
      key: victor-secret-db
      property: endpoints.0.tag # test01

apply 해준다.

$ kubectl apply -f victor-externalsecret.yaml

apply 후 kubectl get externalsecret -n kube-system 명령어로 확인해보니 SecretSynced 상태이고

EKS 클러스터 내 secret에 방금 yaml파일 target 내 지정한 이름으로 잘 생성이 되어있다.

해당 값을 deployment에 환경변수 주입

deployment 파일 수정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-deployment
  template:
    metadata:
      labels:
        app: app-deployment
    spec:
      containers:
      - name: app-deployment
        image: # 비공개
        envFrom:
          - configMapRef:
              name: env-configmap
        env: # 여기 아래부터
          - name: DB_ID # 컨테이너 내에서 등록될 환경변수의 이름
            valueFrom:
              secretKeyRef:
                name: victor-k8s-secret-db # secret의 이름
                key: account-id # secret data에 명시된 키
                optional: false # 환경변수가 제대로 주입이 안될 경우 컨테이너 생성이 안되게 함
          - name: DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: victor-k8s-secret-db
                key: account-password
                optional: false
          - name: DB_ENDPOINT_URL_0
            valueFrom:
              secretKeyRef:
                name: victor-k8s-secret-db
                key: endpoint-url-0
                optional: false
          - name: DB_ENDPOINT_TAG_0
            valueFrom:
              secretKeyRef:
                name: victor-k8s-secret-db
                key: endpoint-tag-0
                optional: false            
        ###########################################################################
        ports:
        - containerPort: 3000

그리고, apply 해준다.

$ kubectl apply -f app-admin-deployment.yaml

배포된 deployment(pod)에 Shell로 접속해서 환경변수로 주입이 잘 되어있는지 확인해보자.

잘 확인된다.

💡 참고
AWS SSM Parameter Store에서 데이터 값 변경이 일어난 경우, EKS 클러스터 내 secret에서 refresh되어 업데이트가 됐다 하더라도 해당 deployment(pod)가 재기동 되어야지 환경변수도 업데이트 된다.

EKS Secret 값을 AWS SSM Parameter Store에 push하기

다른 이름의 Secret Store 생성

victor-secretstore-aws.yaml

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-parameterstore # name만 다르게 해줌
  namespace: kube-system
spec:
  provider:
    aws:
      service: ParameterStore
      region: ap-northeast-2
      auth:
        jwt:
          serviceAccountRef:
            name: victor-eks-fargate-svc-role-sa

apply

$ kubectl apply -f victor-secretstore-aws.yaml

Secret Store가 잘 생성되었다.

Push Secret 생성

victor-pushsecret.yaml

apiVersion: external-secrets.io/v1alpha1
kind: PushSecret
metadata:
  name: victor-pushsecret # Customisable
  namespace: kube-system # Same of the SecretStores
spec:
  refreshInterval: 10s # Refresh interval for which push secret will reconcile
  secretStoreRefs: # A list of secret stores to push secrets to
    - name: aws-parameterstore
      kind: SecretStore
  selector:
    secret:
      name: victor-k8s-secret # Source Kubernetes secret to be pushed
  data:
    - match:
        secretKey: test-key # Source Kubernetes secret key to be pushed
        remoteRef:
          remoteKey: test-key-2 # Remote reference (where the secret is going to be pushed)

위 내용으로 apply

$ kubectl apply -f victor-pushsecret.yaml

위와 같이 Synced 상태이면 잘 된 것이다.

그리고, AWS SSM Parameter Store에 test-key-2라는 이름으로 EKS 클러스터 시크릿 내 test-key 의 값이 push 된 것을 확인할 수 있다.

참고 링크

Fargate 기반 클러스터에서 AWS SSM Parameter Store 값 사용 관련


https://aws.amazon.com/ko/blogs/containers/leverage-aws-secrets-stores-from-eks-fargate-with-external-secrets-operator/

https://external-secrets.io/latest/

https://external-secrets.io/latest/provider/aws-parameter-store/

https://eminalemdar.medium.com/reversing-the-workflow-with-external-secrets-operators-push-secret-feature-f2a64f3db748

profile
Cloud & DevOps Engineer; 루트 노드를 향하여!

0개의 댓글