はじめに
Cloud FunctionsからリブランドされたCloud Run Functionsを,Terraformを用いて利用した際,少しトリッキーなことをしたので記載します.おそらく今後対応されるかと思います.
Cloud FunctionsがCloud Runに統合されたことにより,Direct VPC Egressを使用したVPC接続をすることができるようになりました.
リブランディングにより,Cloud Runの持つ以下の特徴を活用できるようになりました.
- Direct VPC Egressによるプライベートネットワーク接続
- リクエスト駆動型の自動スケーリング
個人的には,従来のCloud Run ServiceとCloud Functionsのいいとこ取りをした印象です.
お題
今回は,内部接続のみを許可したCloud Run Serviceに,Cloud Run Functionsがアクセスするケースを想定します.このとき,Cloud Run FunctionsがDirect VPC Egress経由でアクセスする場合を考えます.構成図としては以下です.
※コンソール上では簡単に実現可能
コンソール上で,Cloud Run Functionsで,Direct VPC Egressを有効にすることは簡単に実現できます.
Terraformはまだ非対応
コンソール上で,上記の構成を実現することは容易にできました.しかし,これをTerraformに書き起こす際,少しひねりを加えなければ実現できませんでした.Direct VPC Egressに接続する設定が,まだTerraformにはリリースされておりませんでしたので,Terraform実行の内部でgcloudコマンドを実行するようにしています.
resource "null_resource" "function-1-vpc-egress" {
depends_on = [module.cloud_function_v2]
triggers = {
detached = "false"
reapply = module.cloud_function_v2.function_uri
}
provisioner "local-exec" {
command = <<-EOT
gcloud beta run services update ${var.function_name} \
--network=${var.network_name} \
--subnet=${var.direct_subnet_name} \
--network-tags=function-1 \
--vpc-egress all-traffic \
--region ${var.region}
EOT
}
}
結果
内部接続のみを許可したCloud Runに対して,Cloud Run Functions経由でリクエストを投げることで,下記のようにレスポンスを受け取ることができました.
curl -X GET https://asia-northeast1-${project_id}.cloudfunctions.net/function-v2
{"response":{"backend_status":"ok"},"status":"success"}
まとめ
Cloud Run FunctionsとDirect VPC Egressを組み合わせたアーキテクトを構築する際,Terraformでは少しひねりを加える必要がありました.将来的には以下のようなパラメータが対応されると予想しています.
resource "google_cloudfunctions2_function" "v2" {
vpc_access{
egress = "ALL_TRAFFIC"
network_interfaces {
network = "default"
subnetwork = "default"
tags = ["tag1", "tag2", "tag3"]
}
}
}
今回使用したコードはこちらに公開しています.