AWS

AWS Secret Manager 에서 생성한 Secret을 EKS 에서 사용하기

황동리 2025. 6. 4. 16:19
반응형
✅  AWS Secrets Manager 란?

AWS Secrets Manager는 애플리케이션, 서비스, 사용자 계정이 사용하는 민감한 정보를 안전하게 저장, 관리, 검색할 수 있도록 해주는 서비스입니다.

 

Secret Manager를 사용해, EKS 클러스터에서 Secret 리소스로 사용하면 아래와 같은 장점이 있습니다.

 

 

  • 🔐 강력한 보안 – KMS 기반 암호화 + IAM 권한 제어
  • 🔁 자동 시크릿 로테이션 – DB 자격증명 등 자동 갱신
  • 📦 중앙 집중형 관리 – 여러 클러스터 간 시크릿 공유 및 일원화
  • 📜 감사 로깅 지원 – CloudTrail로 접근 이력 추적 가능
  • 🚫 애플리케이션 재배포 없이 시크릿 갱신 가능
  • ⚙️ 기존 AWS 리소스와의 통합 용이 – RDS, Lambda 등과 연동 최적화

 

 

이제 Secret Manager를 사용해 EKS 클러스터에서 Secret 리소스로 사용을 해보도록 하겠습니다.


1.  AWS Console에 접속해서 Secret Manager 리소스에서 Secret 생성

 

 

 

2.  생성한 Secret Manager를 사용할 수 있는 정책 파일 생성

vi secrets-policy.json
---
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:ListSecrets",
                "secretsmanager:BatchGetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "<앞서 생성한 AWS Secret Manager의 ARN>"
        }
    ]
}

 

Resource에 들어갈 내용은 아래와 같이 보안 암호 ARN 을 복사해서 붙여넣으면 됩니다.

 

3.  앞선 과정에서 생성한 정책 파일로 IAM  정책 생성

aws iam create-policy \
  --policy-name SecretsReader \
  --policy-document file://secrets-policy.json # 파일 위치 잘 지정해줘야함

 

4.  IAM 사용자에게 정책 attach

aws iam attach-user-policy \
  --user-name <IAM_사용자_이름> \
  --policy-arn arn:aws:iam::<계정ID>:policy/SecretsReader

 

5.  ESO (External Secrets Operator) 설치

 

📌 ESO (External Secrets Operator)란?

외부 시크릿 저장소에 저장된 민감 정보를 Kubernetes 내부의 Secret 오브젝트로 자동으로 가져와 생성/동기화하는 오픈소스 Kubernetes Operator 입니다.

 

ESO를 사용하여 AWS의 Secret Manager에 있는 키/값이 변경 되면 자동으로 동기화 시켜보도록 하겠습니다.

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

 

 

6.  AWS Access Key를 Secret으로 생성

echo -n 'AWS 계정의 엑세스 키' > ./access-key
echo -n 'AWS 계정의 비밀 엑세스 키' > ./secret-access-key
kubectl create secret generic awssm-secret --from-file=./access-key --from-file=./secret-access-key

 

7.  SecretStore와 ExternalSecret 리소스 생성

예시)
apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: aws-secrets
  namespace: default
spec:
  provider:
    aws:
      service: SecretsManager # 사용할 AWS 서비스
      region: ap-northeast-1 # 사용할 SM의 리전
      auth:
        secretRef: # 앞서 생성한 엑세스 키를 등록한 Secret 사용
          accessKeyIDSecretRef:
            name: awssm-secret
            key: access-key
          secretAccessKeySecretRef:
            name: awssm-secret
            key: secret-access-key
---
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: my-database-secret
  namespace: default
spec:
  refreshInterval: 1h   # 1시간 마다 시크릿 값을 동기화
  secretStoreRef:
    name: aws-secrets   # 참조할 SecretStore의 이름
    kind: SecretStore   # SecretStore의 종류( 일반적으로 SecretStore)
  target:
    name: test-secret   # 실제로 생성될 Kubernetes Secret의 이름
    creationPolicy: Orphan # 이 리소스가 삭제되어도 Secret은 삭제되지 않도록 설정(Orphan)
  dataFrom:
    - extract:
        key: test-SecretManager # 실제 AWS에서 생성한 Secret Manager의 이름

 

7.  Secret 생성 결과 확인

 

kubectl get secret

 

 


 

감사합니다.

반응형