次のことを行う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インスタンスを作成するにはどうすればよいですか?
ComputeEngineインスタンスVMを作成します。クラウド関数と同じリージョンにあることを確認し、作成するときにHTTP接続を許可します。ドキュメント。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()
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
。アプリケーション、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]
コメントを追加