如何将 Google Cloud SQL PostGIS 与 Google Cloud Storage 中的数据库外栅格结合使用?

问题描述 投票:0回答:1

我在 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 可以正确进行身份验证?

postgresql google-cloud-storage postgis google-cloud-sql postgis-raster
1个回答
0
投票

这个问题确实与身份验证有关,但不是我最初想象的那样。

即使 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 记录了一个问题,并鼓励任何也受此影响的人投票以提高可见性。

© www.soinside.com 2019 - 2024. All rights reserved.