当通过 GKE POD 内的 Cron 执行时,无法使用 Python SDK 将消息发布到 GCP Pub/Sub
Unable to publish messages to GCP Pub/Sub using Python SDK when executed via Cron inside a GKE POD
使用 PYthon SDK 将消息发布到 GCP Pub/SUb。代码在 GKE 上的 Kubernetes POD 中 运行。
import pymysql
import os
import argparse
import time
from google.cloud import pubsub_v1
entries = ['jelly']
def publish_messages(project, topic_name):
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project, topic_name)
for n in entries:
data = u'Message number {}'.format(n)
data = data.encode('utf-8')
publisher.publish(topic_path, data=data)
print "Message %s sent to queue" % n
脚本在手动执行时工作正常。但是,通过 Crontab 触发时失败。
Error: No handlers could be found for logger google.cloud.pubsub_v1.publisher._batch.thread"
找到解决方案。
默认情况下,crontab 不从系统环境变量中读取。上面的 Python 代码需要环境变量 "GOOGLE_APPLICATION_CREDENTIALS" 来保存服务帐户密钥(在本例中为 ConfigMap)。
为此,必须在运行时将所有环境变量打印到容器的“/etc/environment”文件中。
像这样:
FROM ubuntu:latest
ADD send.py Jelly/send.py
COPY jellycron /etc/cron.d/jellycron
RUN apt-get update && apt-get install -y cron vim mysql-server curl python python-pip
&& pip install --upgrade pymysql google-api-python-client google-cloud google-
cloud-pubsub && touch /var/log/cron.log && chmod 0644 /etc/cron.d/jellycron &&
crontab /etc/cron.d/jellycron
CMD printenv >> /etc/environment && cron && tail -f /var/log/cron.log
使用 PYthon SDK 将消息发布到 GCP Pub/SUb。代码在 GKE 上的 Kubernetes POD 中 运行。
import pymysql
import os
import argparse
import time
from google.cloud import pubsub_v1
entries = ['jelly']
def publish_messages(project, topic_name):
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project, topic_name)
for n in entries:
data = u'Message number {}'.format(n)
data = data.encode('utf-8')
publisher.publish(topic_path, data=data)
print "Message %s sent to queue" % n
脚本在手动执行时工作正常。但是,通过 Crontab 触发时失败。
Error: No handlers could be found for logger google.cloud.pubsub_v1.publisher._batch.thread"
找到解决方案。 默认情况下,crontab 不从系统环境变量中读取。上面的 Python 代码需要环境变量 "GOOGLE_APPLICATION_CREDENTIALS" 来保存服务帐户密钥(在本例中为 ConfigMap)。 为此,必须在运行时将所有环境变量打印到容器的“/etc/environment”文件中。 像这样:
FROM ubuntu:latest
ADD send.py Jelly/send.py
COPY jellycron /etc/cron.d/jellycron
RUN apt-get update && apt-get install -y cron vim mysql-server curl python python-pip
&& pip install --upgrade pymysql google-api-python-client google-cloud google-
cloud-pubsub && touch /var/log/cron.log && chmod 0644 /etc/cron.d/jellycron &&
crontab /etc/cron.d/jellycron
CMD printenv >> /etc/environment && cron && tail -f /var/log/cron.log