마지막 업데이트 2026-09-23
PpiDeveloper가 아니라 PpiDiagnostics 역할에 있다. 역할을 별도 CLI 프로필로 분리해 쓰는 방법과 실제로 확인한 명령 (2026-09-23, 계정 865620779876 · ap-northeast-2 기준)AccessDenied가 난다.ppi-dev 프로필이 PpiDeveloper 역할로 고정돼 있어서, 새 권한이 붙은 PpiDiagnostics 역할로는 한 번도 호출하지 않은 것이다.ppi-diagnostics 프로필을 따로 만들고 SSO 세션은 기존 ppi-dev와 같이 쓴다. 로그인 한 번으로 두 프로필이 모두 동작한다.| 확인 항목 | ppi-dev (PpiDeveloper) | ppi-diagnostics (PpiDiagnostics) |
|---|---|---|
CloudWatch 로그 그룹 목록 조회 (logs:DescribeLogGroups) | AccessDeniedException | 가능 |
로그 조회 (aws logs tail) | — | 가능 (/ppi/livekit/prod/agent로 확인) |
PPI 태그 EC2 목록 조회 (ec2:DescribeInstances) | — | 가능 |
SSM 접속 (ssm:StartSession, PPI 태그 인스턴스) | — | 가능 (ppi-api-dev-2c로 셸 열림 확인) |
파라미터 목록 조회 (ssm:DescribeParameters) | — | 의도적으로 거부 (요청 범위 밖) |
"—"는 이번에 확인하지 않은 항목이다. 평소 개발 작업은 계속 ppi-dev로 하고, 로그를 보거나 서버에 접속할 때만 ppi-diagnostics를 쓴다.
~/.aws/config에 추가기존 [sso-session ppi-dev] 블록이 이미 있다는 전제다. 아래 블록만 파일 끝에 붙인다. 수정 전에 cp ~/.aws/config ~/.aws/config.bak로 백업해 두면 되돌리기 쉽다.
[profile ppi-diagnostics]
sso_session = ppi-dev
sso_account_id = 865620779876
sso_role_name = PpiDiagnostics
region = ap-northeast-2
output = json
aws configure sso --profile ppi-diagnostics를 대화형으로 실행해도 결과는 같다. SSO 세션 이름을 물을 때 새 이름 대신 기존 ppi-dev를 입력해야 세션을 같이 쓴다. 새 이름을 넣으면 로그인을 따로 해야 하는 세션이 하나 더 생긴다.
aws sso login --profile ppi-diagnostics # 브라우저 인증 (ppi-dev 세션 토큰도 함께 갱신)
aws sts get-caller-identity --profile ppi-diagnostics
출력된 Arn에 assumed-role/AWSReservedSSO_PpiDiagnostics_…가 보이면 정상이다. PpiDeveloper가 보이면 프로필을 잘못 지정한 것이다.
Error when retrieving token from sso: Token has expired and refresh failed가 나오면 권한 문제가 아니다. SSO 토큰이 만료된 것이니 aws sso login을 다시 실행한다.
# 최근 30분
aws logs tail /ppi/livekit/prod/agent --since 30m --profile ppi-diagnostics
# 실시간으로 계속 보기
aws logs tail /ppi/livekit/prod/agent --follow --profile ppi-diagnostics
# 키워드 필터 (ERROR, roomId 등)
aws logs tail /ppi/livekit/prod/agent --since 2h --filter-pattern '"ERROR"' --profile ppi-diagnostics
# 시각 지정 — UTC 기준 (KST 18:00 = UTC 09:00)
aws logs tail /ppi/voice-pipeline/prod/shared/controller \
--since 2026-09-23T09:00:00 --format short --profile ppi-diagnostics
# 로그 그룹 이름 찾기
aws logs describe-log-groups --log-group-name-prefix /ppi/ \
--query 'logGroups[].logGroupName' --output text --profile ppi-diagnostics
# 매번 --profile 붙이기 싫으면 셸 세션 단위로 지정
export AWS_PROFILE=ppi-diagnostics
aws logs tail이 찍는 시각은 UTC다. KST로 보려면 9시간을 더하고, KST 시각으로 조회하려면 9시간을 빼서 넣는다.
| 로그 그룹 | 내용 |
|---|---|
/ppi/livekit/{dev,staging,prod}/agent | LiveKit 에이전트 (job 수명, 발화 파이프라인 등 JSON 로그) |
/ppi/voice-pipeline/{dev,prod}/… | 음성 파이프라인 — controller · selector · model-node · composite · compatibility · capacity-planner |
/aws/lambda/ppi-* | ppi-video-encoder · ppi-resource-processor · ppi-avatar-resource-processor · ppi-datamart-cdc-prod 등 |
/aws/ecs/containerinsights/…/performance | ECS 컨테이너 성능 지표 (CPU·메모리) |
Grafana에서 보는 서버 로그(ppi-socket 등)는 AWS 프로필과 관계없다. 기존대로 Grafana에서 조회한다.
접속할 수 있는 인스턴스는 태그가 Project=ppi이거나 Service=ppi-livekit인 것뿐이다.
# 대상 인스턴스 찾기
aws ec2 describe-instances --profile ppi-diagnostics \
--filters "Name=tag:Project,Values=ppi" "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].[InstanceId,Tags[?Key==`Name`]|[0].Value]' --output text
# 접속 (Session Manager 플러그인 필요)
aws ssm start-session --target <인스턴스 ID> --profile ppi-diagnostics
Starting session with SessionId: …가 출력되고 $ 프롬프트가 뜨면 접속된 것이다. 셸에서 whoami를 실행하면 보통 ssm-user가 나온다. 나올 때는 exit를 입력한다.
권한을 시험할 때는 dev 인스턴스(예: ppi-api-dev-2c)부터 쓴다. prod 인스턴스 셸에서는 파일을 읽기만 하고, 서비스를 재시작하거나 파일을 수정하지 않는다.
| 착각 | 실제 |
|---|---|
| 권한 요청이 반영되지 않았다 | ppi-dev(PpiDeveloper)로 확인했기 때문이다. get-caller-identity의 Arn으로 어떤 역할인지 먼저 본다. |
ssm:DescribeParameters가 거부되니 SSM 권한이 없다 | 요청 범위 밖이라 의도적으로 막아 둔 것이다. StartSession과는 별개다. |
가짜 인스턴스 ID(i-0000000000000dead)로 StartSession 권한을 시험할 수 있다 | 권한이 PPI 태그 기준으로 걸려 있어서 태그가 없는 가짜 ID로는 권한이 있는지 판단할 수 없다. 실제 PPI 태그가 붙은 EC2로 시험해야 한다. |
/ppi/livekit/prod/agent CloudWatch 로그로 원인을 추적한 사례