Google cloud platform 从运行在谷歌云上的云访问云SQL
我有一个云运行服务,它通过Google cloud platform 从运行在谷歌云上的云访问云SQL,google-cloud-platform,google-cloud-sql,google-cloud-run,Google Cloud Platform,Google Cloud Sql,Google Cloud Run,我有一个云运行服务,它通过SQLAlchemy访问云SQL实例。但是,在云运行日志中,我看到CloudSQL连接失败。请看https://cloud.google.com/sql/docs/mysql/connect-run 有关其他详细信息:请确保该帐户有权访问“”。转到那个链接,上面说: “默认情况下,您的应用程序将使用云运行(完全管理)服务帐户授权您的连接。服务帐户的格式为PROJECT\u编号-compute@developer.gserviceaccount.com." 但是,以下()
SQLAlchemy
访问云SQL实例。但是,在云运行日志中,我看到CloudSQL连接失败。请看https://cloud.google.com/sql/docs/mysql/connect-run 有关其他详细信息:请确保该帐户有权访问“”
。转到那个链接,上面说:
“默认情况下,您的应用程序将使用云运行(完全管理)服务帐户授权您的连接。服务帐户的格式为PROJECT\u编号-compute@developer.gserviceaccount.com."
但是,以下()说明:
“默认情况下,云运行修订使用计算引擎默认服务帐户(项目编号-compute@developer.gserviceaccount.com),具有Project>Editor IAM角色。这意味着默认情况下,您的云运行修订版具有对Google云项目中所有资源的读写访问权限。”
那么,这难道不意味着CloudRun已经可以访问SQL了吗?我已经在云运行部署页面中设置了云SQL连接。您建议我如何允许从Cloud Run访问云SQL
编辑:我必须启用云SQL API。否,默认情况下,Cloud Run无法访问云SQL。您需要遵循以下两条路径之一
workspace
目录中创建本地unix套接字文件
以下是主要步骤:
Berglas
容器,用\u VAR1
替换填充其调用,这是一个我使用Berglas加密的环境变量,名为CMCREDENTIALS
。您应该根据需要添加尽可能多的\u VAR{n}
/workspace
目录中存储的变量--设置环境变量
cloudbuild.yaml
#basic cloudbuild.yaml
步骤:
#拉动berglas容器并将秘密写入临时文件
#下/工作区
-名称:gcr.io/berglas/berglas
id:“安装Berglas”
环境:
-“${u VAR1}=berglas://${u BUCKET\u ID\u SECRETS}/${u VAR1}?destination=/workspace/${u VAR1}”
参数:[“exec”、“--”、“/bin/sh”]
#安装云sql代理
-id:“安装云SQL代理”
名称:阿尔卑斯山:最新
入口点:上海
args:
-“-c”
- "\
wget-O/workspace/cloud\u sql\u代理\
https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 && \
睡眠2&\
chmod+x/workspace/cloud\u sql\u proxy”
等待:['-']
#使用上面的秘密,构建并运行测试套件
-名称:“python:3.8.3-slim”
id:“运行单元测试”
入口点:'/bin/bash'
args:
-“-c”
- "\
(/workspace/cloud\u sql\u proxy-dir=/workspace/${{u sql\u proxy\u PATH}-instances=${{u INSTANCE\u NAME1}&sleep 2)&&\
apt get update&&apt get install-y--不建议安装\
构建基本libssl-dev-libffi-dev-libpq-dev-python3-dev-wget&&\
rm-rf/var/lib/apt/lists/*&&\
导出${u VAR1}=$(cat/workspace/${u VAR1})&&
导出实例\u NAME1=${\u实例\u NAME1}&&\
导出SQL_PROXY_PATH=/workspace/${SQL_PROXY_PATH}&&\
pip安装-r dev-requirements.txt&&\
pip安装-r requirements.txt&&\
python-m pytest-v&&\
rm-rf/workspace/${u SQL\u PROXY\u PATH}&&\
echo“已删除云SQL代理”
waitFor:['installcloudsqlproxy','installberglas']
目录:“${u APP\u dir}”
#使用应用程序/Dockerfile构建说明,构建应用程序映像
-名称:“gcr.io/cloud builders/docker”
id:“生成应用程序映像”
args:['build',
“-t”,
'gcr.io/$PROJECT\u ID/${{u IMAGE\u NAME}',
'.',
]
目录:“${u APP\u dir}”
#推送应用程序映像
-名称:“gcr.io/cloud builders/docker”
id:'推送应用程序映像'
args:['push',
'gcr.io/$PROJECT\u ID/${{u IMAGE\u NAME}',
]
#将应用程序映像部署到云运行
#通过Berglas exec入口点为gunicorn填充秘密
-名称:“gcr.io/cloud builders/gcloud”
id:“部署应用程序映像”
参数:['beta',
"跑",,
“部署”,
“${u IMAGE\u NAME}”,
"形象",,
'gcr.io/$PROJECT\u ID/${{u IMAGE\u NAME}',
"地区",,
“us-central1”,
"平台",,
“管理”,
“安静”,
“--添加cloudsql实例”,
“${u实例\u名称1}”,
“--设置环境变量”,
'SQL_PROXY_PATH=/${{SQL_PROXY_PATH},INSTANCE_NAME1=${{u INSTANCE_NAME1},${u VAR1}=berglas://${{u BUCKET_ID_SECRETS}/${u VAR1}',
“--允许未经验证的”,
“--内存”,
“512Mi”
]
#使用下面可以在命令行中更改的默认值
替换:
_图像名称:您的图像名称
_BUCKET_ID_SECRETS:你的BUCKET for berglas SECRETS
_实例名称1:项目名称:位置:dbname
_SQL\代理\路径:cloudsql
_VAR1:cmc证书
#我们将在这里推送的图像
图像:[
'gcr.io/$PROJECT\u ID/${{u IMAGE\u NAME}'
]
Dockerfile
下面的代码构建了一个Pytho
# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.8.3-slim
# Add build arguments
# Copy local code to the container image.
ENV APP_HOME /application
WORKDIR $APP_HOME
# Install production dependencies.
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
python3-dev \
libssl-dev \
libffi-dev \
&& rm -rf /var/lib/apt/lists/*
# Copy the application source
COPY . ./
# Install Python dependencies
RUN pip install -r requirements.txt --no-cache-dir
# Grab Berglas from Google Cloud Registry
COPY --from=gcr.io/berglas/berglas:latest /bin/berglas /bin/berglas
# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
ENTRYPOINT exec /bin/berglas exec -- gunicorn --bind :$PORT --workers 1 --threads 8 app:app