CloudFront后的API Gateway是否不支持AWS_IAM认证?调用问题咨询
能否通过CloudFront调用启用AWS_IAM保护的REST API?
当然可以!你遇到的问题大概率是配置环节漏掉了几个关键步骤,我来帮你梳理核心要点和修正方案:
核心配置调整项
1. 给CloudFront配置适配API Gateway的源访问控制(OAC)
旧的Origin Access Identity(OAI)不适用于IAM认证的API Gateway场景,你需要创建Origin Access Control(OAC):
- 在CloudFront控制台创建OAC时,类型选择「API Gateway」
- 给CloudFront关联的服务角色添加权限,允许它调用你的API Gateway
- 在API Gateway的资源策略中,添加允许该OAC对应的CloudFront分发访问的规则(示例策略见下文)
2. 配置CloudFront缓存行为,透传IAM签名相关请求头
因为你是用Cognito用户生成IAM签名后调用API,CloudFront需要完整透传这些签名相关的头到API Gateway:
- 在CloudFront的缓存行为设置中,选择「允许的HTTP方法」包含你API用到的所有方法(比如GET、POST)
- 选择不缓存的策略(比如Managed-CachingDisabled),因为每个用户的IAM签名都是唯一的,缓存会导致签名失效
- 在「源请求策略」中,选择能转发所有必要请求头的规则(比如Managed-AllViewerExceptHostHeader),确保
Authorization、X-Amz-Date、X-Amz-Security-Token这些IAM签名必备头被完整转发
3. 调整API Gateway的资源策略
你需要同时允许CloudFront作为代理访问,并且保留IAM认证的验证逻辑,示例资源策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/*/*/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::你的账号ID:distribution/你的CloudFront分发ID" } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/*/*/*", "Condition": { "Bool": { "aws:SecureTransport": "true" } } } ] }
这条策略既允许CloudFront分发访问你的API,又要求所有请求必须通过HTTPS且携带有效的IAM签名(因为你已经在API方法上开启了AWS_IAM认证)。
4. 更新Amplify的API配置
把Amplify配置中的API端点从原来的API Gateway域名,改成你的CloudFront分发域名(或者Route53配置的自定义域名),确保是HTTPS协议。同时确认Amplify的Auth模块能正确从Cognito UserPool获取用户凭证,并生成有效的IAM签名。
常见排查点
- 确认CloudFront分发已开启HTTPS(IAM签名要求请求必须是HTTPS)
- 检查缓存策略是否设置为不缓存,避免缓存无签名的请求导致后续调用失败
- 验证所有IAM签名相关的请求头都被CloudFront正确转发到API Gateway
内容的提问来源于stack exchange,提问作者Christine
相关产品推荐
相关产品推荐

