Google-Compute-Engine

GCP:在計算 VM 中執行 cloud_sql_proxy 的權限被拒絕

  • April 27, 2018

我創建了第一個具有容器優化作業系統和以下範圍的計算實例:

Cloud SQL       Enabled
Compute Engine      Read Write
Service Control     Enabled
Service Management      Read Only
Stackdriver Logging API     Write Only
Stackdriver Monitoring API      Write Only
Stackdriver Trace       Write Only
Storage     Read Only

我需要安裝 Cloud SQL 代理並遵循以下文件:https ://cloud.google.com/sql/docs/postgres/connect-compute-engine#gce-connect-proxy

我可以 SSH 沒有任何問題,但我無法執行命令:

leszek@backend-app ~ $ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
2018-04-10 19:52:00 (211 MB/s) - 'cloud_sql_proxy' saved [7505002/7505002]
leszek@backend-app ~ $ chmod +x cloud_sql_proxy
leszek@backend-app ~ $ ./cloud_sql_proxy -instances=my-instance=tcp:0.0.0.0:54
32
   -bash: ./cloud_sql_proxy: Permission denied
lgr@backend-app ~ $ sudo ./cloud_sql_proxy -instances=my-instance=tcp:0.0.0.0:5432
sudo: unable to execute ./cloud_sql_proxy: Permission denied

我錯過了什麼明顯的事情,我什至無法啟動 sql_proxy 命令?

在容器作業系統上部署 CloudSQL 代理的最佳選擇是使用官方 CloudSQL 容器和連結網路。

docker run -d -v /cloudsql:/cloudsql \
 -v <PATH_TO_KEY_FILE>:/config \
 -p 127.0.0.1:5432:5432 \
 gcr.io/cloudsql-docker/gce-proxy:1.11 /cloud_sql_proxy \
 -instances=<INSTANCE_CONNECTION_NAME>=tcp:0.0.0.0:5432 -credential_file=/config

請參閱:https ://cloud.google.com/sql/docs/postgres/connect-docker

Container-Optimized OS 使用“noexec”標誌安裝大部分文件系統。這可以通過執行以下命令來查看:

mount | grep noexec

’noexec’ 選項不允許在掛載的文件系統上直接執行任何二進製文件。這是因為 COS 上預設的安全鎖定實現。

但是,Container-Optimized OS 文件系統中有一些可寫位置(例如 /var/lib/docker 和 /var/lib/cloud)。這些位置被掛載為“執行檔”(即它們在沒有 noexec 掛載標誌的情況下掛載)。

按照文章中連結的指南,您最好使用 Debian 或 Red Hat 實例。但是,如果您想在 Google Container-Optimized OS 實例上執行二進製文件 (cloud_sql_proxy),您可以嘗試將文件複製到可寫位置(例如 /var/lib/docker):

sudo cp cloud_sql_proxy /var/lib/docker

嘗試在那裡執行文件:

sudo ./cloud_sql_proxy

這應該可以讓您克服permissions denied錯誤。

此時,假設實例應用了正確的範圍,您將收到如下輸出:

2018/04/23 08:48:21 must specify -projects, -fuse, or -instances

如果實例沒有設置正確的範圍,您將收到一條消息,提示service account is not configured with sufficient permissions.

如果是這種情況,您可以通過停止和編輯實例並將Cloud SQL範圍設置為啟用來傳遞此錯誤。

引用自:https://serverfault.com/questions/907028