我有启用了VPN的Google Cloud Project和具有相同VPN且启用SSL的Google Cloud SQL(PostgreSQL)数据库实例。 Cloud SQL具有公用和专用IP地址。我用于从外部连接数据库的公共IP(例如PgAdmin客户端工具)和用于内部连接的私有IP(例如数据流)。现在,我想从Cloud Composer连接此CloudSQL。使用PostgresOperator连接Cloud Postgresql数据库。在气流->连接部分下,使用Puplic IP作为端口创建单独的连接。由于此CloudSQL已启用SSL,因此将证书推送到DAG的GCS位置。在“额外属性”部分下的连接中,刚刚传递了ssl证书路径信息,如下所示,
{
"sslmode": "verify-ca",
"sslcert": "/home/airflow/gcs/dags/certificates/client-cert.pem",
"sslca": "/home/airflow/gcs/dags/certificates/server-ca.pem",
"sslkey": "/home/airflow/gcs/dags/certificates/client-key.pem"
}
出现以下错误消息,
psycopg2.OperationalError:私钥文件 “ /home/airflow/gcs/dags/certificates/client-key.pem”具有组或 世界通行证;权限应为u = rw(0600)或les
如果有人能帮助我解决此问题,那就太好了。
postgresoperator = PostgresOperator(
task_id='create_field_reports',
sql=create_field_reports_query,
postgres_conn_id='pgconnection_google_private',
dag=dag
)
答案 0 :(得分:0)
Cloud Composer使用GCSFUSE将Cloud Storage中的某些目录(DAG /插件)挂载到在GKE中运行的Airflow worker容器中。它将使用无法覆盖的默认权限来挂载这些内容,因为该元数据不会被GCS跟踪。
一种解决方法是使用在DAG开头运行的BashOperator
将文件复制到新目录,然后对所有文件运行chmod
。
答案 1 :(得分:0)
您可能想改用gcp_sql_operator,因为它可以处理云代理。您可以在我对相关问题的答案中看到一个示例:
答案 2 :(得分:0)
为此,需要几个步骤,所有这些步骤都很少记录在网络上。 它不使用SSL,但我认为可以重构为使用SLL :
def create_cloudsql_conn(name, user, password, instance, database, port='3308'):
"""
MySQL: connect via proxy over TCP (specific proxy version)
It uses the format AIRFLOW_CONN_* to create a connection named PROXY_ODS_VAT
https://airflow.readthedocs.io/en/latest/howto/connection/gcp_sql.html
"""
os.environ[f'AIRFLOW_CONN_{name.upper()}'] = \
"gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?" \
"database_type=mysql&" \
"project_id={project_id}&" \
"location={location}&" \
"instance={instance}&" \
"use_proxy=True&" \
"sql_proxy_version=v1.13&" \
"sql_proxy_use_tcp=True".format(
user=quote_plus(user),
password=quote_plus(password),
public_ip='0.0.0.0',
public_port=port,
database=quote_plus(database),
project_id=quote_plus(Variable.get('gcp_project')),
location=quote_plus(Variable.get('gce_region')),
instance=quote_plus(instance),
)
create_cloudsql_conn(
'proxy_ods_vat',
Variable.get('gcsql_ods_user'),
Variable.get('gcsql_ods_password'),
Variable.get('gcsql_ods_instance'),
Variable.get('gcsql_vat_database')
)
CloudSQLQueryOperator
: cloudsql_prep = CloudSqlQueryOperator(
task_id="cloudsql-load-prep",
gcp_cloudsql_conn_id='proxy_ods_vat',
sql='templates/ingestion_prep.sql',
params={
'database': Variable.get('gcsql_vat_database')
},
)