我无法弄清楚将我的AEF环境连接到多个cloud_sql实例的语法。
这是我尝试的两个配置:
beta_settings:
cloud_sql_instances:
- pore-gdic:europe-west1:a-django
- pore-gdic:europe-west1:a-airflow-5
失败:
ERROR: (gcloud.app.deploy) Error Response: [13] Invalid Cloud SQL name: []
基于此问题的回答: Connecting to multiple CloudSQL instances using Cloud sql proxy?
beta_settings:
cloud_sql_instances:
pore-gdic:europe-west1:a-django,pore-gdic:europe-west1:a-airflow-5
部署时不会失败,但根本不能用作网页。
有没有人能解决这个问题。
为了完整性,一个db运行MySQL和另一个postgres。所以端口不是问题。
答案 0 :(得分:3)
在GAE Flex环境中,您使用的是适用于app.yaml的正确语法:
beta_settings:
cloud_sql_instances:
pore-gdic:europe-west1:a-django,pore-gdic:europe-west1:a-airflow-5
您的问题很可能是您在应用中使用了错误的连接网址。通过app.yaml中的上述内容,您将指示GAE使用Unix套接字连接到您的数据库。您的连接应如下所示:
mysql://USERNAME:PASSWORD@/DATABASE?unix_socket=/cloudsql/pore-gdic:europe-west1:a-django
postgresql://USERNAME:PASSWORD@/DATABASE?host=/cloudsql/pore-gdic:europe-west1:a-airflow-5
如果要在不更改内容的情况下在本地计算机上进行测试,可以安装cloud-sql proxy。这样在本地运行应用程序的方式与部署时相同。使用以下命令在应用程序之前启动代理:
./cloud_sql_proxy -dir=/cloudsql -instances=pore-gdic:europe-west1:a-django,pore-gdic:europe-west1:a-airflow-5
这将导致它在/cloudsql
中创建套接字,这是上面的连接网址指定(例如:/cloudsql/pore-gdic:europe-west1:a-django
)。
This部分提供了有关使用Unix套接字和TCP在使用多个实例时进行连接的区别的更多信息。
答案 1 :(得分:0)
因为我无法理解这一点。
我将气流数据库暴露给0.0.0.0/0
。此数据库中的信息不敏感,但为了阻止攻击者,我将root密码更新为1pass生成的64位密码:
类似于:XC$YvCBJ{avigR^LibD#Nn7i9MrU3qpH}GVcD(i4]9)Lg7)KZwT3xfQ)GW2z3rt4
。
这应该持续到太阳烧尽才能破裂。
然后我使用此密码连接到mysql实例,主机ip,要连接的数据库。这些是从settings.py
中读取的类似的东西:
def trigger_dag_master():
"""
Trigger the dag_master dag running in airflow.
Connect to cloudsql instance running airflow using cloudsql proxy.
insert a row that triggers the dag master.
based on an insert pattern found in: https://github.com/apache/incubator-airflow/blob/master/airflow/api/common/experimental/trigger_dag.py
:return: True if successful
"""
def insert(connection: MySQLdb.Connect, query: str) -> bool:
"""
Insert query into MYSQL database.
handles rollback if failure
:param connection: mysql connection
:param query: query to execute
:return: True if successful
"""
try:
cursor = connection.cursor()
cursor.execute(query)
connection.commit()
return True
except Exception as e:
logger.error(e.with_traceback(e.__traceback__))
connection.rollback()
return False
assert all([settings.AIRFLOW_PASSWORD, settings.AIRFLOW_USER,
settings.AIRFLOW_HOST, settings.AIRFLOW_DB])
mysql_connection = MySQLdb.connect(settings.AIRFLOW_HOST,
settings.AIRFLOW_USER,
settings.AIRFLOW_PASSWORD,
settings.AIRFLOW_DB)
....
希望这有助于某人。