Google Cloud Functionを使用して、ファイルをCloud Storageバケットからインスタンスにプッシュするにはどうすればよいですか?

カム

次のことを行うGCPでクラウド機能を設定する方法を考えるタスクが割り当てられました。

  • Google CloudStorageバケットで新しいファイルを監視します

  • バケット内の新しいファイルを検出するとトリガーされます

  • そのファイルをComputeInstance(Ubuntu)内のディレクトリにコピーします

私はいくつかの調査を行っていて、空っぽになっています。バケット/ディレクトリを毎分同期するcronジョブなどを簡単に設定できることは知っていますが、私たちが構築しているシステムの設計哲学の1つは、タイマーではなくトリガーをオフに操作することです。

私が求めていることは可能ですか?

ジョアン・グラウ・ノエル

Google Cloud Storageバケットからクラウド関数トリガーできます。イベントタイプを[ファイナライズ/作成]選択すると、ファイルがバケットにアップロードされるたびに、クラウド関数が呼び出されます。

バケットに新しいオブジェクトが作成されるたびに、クラウド関数はCloudStorageオブジェクト形式の通知を受け取ります

次に、2番目のステップで、CloudStorageからインスタンス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"

Requirements.txt

google-cloud-storage
requests

ほとんどの場合、オブジェクト名とバケット名をサーバーエンドポイントに送信し、そこからクラウドクライアントライブラリを使用してファイルをダウンロードすることをお勧めします

今、あなたは尋ねるかもしれません...

リクエストを処理するComputeEngineインスタンスを作成するにはどうすればよいですか?

  1. ComputeEngineインスタンスVMを作成します。クラウド関数と同じリージョンにあることを確認し、作成するときにHTTP接続を許可します。ドキュメントdebian-9このテストに画像を使用しました

  2. インスタンスに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
      
  3. アプリケーションの環境をセットアップします。

    cd ~/
    mkdir app
    sudo ln -sT ~/app /var/www/html/app
    

最後の行は、apacheがindex.htmlファイルを提供するフォルダーパスを指している必要があります。

  1. でアプリを作成します/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()
  1. 同じディレクトリにwsgiサーバーエントリポイントを作成します。

main.wsgi

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

from main import app as application
  1. タグの/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>
    
  2. 実行しますsudo apachectl restartアプリケーション、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"
    

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Ansibleで複数行のシェルスクリプトを実行する方法

  3. 3

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  4. 4

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  5. 5

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  6. 6

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  7. 7

    パンダは異なる名前の列に追加します

  8. 8

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  9. 9

    グラフ(.PNG)ファイルをエクスポートするZabbix

  10. 10

    Chromeウェブアプリのウェブビューの高さの問題

  11. 11

    ラベルとエントリがpythontkinterに表示されないのはなぜですか?

  12. 12

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  13. 13

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  14. 14

    Reactでclsxを使用する方法

  15. 15

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

  16. 16

    テキストフィールドの値に基づいて UIslider を移動します

  17. 17

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  18. 18

    MLでのデータ前処理の背後にある直感

  19. 19

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  20. 20

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  21. 21

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

ホットタグ

アーカイブ