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.  IRSA (IAM Role Service Account) 생성

eksctl create iamserviceaccount \
  --name secrets-reader \
  --namespace <Secret 리소스를 사용할 네임스페이스 지정> \ 
  --cluster <EKS 클러스터 명 지정> \
  --attach-policy-arn arn:aws:iam::<앞서 생성한 IAM 역할의 ARN 번호 입력>:policy/SecretsReader \ 
  --approve

 

5.  ESO (External Secrets Operator) 설치

 

📌 ESO (External Secrets Operator)란?

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

 

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.  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:
        jwt:
          serviceAccountRef:
            name: secrets-reader # IRSA로 연결된 서비스 계정의 이름
---
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)
  data:
  - secretKey: test-secret # Kubernetes의 Secret 리소스의 key 이름
    remoteRef:
      key: secret-test   # AWS Secrets Manager에서 가져올 시크릿 이름
      property: test     # 해당 시크릿의 속성(property) 이름 (예: {"test":"1234","password":"bar"} 구조에서 test)

 

7.  Secret 생성 결과 확인

 

kubectl get secert

 

 


 

감사합니다.

반응형