[Cloud OnAir] Cloud Run Deep Dive ~ GCP で実践するモダンなサーバーレス アプリケーション開発 ~ 2019年9月12日 放送
2019 年 4 月の Google Cloud Next '19 サンフランシスコで Cloud Run が発表されてから数カ月が経ち、検討フェーズから本番環境での利用も視野に入れている方に向けて、この放送では Cloud Run を使ったサーバーレス アプリケーションを開発するための実践的な Tips を解説します。また他のサーバーレス サービスとの連携や使い分けについても説明します。
Cloud OnAir
● Linuxx86_64 ABI をサポート
● 0.0.0.0 かつ、環境変数 PORT に対してリッスン
● リクエストを受信してから 4 分以内に HTTP サーバーを起動する必要
● レスポンスタイムアウトはデフォルト 5 分 ( 最大 15 分 )
コンテナに関する決まりごと
Container
Instance
Must listen on
0.0.0.0: $PORT
App /HTTP
Server
Default response timeout:
5 mins
Must start within 4 mins
once requests come
Cloud OnAir
Cloud Runでは各コンテナインスタンスがオートスケーリングにより
増減するため、アプリケーションはステートレスであることが
推奨されている。
アプリケーションはステートレスに
Database
Key Value
Store
OR / AND
Container
Instance
App /HTTP
Server セッション情報は
DB や KVS に保存
18.
Cloud OnAir
System Call
CloudRun のコンテナインスタンスは
gVisor によりサンドボックス化されている
ため、コンテナアプリケーションからの
System Call が可能。
ただし一部の System Call は
サポートされていない可能性があるので、
その際はサポートまで。
https://gvisor.dev/docs/user_guide/compati
bility/linux/amd64/
Container
gVisor
Host
System calls
Limited system calls
Secure
isolation
}
Cloud OnAir
メッセージングサービスとの連携
Cloud Pub/ Sub から Cloud Run のサービスに対して
イベントのプッシュを行う
IAM Service A
Cloud Pub / Sub
role: "roles/run.invoker"
member: "pubsub@..."
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
認証
HTTPS
24.
Cloud OnAir
非同期処理
Cloud Tasksの HTTP タスク ハンドラとして
Cloud Run のサービスを利用する
IAM Service A
Cloud Tasks
role: "roles/run.invoker"
member: "cloudtasks@..."
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
認証
HTTPS
25.
Cloud OnAir
定期実行
Cloud Schedulerから定期的に Cloud Run のサービスを呼び出す
IAM Service A
Cloud Scheduler
role: "roles/run.invoker"
member: "cloudscheduler@..."
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
認証
HTTPS
Cloud OnAir
サービスアカウントの利用
サービスアカウントを使って他の GCPサービスへアクセス
サービスのデプロイ時に任意のサービスアカウントを指定することが可能
Service A
Container
Instance
App /HTTP
Server
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
--service-account “run-storage@...”
from google.cloud import storage
storage_client - storage.Client()
Bucket =
storage_client.get_bucket(BUCKET_NAME)
app.py
Cloud Storage 等
他の GCP サービス
デフォルトのサービスアカウントはCompute
Engine のデフォルトサービス
アカウント
API
28.
Cloud OnAir
別の CloudRun サービスへのアクセス
Service A
Cloud Run から他の Cloud Run サービスを呼び出す場合も IAM 認証を利用可能
メタデータサーバーから ID トークンを入手し、ヘッダーに付けてリクエスト
Container
Instance
App /HTTP
Server
app.py
IAM
Service B
token_response = get(token_request_url,
headers=token_request_headers)
jwt = token_response.content.decode("utf-8")
receiving_service_headers =
{'Authorization': 'bearer {}'.format(jwt)}
response = get(receiving_service_url,
headers=receiving_service_headers)
HTTPS
29.
Cloud OnAir
Cloud SQLへの接続
Service A
アプリケーションから UNIX ソケット経由で Cloud SQL Proxy へ接続可能
第2世代の MySQL インスタンス or PostgreSQL インスタンス を推奨
Container
Instance
App / HTTP
Server
import MySQLdb
db =
MySQLdb.connect(unix_socket=‘/cloudsql
/[CONNECTION NAME]’,
user=CLOUDSQL_USER,
passwd=CLOUDSQL_PASSWD)
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
--add-cloudsql-instances INSTANCE-ID
Cloud SQL
app.py
30.
Cloud OnAir
シークレット管理
現在 CloudKMS は Cloud Run を直接的にサポートしていない
予めKMSで暗号化したシークレットを Cloud Storage に保存し、
必要時にダウンロードして復号化する方法がワークアラウンドとして
利用できる。
Cloud Run Cloud Storage
Cloud KMS
① 暗号化されたシークレットを取得
② 暗号化されたシークレットを復号化
③ App が復号化した
シークレットを利用
31.
Cloud OnAir
シークレット管理 ~Berglas
Berglas を使うことでアプリケーション自体から Cloud Storage や Cloud KMS へ
のアクセスやシークレットのハンドリングロジックを排除し、
シークレット管理をシンプルに行うことが可能に
Cloud Run Cloud Storage
Cloud KMS
① 暗号化されたシークレットを取得
② 暗号化されたシークレットを復号化
③ App が復号化した
シークレットを利用
Berglas でラップ