标签: google-cloud-python

使用Google App Engine的Google云端存储签名网址

处理Google云端存储的常规签名URL(查询字符串身份验证)令人沮丧.

Google云端存储签名网址示例 - >这是否是整个互联网中唯一可用于生成Google云端存储签名网址的代码?如果需要,我应该全部阅读并手动修改Pure Python GAE吗?

当你将它与已经包含在任何SDK中的AWS S3 getAuthenticatedURL()进行比较时,这很荒谬......

我错过了一些明显的东西,还是每个人都面临同样的问题?这是怎么回事?

python google-app-engine google-cloud-storage gcloud-python google-cloud-python

14
推荐指数
2
解决办法
3296
查看次数


Google Cloud Storage + Python:如何在GCS中的某个文件夹中列出obj?

我打算编写一个Python程序来检查文件是否在我的Google云端存储的某个文件夹中,基本的想法是获取list文件夹中的所有对象,文件名list,然后检查文件abc.txt是否在文件名list.

现在的问题是,看起来Google只提供了一种获取方式obj list,即uri.get_bucket()下面的代码来自https://developers.google.com/storage/docs/gspythonlibrary#listing-objects

uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
    print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
    print '  "%s"' % obj.get_contents_as_string()
Run Code Online (Sandbox Code Playgroud)

缺点uri.get_bucket()是,看起来它首先得到所有的对象,这是我不想要的,我只需要得到特定文件夹的obj名称list(例如gs//mybucket/abc/myfolder),这应该很快.

有人可以帮忙回答吗?感谢每一个答案!

python google-cloud-storage gcloud-python google-cloud-python

9
推荐指数
3
解决办法
9953
查看次数

有效地将Pandas数据帧写入Google BigQuery

我正在尝试pandas.DataFrame使用此处pandas.DataFrame.to_gbq()记录的功能上传到Google大查询.问题是,直接上传到Google云端存储GUI需要不到一分钟的时间需要2.3分钟.我正计划上传一堆数据帧(~32),每个数据帧都有相似的大小,所以我想知道它是什么更快的选择.to_gbq()

这是我正在使用的脚本:

dataframe.to_gbq('my_dataset.my_table', 
                 'my_project_id',
                 chunksize=None, # i've tryed with several chunksizes, it runs faster when is one big chunk (at least for me)
                 if_exists='append',
                 verbose=False
                 )

dataframe.to_csv(str(month) + '_file.csv') # the file size its 37.3 MB, this takes almost 2 seconds 
# manually upload the file into GCS GUI
print(dataframe.shape)
(363364, 21)
Run Code Online (Sandbox Code Playgroud)

我的问题是,什么更快?

  1. Dataframe使用pandas.DataFrame.to_gbq()功能上传
  2. 保存Dataframe为csv,然后使用Python API作为文件上传到BigQuery
  3. 保存Dataframe为csv,然后使用此过程将文件上载到Google Cloud Storage ,然后从BigQuery中读取它

更新:

替代方案2,使用pd.DataFrame.to_csv() …

python pandas google-cloud-storage google-bigquery google-cloud-python

9
推荐指数
2
解决办法
8268
查看次数

模拟访问公共 GCS 存储桶的结果

我有以下代码:

bucket = get_bucket('bucket-name')
blob = bucket.blob(os.path.join(*pieces))
blob.upload_from_string('test')
blob.make_public()
result = blob.public_url
# result is `<Mock name='mock().get_bucket().blob().public_url`
Run Code Online (Sandbox Code Playgroud)

我想模拟public_url的结果,我的单元测试代码是这样的

with ExitStack() as st:
    from google.cloud import storage
    blob_mock = mock.Mock(spec=storage.Blob)
    blob_mock.public_url.return_value = 'http://'

    bucket_mock = mock.Mock(spec=storage.Bucket)
    bucket_mock.blob.return_value = blob_mock

    storage_client_mock = mock.Mock(spec=storage.Client)
    storage_client_mock.get_bucket.return_value = bucket_mock

    st.enter_context(
        mock.patch('google.cloud.storage.Client', storage_client_mock))
    my_function()
Run Code Online (Sandbox Code Playgroud)

谷歌存储有没有像FakeRedismoto这样的东西,所以我可以模拟google.cloud.storage.Blob.public_url

mocking google-api google-cloud-storage python-unittest google-cloud-python

8
推荐指数
1
解决办法
1584
查看次数

如何使用json凭证文件对gcloud大查询进行身份验证?

谷歌bigquerygcloud文档中,它声明可以从from_service_account_json确定身份验证.

我尝试了以下内容

from gcloud import bigquery
client = bigquery.Client.from_service_account_json('/Library/gcloud_api_credentials.json')
Run Code Online (Sandbox Code Playgroud)

json文件如下所示(注意:加扰的凭据,所以这些现在是假的).

{"type": "service_account",
"project_id": "example_project",
  "private_key_id": "c7e371776ab6e2dsfafdsaff97edf9377178c8",
  "private_key": "-----BEGIN PRIVATE KEY-----\nXXXXXXXXAgEAAoIBAQDBIAaPzRVOT12J\nfPKzJ/tgVTJWHWiO29C/OpjRbd4WUFNEfX3mdShYoVo9+F7u3QSlCxA4SgZmro0s\n/yQKyhCrpcmrmWJyr5VqqIvqScJVJzBvLHCto/JoydCSzYQJz89vltZ11NZE1n+W\ncvF2ygX9oM/dyUK/1eVsJOIoj4qj2jpRuQhxgh0ag2HVYlmAfnP9wfTdLeoV0e/z\n0WtBNesCrekh/ooldbxcDa6KvLJpBKu6BJg0nYWtnB0Q2hEZl1msNDs9lsMIWI/4\nRwz4iEv67HDTDaTerF89sFsPW5dyybnspxuNXlNSjtdABpHTU4mm1bwgRSEomuyZ\nptMp+Ck/AgMBAAECggEAYXyDE2/Yw3D4rIBwGtOh5tzazfGGaCa51u4DWiR1qRnf\nDoGyXfTh6ut4HDQV58mVoKJXC7MCTC7sgLxCO1gI1jyX8pE4yt+rMu3lwtx8xnND\n1bq/HkfWA+Nr787iSfmmopOnqk9H4fPM7+sRzH7qSz8z7qa7lQ6qAs8TgpoCx/Zt\nQsfAUDBFHP2x2msngZVkW2rZiCJyiWDE62KI7uxlUXlnqkC9j6vXL+n/SBmVGYSn\n2crQ0CONdBXvk753E4e3AhhA7VUcQorhEnYGFcsI2L9s1mK2SOGnakAukyZpoqQG\n//UmCX/lSu4SpfKi+NFedtQLfZqpfU6tOhS90OzYwQKBgQD1v1FdJ05X92RzRlSb\nQUUqWNKC3OwSlFAEZnBrpY8xSlK8alLXQRQWhBjdugtnfRfvPokILoxtZcgC6rUY\ntyauXPdDbv8+U4+YtcRSf3ZqNQmIajwt/pS/aj9CpY+ZL62codVmXOnpjiaIEZLk\nECJC947oYpxBb6k5OIrecZHuzwKBgQDJLq5H4i3JNpmIHiC/xgDcL9ROrPJBZhaS\fdafsdafddsffdsf/+\nCzA/tpS/dn0i5bf4E/SFWJdFHXk/rIooEGypFNw9e2Sw5rElI3B9DYKkXpHWDLvS\ne0vHm7s6kQKBgQDAH0ZY8XXKR9r8VCupBSoxpSdOr7DQBatZBU02m0SLYHO2YdlJ\n99Lgl31pOx3XVnDz1YwEHYAjtsLbpOrX27gd8QhOa+SYsXM+DDzj0kqdVcGSKJvL\nyZA45bN3Q0A0npW4Mr1HPbSRp1RwZGzWZ9ahTDEpdI58ifNejNnkdh2E+QKBgQCQ\nkSDfuuJX8wpEzBGQfUJk92HC33h+ElQp8MOyl+2qrzTt5KQIkJ+7gbG1F2lQ/Qhc\nqaIDTPTozJds1YfpLARc/fdsfddfd/ovcaSayzV8dEGeXDKU7GrVds5\niwPqRHk3HRJwJHYrT9onoqu8XdDCVggp6ju8RmY2YQKBgQC+r2aGJTOE5BNEwoZa\nT5q5lda+ADFm9JQj9zcF6OI4UFQqJaW0KVlPdr2pH5h6PoRtyVsZ5ZbDSjbZ2+Jp\nT1fW54HoK2S+faXWEmHPIYbRGSSDRJ/Kphu28D4C8Jo8YJKn4rwd8dnWmYC/73cx\naqUiJ7TdFLUYNwl/tg/XGR3PTQ==\n-----END PRIVATE KEY-----\n",
  "client_email": "example_project@appspot.gserviceaccount.com",
  "client_id": "123422110336236066294",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/example-project%40appspot.gserviceaccount.com"
}
Run Code Online (Sandbox Code Playgroud)

我得到以下错误:

Traceback (most recent call last):
  File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 2217, in <module>
    globals = debugger.run(setup['file'], None, None)
  File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1643, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/API/google_big_query_api.py", line 69, in <module>
    try2()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/API/google_big_query_api.py", line 62, …
Run Code Online (Sandbox Code Playgroud)

python authentication json google-bigquery google-cloud-python

7
推荐指数
1
解决办法
4736
查看次数

使用Python从Google Cloud Stackdriver API检索日志名称列表

我正在使用Google的Stackdriver Logging Client Libraries for Python以编程方式检索日志条目,类似于使用gcloud beta logging read.

Stackdriver还提供了一个API来检索日志名称列表,这很可能是gcloud beta logging logs list使用的.

如何将该API与Python客户端库一起使用?我在文档中找不到任何内容.

python google-cloud-platform google-cloud-python google-cloud-stackdriver

7
推荐指数
1
解决办法
829
查看次数

Blob.generate_signed_url()未能成为AttributeError

因此,我正在尝试使用google-cloud-storagePython库(https://googlecloudplatform.github.io/google-cloud-python/latest/storage/blobs.html)为我的Google云端存储对象生成临时的全局可读URL - 更具体地说, Blob.generate_signed_url()方法.我是在命令行Python脚本中的Compute Engine实例中执行此操作.我一直收到以下错误:

AttributeError: you need a private key to sign credentials.the credentials you are currently using <class 'oauth2cl
ient.service_account.ServiceAccountCredentials'> just contains a token. see https://google-cloud-python.readthedocs
.io/en/latest/core/auth.html?highlight=authentication#setting-up-a-service-account for more details.
Run Code Online (Sandbox Code Playgroud)

我知道在GCE(https://github.com/GoogleCloudPlatform/google-auth-library-python/issues/50)中执行此操作存在问题,但我已按照此处的说明创建了新的服务帐户凭据:https://cloud.google.com/storage/docs/access-control/create-signed-urls-program和我的key.json文件肯定包含私钥.我仍然看到那个错误.

这是我的代码:

keyfile = "/path/to/my/key.json"
credentials = ServiceAccountCredentials.from_json_keyfile_name(keyfile)
expiration = timedelta(3) # valid for 3 days
url = blob.generate_signed_url(expiration, method="GET",
                               credentials=credentials) 
Run Code Online (Sandbox Code Playgroud)

我已经阅读了问题跟踪器这里https://github.com/GoogleCloudPlatform/google-cloud-python/issues?page=2&q=is%3Aissue+is%3Aopen并没有任何相关的跳出来所以我假设这应该工作.看不出这里出了什么问题.

python google-cloud-storage google-compute-engine google-cloud-python

7
推荐指数
2
解决办法
1324
查看次数

增加连接池大小

我们正在运行以下代码以并行上传到 GCP Buckets。根据我们看到的警告,我们似乎正在快速耗尽池中的所有连接。有什么方法可以配置库正在使用的连接池吗?

def upload_string_to_bucket(content: str):
        blob = bucket.blob(cloud_path)
        blob.upload_from_string(content)

with concurrent.futures.ThreadPoolExecutor() as executor:
            executor.map(upload_string_to_bucket, content_list)
Run Code Online (Sandbox Code Playgroud)
WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: www.googleapis.com
WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: www.googleapis.com
WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: www.googleapis.com
WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: www.googleapis.com
WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: www.googleapis.com
WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: www.googleapis.com
Run Code Online (Sandbox Code Playgroud)

google-cloud-python

7
推荐指数
1
解决办法
1768
查看次数

如何使用 Google Cloud PubSub and Run 来处理资源密集型长时间运行的任务?

我有一个 Google Cloud PubSub 主题,它有时会收到数千条消息,有时会收到零条消息。这些消息代表的任务每个可能需要一个小时以上。我最好能够为此使用 Cloud Run,因为它可以很好地满足需求,如果发布了 1000 条消息,我希望有 100 个 Cloud Run 实例启动。这些 Run 实例通过推送订阅启动。问题是 PubSub 有 600 秒的确认超时。这意味着为了让 Cloud Run 处理这些消息,它们必须在 600 秒内完成。如果没有,PubSub 超时,然后再次发送,导致任务重新启动,直到第一个任务最终确认它(这会导致同一个任务多次运行)。Cloud Run 通过返回 2** HTTP 状态代码来确认消息。该文件指出

当 Cloud Run 上运行的应用完成处理请求时,容器实例对 CPU 的访问将被禁用或受到严重限制。因此,您不应启动在请求处理程序范围之外运行的后台线程或例程。

那么是否有可能通过代码确认 PubSub 请求并继续处理,而无需 Google Cloud Run 移交资源?还是有我不知道的更好的解决方案?

因为这些过程是代码/资源密集型的,所以我觉得 Cloud Functions 是不够的。我看过https://cloud.google.com/solutions/using-cloud-pub-sub-long-running-taskshttps://cloud.google.com/blog/products/gcp/how-google -cloud-pubsub-supports-long-running-workloads。但这些都没有回答我的问题。我看过谷歌云任务,这可能是什么?但是项目的其余部分是围绕 PubSub/Run/Functions 构建的,所以我最好坚持下去。

这个项目是用 Python 编写的。所以最好我想像这样编写我的 Google Cloud Run 任务:

@app.route('/', methods=['POST'])
def index():
    """Endpoint for Google Cloud PubSub messages"""
    pubsub_message = request.get_json()
    logger.info(f'Received PubSub pubsub_message {pubsub_message}')
    if …
Run Code Online (Sandbox Code Playgroud)

long-running-processes google-cloud-platform google-cloud-pubsub google-cloud-python google-cloud-run

7
推荐指数
2
解决办法
2447
查看次数