MinIO Enterprise / AIStor 환경에서 LDAP / Keycloak 연동 시 Service Account(Access Key)를 대량 생성·삭제하는 모의 테스트(Benchmark)용 Bash 스크립트와 처리 소요 시간 가이드를 안내해 드립니다.
mc CLI를 활용해 10개의 Access Key를 임의 생성하고, 이후 일괄 삭제하며 소요 시간을 측정(time)하는 스크립트입니다.
#!/bin/bash
# ==============================================================================
# MinIO LDAP Access Key Batch Benchmark Script
# ==============================================================================
ALIAS="myminio"
KEY_PREFIX="bench-ldap-key"
SECRET_KEY="TestSecretKey12345!"
COUNT=10
echo "=== [1/2] Generating $COUNT LDAP Access Keys ==="
start_gen=$(date +%s%N)
for i in $(seq -w 01 $COUNT); do
ACCESS_KEY="${KEY_PREFIX}-${i}"
# LDAP IDP 기반 Access Key 생성 (정책 할당 필요 시 --policy 추가)
mc idp ldap accesskey add $ALIAS \
--access-key "$ACCESS_KEY" \
--secret-key "$SECRET_KEY" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "[CREATED] $ACCESS_KEY"
else
echo "[FAILED] $ACCESS_KEY"
fi
done
end_gen=$(date +%s%N)
gen_duration=$(( (end_gen - start_gen) / 1000000 ))
echo ">> Total Creation Time: ${gen_duration} ms ($(( gen_duration / COUNT )) ms/key)"
echo ""
echo "=== Waiting 3 seconds before removal ==="
sleep 3
echo ""
echo "=== [2/2] Deleting $COUNT LDAP Access Keys ==="
start_del=$(date +%s%N)
for i in $(seq -w 01 $COUNT); do
ACCESS_KEY="${KEY_PREFIX}-${i}"
# mc idp ldap accesskey rm ALIAS KEY
mc idp ldap accesskey rm $ALIAS "$ACCESS_KEY" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "[REMOVED] $ACCESS_KEY"
else
echo "[DELETE FAILED] $ACCESS_KEY"
fi
done
end_del=$(date +%s%N)
del_duration=$(( (end_del - start_del) / 1000000 ))
echo ">> Total Deletion Time: ${del_duration} ms ($(( del_duration / COUNT )) ms/key)"
MinIO AIStor에서 mc idp ldap accesskey rm 명령어로 10개를 삭제하는 데 걸리는 시간은 약 0.5초 ~ 2초 (키당 50ms ~ 200ms) 내외입니다.
mc 명령어가 1회 실행될 때마다 HTTP REST API Call + 인증 + IAM 메타데이터 동기화 overhead가 발생하므로 건당 약 50~150ms가 소요됩니다.for 문처럼 단일 세션(Sequential)으로 돌리면 10개 기준 약 1~2초입니다.& (Background job)를 활용해 병렬 삭제(Parallel)를 수행하면 10개 전체 삭제에 200~500ms 이내로 끝납니다.Keycloak에서 특정 User/Client에 발급된 JWT(Active User Sessions / Refresh Token / Offline Sessions) 10개를 무효화/삭제하는 경우, 어떤 방식으로 처리하느냐에 따라 소요 시간이 달라집니다.
Keycloak Admin API (DELETE /admin/realms/{realm}/users/{id}/sessions 또는 Revocation Endpoint)를 호출할 경우:
POST /admin/realms/{realm}/users/{id}/logout 또는 User Session 전체 삭제 호출 시 단 1회의 API Call(약 50ms~100ms)로 10개 이상의 세션이 즉시 모두 무효화됩니다.💡 Keycloak Stateless JWT 참고사항:
Keycloak에서 발급한 Access Token(JWT)이 Stateless(자체 검증형)라면, Keycloak DB에서 세션을 삭제하더라도 토큰 자체의 Expiration Time()이 만료될 때까지는 Client 단에서 유효한 것으로 처리될 수 있습니다.
따라서 즉각적인 무효화가 목적이라면 1) Keycloak Admin API로 Logout/Session Kill을 수행하고, 2) MinIO 단에서 Access Key 삭제/IAM Sync를 맞춰주시는 방식이 가장 확실합니다.
==
7,000개 수준의 대규모 삭제 작업으로 넘어가면, 단순히 '10개 소요 시간 7000' 형태의 선형 계산이 적용되지 않습니다. 네트워크 RTT(Round Trip Time), CLI 프로세스 생성 비용, DB/캐시 Lock 병목 등이 복합적으로 작용하기 때문입니다.
순차 처리(Sequential)와 병렬 처리(Parallel / Bulk API) 방식에 따라 소요 시간이 극명하게 차이 납니다.
mc 명령어)for 문으로 mc idp ldap accesskey rm을 7,000번 반복 호출mc binary execution + TLS Handshake + MinIO IAM Rest API + Cluster Sync)
⚠️ 주의:
mcCLI를 매번 새로 띄우는 프로세스 Fork 비용이 상당하므로, 7,000건을 단일 스레드mc구문으로 돌리는 것은 권장하지 않습니다.
xargs -P 활용)Keycloak에서 7,000개의 세션/토큰을 삭제(Revoke)할 때는 'API 호출 방식'에 따라 수십 분이 걸릴 수도, 단 수 초 만에 끝날 수도 있습니다.
DELETE /sessions/{id})POST /admin/realms/{realm}/logout-all (Realm 전체 세션 무효화)POST /admin/realms/{realm}/users/{user-id}/logout (특정 사용자의 전체 세션/JWT 무효화)POST /admin/realms/{realm}/components/{id}/... (LDAP Provider 무효화)notBefore 타임스탬프만 업데이트하므로 7,000개가 단 몇 초 만에 일괄 무효화됩니다.)| 대상 | 처리 방식 | 예상 소요 시간 | 비고 / 추천 가이드 |
|---|---|---|---|
| MinIO AccessKey | 순차 처리 (단일 for 루프) | 10분 ~ 18분 | 권장하지 않음 |
| MinIO AccessKey | 병렬 처리 (xargs -P 20) | 약 40초 ~ 1.5분 | 강력 추천 (MinIO IAM 병목 고려 적정 Concurrency 유지) |
| Keycloak Session | 개별 API 7,000회 호출 | 3.5분 ~ 8분 | DB I/O 부담 유발 |
| Keycloak Session | Bulk Revoke / Logout API | 1초 ~ 5초 | 강력 추천 (notBefore timestamp 업데이트 방식) |
xargs 활용)MinIO AccessKey 7,000개를 고속으로 삭제해야 할 경우 아래와 같이 xargs의 병렬 옵션(-P)을 사용하는 것이 가장 효율적입니다.
# 7,000개의 키 목록 파일(keys.txt)을 작성 후 20개 동시 스레드로 삭제
cat keys.txt | xargs -P 20 -I {} mc idp ldap accesskey rm myminio "{}"