通过Dataflow从GCS桶读取Tensorflow文件时:SSL无替代证书主题名称匹配目标主机名
我正在运行一个稍微修改过的cloudml花卉示例,目的是用来分类我自己的图片,但在预处理部分遇到了问题。看起来当我指向我在另一个项目中的图片时,它们无法被访问:
返回pywrap_tensorflow.ReadFromStream(self._read_buf, length, status): 文件 "/usr/lib/python2.7/contextlib.py",第24行,在exit self.gen.next() 文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/errors_impl.py",第466行,在raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status)) UnavailableError: 执行HTTP请求时出错(HTTP响应代码0,错误代码51,错误信息'SSL:没有替代证书主题名称与目标主机名'$BUCKET.com.storage.googleapis.com'匹配')在读取$BUCKET.com/image.jpg时
(我把实际的桶名称替换成了$BUCKET)。
我是在一个虚拟机上运行这些脚本,并且已经从requirements.txt文件中安装了所需的包:
apache-beam[gcp]==0.6.0
pillow==4.0.0
tensorflow==1.4.1
到目前为止,我尝试/做了以下事情:
- 确认我可以在没有修改的情况下运行原始的花卉预处理,来自sample.sh文件
- 将默认项目的计算引擎服务账户("default-project-id"-compute@developer.gserviceaccount.com)的访问权限更改为“存储对象查看器”,以便访问持有桶的项目。对于相应的@cloudservices.gserviceaccount.com也做了同样的操作
- 确认指向另一个项目中桶内图片的路径名称是正确的
当从一个没有 .com 名称的桶读取时,但仍在另一个项目中(并且该项目的计算引擎服务账户的访问权限也设置为“存储对象查看器”)时,抛出了类似的错误,只是现在是“PermissionDenied”而不是“Unavailable”。
使用我的默认gcloud认证,我能够在本地运行预处理,没有错误。
python trainer/preprocess.py \ --input_dict "$DICT_FILE" \ --input_path $INPUT_PATH_EVAL \ --output_path $OUTPUT_PATH_EVAL \
我查看了这里的解决方案,但那是一个旧版本的tensorflow,应该不会在1.4版本上出现问题,如果真是这样,我可能仍然能够访问常规的非域桶,但我现在无法访问。
那么,在运行这个示例时,我在项目之间的访问上缺少了什么呢?
相关问题:
- 暂无相关问题
1 个回答
谷歌的TensorFlow API不支持双通配符格式,比如 *.*.storage.googleapis.com
。它们只支持一种通配符证书,比如 *.storage.googleapis.com
。在你的情况中,当你使用 "$BUCKET.com.storage.googleapis.com”时,证书中出现了多于一个相同类型的身份(例如,多个DNS名称)。想了解更多细节,可以参考这个RFC标准。
出现“权限被拒绝”的错误是因为权限问题。所以在这种情况下,你没有足够的权限去访问其他项目的存储桶,但服务是可以使用的。想获取更多信息,可以查看请求端点和访问控制选项的文档。
最简单的解决办法是通过谷歌云API将你的文件复制到谷歌存储中,然后从那里获取图片。