我在 Cloud SQL 中配置了 PostgreSQL 实例,并安装了 PostGIS 和 PostGIS 栅格扩展。我将矢量数据存储在数据库内,将栅格数据作为 COG 存储在存储桶中,这些数据在数据库中注册为数据库外栅格。
Cloud SQL 实例使用 PostgreSQL 14.9 以及 PostGIS 3.2.5 和 PostGIS Raster 3.2.3。我已经设置了启用 out-db rasers 所需的标志:
postgis.enable_outdb_rasters=on
postgis.gdal_enabled_drivers=ENABLE_ALL
设置实例时,Google 自动创建了一个 Cloud SQL 服务代理:
p<PROJECT_NUMBER>-<IDENTIFIER>@gcp-sa-cloud-sql.iam.gserviceaccount.com
。我已在项目级别授予该代理存储管理员角色,并通过云控制台验证权限是否已设置。
此外,我在同一项目中有一个使用计算服务帐户的计算实例。从这个虚拟机中,我可以成功调用
gdalinfo /vsigs/path-to-cog.tif
来访问栅格数据。
但是,当执行例如
SELECT ST_Value(data, 1, 1) from rasterdata limit 1;
通过PostGIS获取像素值我收到错误rt_band_load_offline_data: Cannot open offline raster: /vsigs...
我之前曾成功使用 out-db 模式通过本地 PostgreSQL 实例访问远程 COG。在这种情况下,我明确设置了
GOOGLE_APPLICATION_CREDENTIALS
环境变量。
我收到的错误似乎与服务代理和/或 GDAL 难以识别 Cloud SQL 实例上的身份验证详细信息的权限有关。
我已遵循此处提供的一些相关建议,但问题仍然存在。
我有什么遗漏的吗?有没有办法在 Cloud SQL 实例上设置自定义环境变量以确保 GDAL 可以正确进行身份验证?
这个问题确实与身份验证有关,但不是我最初想象的那样。
即使 CloudSQL 实例与 COG 存储桶位于同一 VPC 上,也必须设置 GDAL 虚拟文件 (VSI) 驱动程序配置才能正确授权 PostGIS 访问数据。
这需要设置客户端 ID 和秘密via
SET postgis.gdal_vsi_options = 'GS_ACCESS_KEY_ID=xxxx GS_SECRET_ACCESS_KEY=yyyy';
其中
GS_ACCESS_KEY_ID
和 GS_SECRET_ACCESS_KEY
来自 Google HMAC 密钥。
但是,在 CloudSQL 实例上执行此
SET
操作失败,并显示:
WARNING: 'gs_access_key_id' is not a legal VSI network file option
ERROR: invalid value for parameter "postgis.gdal_vsi_options": "GS_ACCESS_KEY_ID=xxxxxxxx"
我已经能够将其识别为 CloudSQL 中 PostGIS 使用的 GDAL 版本中的错误。因此,我向 Google 记录了一个问题,并鼓励任何也受此影响的人投票以提高可见性。