在GKE POD内通过Cron执行时,无法使用Python SDK将消息发布到GCP Pub / Sub。

问题描述 投票:1回答:1

使用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触发时失败。

错误:找不到记录器的处理程序google.cloud.pubsub_v1.publisher._batch.thread“

python-2.7 cron google-cloud-platform google-cloud-pubsub google-kubernetes-engine
1个回答
1
投票

找到了解决方案。默认情况下,Crontab不读取系统环境变量。上面的Python代码需要env变量“GOOGLE_APPLICATION_CREDENTIALS”,它包含服务帐户密钥(在本例中为ConfigMap)。要实现这一点,必须将所有env变量打印到运行时容器的“/ 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
© www.soinside.com 2019 - 2024. All rights reserved.