GCP Cloud Function创建VM实例时无法识别自定义镜像问题
问题分析与解决方案
从你遇到的情况(Cloud Function报错找不到镜像、控制台手动创建VM显示已删除的旧镜像)来看,核心问题大概率是镜像的区域/权限不匹配,或者控制台缓存/镜像状态异常,下面一步步拆解解决:
1. 优先排查区域不匹配问题(最常见诱因)
你代码里有个明显的矛盾点:VM指定的区域是europe-west2-c,但磁盘类型却用了us-central1-a的pd-standard——磁盘类型的区域必须和VM所在区域完全一致,否则不仅会影响镜像识别,还会直接导致VM创建失败。
除此之外,还要确认自定义镜像的存储区域:
- 打开Cloud Console的「Images」页面,找到
pandora-pagespeed-image,查看它的「位置」是全局还是某个特定区域(比如us-central1)。- 如果是区域镜像:你创建VM时必须选择和镜像相同的区域,否则控制台和API都找不到这个镜像。比如镜像存在
us-central1,那你要么把VM区域改成us-central1下的可用区,要么把镜像复制到europe-west2区域。 - 如果是全局镜像:区域问题排除,但务必把代码里的
diskType改成europe-west2-c对应的路径:projects/<<project id>>/zones/europe-west2-c/diskTypes/pd-standard。
- 如果是区域镜像:你创建VM时必须选择和镜像相同的区域,否则控制台和API都找不到这个镜像。比如镜像存在
2. 检查Cloud Function服务账号的镜像访问权限
你在控制台能看到镜像,但Cloud Function使用的服务账号可能没有该镜像的访问权限:
- 确认Cloud Function的服务账号:如果用的是默认服务账号,格式为
<<project-id>>@appspot.gserviceaccount.com;如果是自定义SA,就是代码里sa_file对应的账号。 - 给这个账号添加Compute Image User角色(包含
compute.images.useReadOnly权限),或者直接在镜像的IAM设置里,给该账号授予roles/compute.imageUser权限。
3. 验证镜像状态与路径正确性
- 确认镜像
pandora-pagespeed-image的状态是READY:在Images页面查看状态,如果镜像还在创建中或未就绪,API会返回“找不到资源”的错误。 - 用命令行获取镜像的准确
selfLink,避免手动拼写错误:
把输出的链接直接替换到代码里的gcloud compute images describe pandora-pagespeed-image --format="value(selfLink)"sourceImage字段,比如:"sourceImage": "https://www.googleapis.com/compute/v1/projects/xxx/global/images/pandora-pagespeed-image"。
4. 解决控制台显示旧镜像的问题
控制台显示已删除的旧镜像,大概率是缓存延迟导致的:
- 强制刷新控制台页面(Ctrl+F5),或者用命令行查看实时镜像列表:
命令行结果是实时同步的,能准确反映当前存在的镜像。如果旧镜像确实已删除,等待一段时间后控制台缓存会自动更新。gcloud compute images list
内容的提问来源于stack exchange,提问作者2bon2b
相关产品推荐
相关产品推荐

