gpt4 book ai didi

python-3.x - 如何使用 Google Cloud Function 将文件从 Cloud Storage 存储桶推送到实例中?

转载 作者:行者123 更新时间:2023-12-01 09:12:54 24 4
gpt4 key购买 nike

我有一个任务分配给我,想办法在 GCP 中设置一个云功能,它执行以下操作:

  • 监控 Google Cloud Storage 存储桶中的新文件
  • 当它检测到存储桶中的新文件时触发
  • 将该文件复制到计算实例 (Ubuntu) 内的目录

  • 我一直在做一些研究,结果是空的。我知道我可以轻松地设置一个 cron 作业,每分钟同步一次存储桶/目录或类似的东西,但是我们正在构建的系统的设计理念之一是关闭触发器而不是计时器。

    我问的可能吗?

    最佳答案

    您可以 trigger a Cloud Function from a Google Cloud Storage bucket ,并选择事件类型为 完成/创建 ,每次在存储桶中上传文件时,都会调用 Cloud Functions 函数。

    每次在存储桶中创建新对象时,云函数都会收到一条通知,其中包含 Cloud Storage object format .

    现在,进入第二步,我找不到任何可以将文件从 Cloud Storage 上传到实例 VM 的 API。但是,我做了以下解决方法,假设您的实例 VM 配置了一个可以接收 HTTP 请求的服务器(例如 Apache 或 Nginx):

    main.py

    import requests
    from google.cloud import storage

    def hello_gcs(data, context):
    """Background Cloud Function to be triggered by Cloud Storage.
    Args:
    data (dict): The Cloud Functions event payload.
    context (google.cloud.functions.Context): Metadata of triggering event.
    Returns:
    None; the file is sent as a request to
    """
    print('Bucket: {}'.format(data['bucket']))
    print('File: {}'.format(data['name']))

    client = storage.Client()
    bucket = client.get_bucket(data['bucket'])
    blob = bucket.get_blob(data['name'])

    contents = blob.download_as_string()

    headers = {
    'Content-type': 'text/plain',
    }

    data = '{"text":"{}"}'.format(contents)
    response = requests.post('https://your-instance-server/endpoint-to-download-files', headers=headers, data=data)
    return "Request sent to your instance with the data of the object"

    要求.txt
    google-cloud-storage
    requests

    最有可能的是,最好将对象名称和存储桶名称发送到您的服务器端点,然后从那里使用 Cloud Client Library 下载文件。 .

    现在你可能会问...

    如何制作 Compute Engine 实例来处理请求?
  • 创建 Compute Engine 实例虚拟机。确保它与云函数位于同一区域,并在创建它时允许 HTTP 连接到它。 Documentation .我用了 debian-9此测试的图像。
  • SSH 进入实例,并运行以下命令:
  • 安装apache服务器
    sudo apt-get update
    sudo apt-get install apache2
    sudo apt-get install libapache2-mod-wsgi
  • 也安装这个 python 库:
    sudo apt-get install python-pip
    sudo pip install flask
  • 为您的应用程序设置环境:
    cd ~/
    mkdir app
    sudo ln -sT ~/app /var/www/html/app

  • 最后一行应该指向 apache 从中提供 index.html 文件的文件夹路径。
  • /home/<user_name>/app 创建您的应用程序:

  • main.py
    from flask import Flask, request
    app = Flask(__name__)

    @app.route('/', methods=['POST'])
    def receive_file():
    file_content = request.form['data']
    # TODO
    # Implement process to save this data onto a file
    return 'Hello from Flask!'

    if __name__ == '__main__':
    app.run()
  • 在同一目录中创建 wsgi 服务器入口点:

  • main.wsgi
    import sys
    sys.path.insert(0, '/var/www/html/app')

    from main import app as application
  • 将以下行添加到 /etc/apache2/sites-enabled/000-default.conf , 在 DocumentRoot 之后标签:
        WSGIDaemonProcess flaskapp threads=5
    WSGIScriptAlias / /var/www/html/app/main.wsgi

    <Directory app>
    WSGIProcessGroup main
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
    </Directory>
  • 运行 sudo apachectl restart .您应该能够将 post 请求发送到您的应用程序,发送到 VM 实例的内部 IP(您可以在控制台的 Compute Engine 部分中看到它)。一旦你有了它,在你的云函数中,你应该将响应行更改为:
    response = requests.post('<INTERNAL_INSTANCE_IP>/', headers=headers, data=data)

    return "Request sent to your instance with the data of the object"
  • 关于python-3.x - 如何使用 Google Cloud Function 将文件从 Cloud Storage 存储桶推送到实例中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54291722/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com