Troubleshooting IAM Simulation 오진 - 100-hours-a-week/KTB4-2nd-Cloud GitHub Wiki

IAM Policy Simulation 오진

2026-09-22

🐞 에러 내용

사진 업로드 마지막 Batch에서 500이 났고, Backend 로그에는 Worker 상태를 조회하는 단계에서 권한 오류가 남아 있었습니다.

Ec2Exception: You are not authorized to perform this operation.
User: arn:aws:sts::<account>:assumed-role/yeodam-v1-app-ec2-role/i-051aaa0e3462d2da7
is not authorized to perform: ec2:DescribeInstances
  at ...AiEc2Starter.ensureRunning(AiEc2Starter.java:34)

Backend가 AI를 부르기 전에 Worker를 켜는 기능이 들어갔는데, App Role에는 그 권한이 없었습니다. App Role에 권한을 추가하는 PR을 만들어 apply했습니다.

그런데 적용 후 확인차 돌린 Simulation이 여전히 거부로 나왔습니다.

$ aws iam simulate-principal-policy \
    --policy-source-arn arn:aws:iam::<account>:role/yeodam-v1-app-ec2-role \
    --action-names ec2:DescribeInstances ec2:StartInstances \
    --resource-arns "*"

|  ec2:DescribeInstances |  implicitDeny  |
|  ec2:StartInstances    |  implicitDeny  |

🔍 원인 분석

Simulation 결과만 보고 권한이 실제로 붙지 않았다고 판단했습니다. apply가 다른 계정에 됐거나 다른 Role에 붙었을 가능성을 의심하고 차례로 확인했습니다.

  • aws sts get-caller-identity: 운영 계정과 같음
  • terraform plan: No changes
  • aws iam list-role-policies: yeodam-v1-app-worker-ec2-control 정책이 붙어 있음

마지막으로 정책 내용을 직접 열어봤습니다.

{
  "Action": "ec2:DescribeInstances",
  "Condition": {
    "StringEquals": { "aws:RequestedRegion": "ap-northeast-2" }
  },
  "Effect": "Allow",
  "Resource": "*"
}

DescribeInstances에는 서울 리전 조건이 걸려 있었는데, Simulation 명령에는 리전 정보를 넣지 않았습니다. 조건을 판단할 값이 없으니 거부로 나온 것이었고, 권한은 처음부터 정상으로 붙어 있었습니다.

✅ 해결 방법

조건에 쓰는 값을 넣어 Simulation을 다시 확인했습니다.

aws iam simulate-principal-policy \
  --policy-source-arn arn:aws:iam::<account>:role/yeodam-v1-app-ec2-role \
  --action-names ec2:DescribeInstances \
  --resource-arns "*" \
  --context-entries ContextKeyName=aws:RequestedRegion,ContextKeyValues=ap-northeast-2,ContextKeyType=string

그 뒤 Backend 컨테이너를 다시 만들었고, 업로드 요청이 Worker 상태 조회를 지나 다음 단계로 넘어가는 것을 확인했습니다.

회고

Simulation 결과 하나를 실제 정책보다 먼저 믿고, 원인을 엉뚱한 쪽으로 좁혔습니다. terraform plan이 계속 No changes였던 것도 권한이 이미 붙어 있다는 신호였습니다.

조건이 걸린 정책을 Simulation으로 확인할 때는 조건 값도 같이 넣고, 결과가 이상하면 붙어 있는 정책 내용부터 직접 확인합니다.

⚠️ **GitHub.com Fallback** ⚠️