Lambda@Edge IAM — 리전 제약
Lambda@Edge 는 CloudFront(AWS 의 CDN)의 엣지 로케이션에서 실행되는 Lambda 함수로, 반드시 us-east-1 리전에만 배포됩니다.
Lambda@Edge 함수에 IAM 권한을 설정하는데 계속 AccessDenied 가 났습니다. 권한을 맞게 준 것 같은데도 막혔습니다. 세 단계로 풀렸습니다.
함수는 us-east-1, 조회는 서울 리전으로
Action: lambda:GetFunction
On resource(s): arn:aws:lambda:ap-northeast-2:...:function:my-edge-function
Context: no identity-based policy allows the action
Lambda@Edge 함수는 us-east-1 에만 배포됩니다. 정책도 us-east-1 만 허용했습니다.
그런데 에러의 리소스 ARN 은 ap-northeast-2(서울)입니다.
AWS 콘솔이 함수를 열 때 현재 보고 있는 리전으로도 GetFunction 을 던집니다.
서울 리전에서 콘솔을 보고 있으면 서울로도 조회가 가고, 거기에 권한이 없으니
거부됩니다.
서울 리전 ARN 을 Resource 에 넣되, 그 함수 하나로만 좁힙니다.
{
"Sid": "AllowReadOnlyThatOneInSeoul",
"Effect": "Allow",
"Action": [
"lambda:GetFunction",
"lambda:GetFunctionConfiguration",
"lambda:ListVersionsByFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-2:123456789012:function:my-edge-function",
"arn:aws:lambda:ap-northeast-2:123456789012:function:my-edge-function:*"
]
}
ListFunctions — 리소스 단위 제한 불가
목록이 안 보였습니다.
Action: lambda:ListFunctions
Context: no identity-based policy allows the action
ListFunctions 는 리소스 단위 제한이 안 되는 액션입니다. 특정 함수 ARN 을
Resource 에 적을 수 없고 "*" 를 써야 합니다.
"*" 를 그냥 열면 모든 리전의 모든 함수 목록이 열립니다. 리전 조건으로
범위를 좁혔습니다.
{
"Sid": "AllowListInUsEast1",
"Effect": "Allow",
"Action": "lambda:ListFunctions",
"Resource": "*",
"Condition": {
"StringEquals": { "aws:RequestedRegion": "us-east-1" }
}
}
서울 리전 목록은 Explicit Deny 로 막았습니다.
{
"Sid": "DenyListInSeoul",
"Effect": "Deny",
"Action": "lambda:ListFunctions",
"Resource": "*",
"Condition": {
"StringEquals": { "aws:RequestedRegion": "ap-northeast-2" }
}
}
리소스로 못 좁히는 액션은 조건으로 좁힙니다. aws:RequestedRegion 은 그럴 때
쓰는 조건 키입니다.
다 맞는데도 막힘 — 상위 제약(Boundary·세션 정책)
정책이 맞는데도 계속 거부되는 경우가 있습니다. 이때는 정책 위에 있는 제약을 봐야 합니다.
Permissions Boundary — 역할에 경계가 걸려 있으면, 정책에서 허용해도 경계가 그 액션을 안 열어주면 막힙니다. 경계 쪽에도 같은 허용이 있어야 합니다.
세션 정책 — AssumeRole 로 받은 세션에 정책이 씌워져 있으면, 그 세션 정책이 교집합으로 작동합니다. 역할 정책이 아무리 넓어도 세션 정책이 좁으면 좁은 쪽이 이깁니다.
IAM 에서 유효 권한은 이들의 교집합입니다. identity 정책만 보고 있으면 왜 막히는지 안 보입니다. AccessDenied 가 정책상 맞는데도 나면 경계와 세션 정책을 의심하는 게 순서입니다.
댓글 0