2019 年 4 月の Google Cloud Next '19 サンフランシスコで Cloud Run が発表されてから数カ月が経ち、検討フェーズから本番環境での利用も視野に入れている方に向けて、この放送では Cloud Run を使ったサーバーレス アプリケーションを開発するための実践的な Tips を解説します。また他のサーバーレス サービスとの連携や使い分けについても説明します。
15. Cloud OnAir
● Linux x86_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
17. Cloud OnAir
Cloud Run では各コンテナインスタンスがオートスケーリングにより
増減するため、アプリケーションはステートレスであることが
推奨されている。
アプリケーションはステートレスに
Database
Key Value
Store
OR / AND
Container
Instance
App /HTTP
Server セッション情報は
DB や KVS に保存
18. Cloud OnAir
System Call
Cloud Run のコンテナインスタンスは
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
}
20. Cloud OnAir
HTTPS によるアクセス
Service A
https://servicea-q6vo4odwpq-an.a.run.app
サービスを新規デプロイすると
FQDN と SSL 証明書が割り当てられ、HTTPS でアクセス可能
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
21. Cloud OnAir
IAM による認証
IAM Service A
認証
デフォルトで IAM によるアクセス認証が有効
role: "roles/run.invoker"
member: "cloudtaro@..."
Header:
"Authorization: bearer ID_TOKEN"
$ gcloud beta run deploy servicea
--image gcr.io/cloudrun/hello
HTTPS
23. 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
27. 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
別の Cloud Run サービスへのアクセス
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
シークレット管理
現在 Cloud KMS は 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 でラップ
33. Cloud OnAir
Concurrency
Concurrency とは同時の 1 つの Container Instance に投げられる
リクエストの最大数
Google Cloud Functions など一般的な FaaS は
一度に1つのリクエストしかハンドルできない。
なので "concurrency = 1".
Cloud Run の場合、 concurrency の値を 1 から 80 まで設定できる
(default: 80) ので、1 つの コンテナインスタンス で同時に
複数のリクエストを処理することが出来る
最適な Concurrency 値は実装に依存するので、
本番利用前に十分に検証し確認する必要がある
Service A v1
concurrency = 1
Service A v2
concurrency = 20
34. Cloud OnAir
オートスケーリング
Cloud Run ではリクエスト数に応じて特に明示的に設定を
していなくてもオートスケーリングを行う
リクエストがしばらく (体感 5 分) 無い場合、コンテナインスタンスが 0 になる
Service A
繁忙期
Service A
リクエストがない時間帯
コンテナインスタンス
のデフォルト最大数は
1000