イベント運営会社の会場設営作業の割り振りと完了確認
架空のイベント運営会社が、会場設営の作業を現場責任者が登録して割り振り、設営スタッフがスマートフォンで完了を記録する業務を支えます。画面とAPIはCloud Runで動き、APIはServerless VPC Accessコネクタを通じて、Memorystore for RedisとCloud SQLにプライベートIPで接続します。画面とAPIは認証なしで公開され、Redisの通信の暗号化は無効の設定です。業務の想定はIceShoreが用意した架空の事例です(実在の会社・システムではありません)。 出典: https://github.com/GoogleCloudPlatform/terraform-google-three-tier-web-app/tree/69885ccd8aaa9b2e9ab2307fbe6b7242aa1a2b17 (著作権表示: Copyright 2021 Google LLC/ライセンス: Apache License 2.0)。元のファイルを変更せずに掲載しています。ライセンスの全文は、同梱のTHIRD_PARTY_NOTICES.yamlにあります。
アクター
ユースケース
- 設営スタッフによる作業画面の表示
- 設営スタッフによる担当作業の確認と完了の記録
- 現場責任者による作業の登録と割り振り
この構成図は、架空のイベント運営会社で、会場設営の作業を管理する業務を支えます。現場責任者が作業を登録して割り振り、設営スタッフがスマートフォンで完了を記録します。作業画面と作業を扱うAPIは、Google CloudのCloud Runで動きます。APIはServerless VPC Accessコネクタを通して、2つの保存先にプライベートIPで接続します。読み取りのキャッシュに使うMemorystore for Redisと、Cloud SQL(既定はPostgreSQL 14)です。業務の想定はIceShoreが用意した架空の事例です。元にしたのは、GoogleCloudPlatform/terraform-google-three-tier-web-app(Apache-2.0)にある、Terraformで書かれたTodoアプリです。
作業画面と作業の記録を支えるリソースと流れ
設営スタッフのスマートフォンのブラウザは、まずCloud Runのフロントエンドサービス(fe、コンテナポート80)から静的なHTML/JS/CSSを読み込みます。次に、ブラウザ上のJavaScriptが、Cloud RunのAPIサービス(api)を直接呼び出します。呼び出し先となるapiのURLは、feに環境変数ENDPOINTとして渡されています。この想定では、元のテンプレートのTodoの項目を、設営の作業1件として扱います。
apiにはvpc-access-egress=allを設定しています。そのため、apiからの送信はすべて、Serverless VPC Accessコネクタ(10.8.0.0/28)を経由してプライベートネットワークへ向かいます。その先にあるのは、次の2つです。 ・Memorystore for Redis:Basicティア、1GB、Redis 6.x、ポート6379。 ・Cloud SQL:既定はPostgreSQL 14、ポート5432、プライベートIPのみ。
2つのCloud Runサービスは、どちらもallUsersにroles/run.invokerを付与しており、認証なしで公開されています。また、Redisの通信の暗号化(transit_encryption_mode)はDISABLEDに設定されています。
設営スタッフと現場責任者のユースケース
この構成図には、3つのユースケースがあります。
1つ目の「設営スタッフによる作業画面の表示」では、設営スタッフが当日の朝、スマートフォンのブラウザからfeサービスにHTTPSでアクセスします。feは静的なHTML/JS/CSSを返すだけで、データは保存しません。
2つ目の「設営スタッフによる担当作業の確認と完了の記録」では、ブラウザのJavaScriptがapiサービスをHTTPSで呼び出します。設営スタッフは自分の担当作業の一覧を確かめ、終わった作業に完了の印を付けます。一覧を読むとき、APIはまずRedisを参照します。Redisに無いときと記録を書き込むときは、Cloud SQLのtodoデータベースにアクセスします。
3つ目の「現場責任者による作業の登録と割り振り」も同じapiを通ります。現場責任者が前日までに作業を登録してスタッフに割り振り、当日は遅れている作業を別のスタッフに付け替えます。
なお、スタッフ150人・現場責任者10人、1回のイベントで100〜300件の作業といった数は、この架空の業務に合わせて置いた想定の値です。IaCには書かれていません。
元のIaC(ファイルと主なリソースの型)
出典は、https://github.com/GoogleCloudPlatform/terraform-google-three-tier-web-app(コミット69885ccd8aaa9b2e9ab2307fbe6b7242aa1a2b17、ライセンスApache-2.0)です。対象ファイルはmain.tfとvariables.tfです。
main.tfの主なリソースの型は、次のとおりです。 ・google_cloud_run_service(apiとfe) ・google_cloud_run_service_iam_member(未認証での公開) ・google_vpc_access_connector ・google_redis_instance ・google_sql_database_instance/google_sql_database/google_sql_user ・google_compute_network/google_compute_global_address/google_service_networking_connection(Cloud SQLのプライベート接続用のVPCピアリング) ・google_service_account/google_project_iam_member ・time_sleep/random_id このほか、APIを有効化するproject_servicesモジュールも使っています。
variables.tfでは、次の変数を定義しています。 ・project_id ・region(既定はus-central1) ・zone(既定はus-central1-a) ・deployment_name(既定はthree-tier-app) ・database_type(mysqlまたはpostgresql、既定はpostgresql) ・labels ・enable_apis ・run_roles_list(既定はroles/cloudsql.instanceUserとroles/cloudsql.client)
この構成図の作り方と、業務の想定について
この構成図は、公開リポジトリのIaC(main.tfとvariables.tf)をもとに作成しました。AIがIceShore(アイスショア)のMCP(Model Context Protocol)を通して構成図の記述(ADL)を書き、それをIceShoreが描画しています。ADLでは、各ユースケースの入口・通信経路・保存先を、main.tfのリソース(api、fe、google_vpc_access_connector.main、google_redis_instance.main、google_sql_database_instance.main)に結び付けています。
元のテンプレートは、利用者がTodoを参照・登録・更新・削除する汎用の三層Webアプリです。イベント運営会社の会場設営という業務の想定、設営スタッフと現場責任者、人数や件数は、IaCには書かれていません。そこで、IceShoreが用意した架空の事例としてADLに書き加えています。実在の会社やシステムではありません。
よくある質問
Cloud RunのAPIから、RedisとCloud SQLにはどのように接続していますか?
apiサービスには、vpc-access-connectorとvpc-access-egress=allのアノテーションが設定されています。そのため、Serverless VPC Accessコネクタを経由してプライベートネットワークに接続します。 ・Redis:connect_mode=DIRECT_PEERINGで、そのネットワークに接続しています。 ・Cloud SQL:ipv4_enabled=falseで、Service NetworkingのVPCピアリング(/16の内部アドレス範囲)を通じたプライベートIPのみを持ちます。
database_typeをmysqlにすると、何が変わりますか?
IaC上では、次の点が切り替わります。 ・データベースのバージョンがMYSQL_8_0になります。 ・APIのイメージがtodo-apiになります。 ・DBユーザーが、パスワード方式のfooになります。 ・APIの環境変数が、MySQL用の組み合わせになります。 なお、PostgreSQLのときだけ設定されるcloudsql.iam_authenticationフラグと、IAMサービスアカウントによるDBユーザーは使われません。この構成図は、既定のPostgreSQL(ポート5432)の場合で描いています。
作業画面は、どうやってAPIの場所を知るのですか?
feサービスのコンテナに、環境変数ENDPOINTとしてapiサービスのURL(google_cloud_run_service.api.status[0].url)が渡されています。ブラウザ上のJavaScriptは、このURLのAPIを直接呼び出します。
出典: GoogleCloudPlatform/terraform-google-three-tier-web-app(Apache-2.0)
IaC を読み込むと、あなたのシステムでもこのような構成図を作れます。 IceShore とは