概要
cloud runを使ってアプリのバックエンドを構築しており、外部サービスのweb hookを受けつることになりました。
runのセキュリティをガバガバにしたままだと怖くて眠れないのでcloud armerでバリデーションして安心して眠れるようにするためにcloud load balancingを設定したのでその共有です
大まかな手順
- cloud runを構築
- cloud domainsで独自ドメイン取得
- cloud load balancingを設定
a. cloud domainsで契約したドメインのレコードにIPを登録
コツ: 一発で全クリできる天才以外は、ハマったときにどこが原因か分からなくなるので1サービスづつ丁寧に疎通を確認した方が吉です
cloud runの構築
→ 「サンプルコンテナでテスト」というボタンをクリック
dockerのイメージやらgcloudでのイケてるデプロイやらの解説をする気力がないので今回は、cloud runコンソール画面の「サービスを作成」ボタンから「サンプルコンテナでテスト」という神ボタンから疎通確認用のrunを作成します
一つだけ注意点がありこの疎通確認用のコンテナを作るときは、「認証」の箇所で「未認証の呼び出しを許可」をクリックしてセキュリティをガバガバにしてください(本番ではダメ!ゼッタイ)
python使ってる同士は、jupyterから下記実行したら確認できます。ステータスコードが200だったらrunはおkです!
import requests
# 僕のが作ったサンプル: https://hello-z2bmqu5rca-uc.a.run.app
run_url = f"{今回作成したrunのurl}"
res = requests.get(run_url)
assert res.status_code == 200, "なんか間違えてるよ"
print("status_code:", res.status_code)
print(res.text[:100])
cloud domainsで独自ドメイン取得
特にこだわりがなければ、同じサービスなのでレコード追加時などにレコメンドが出てきたりして楽ちんです
cloud load balancingの設定
コンソールの画面上部の「ロードバランサの作成」ボタンから作ります
「アプリケーション ロードバランサ(HTTP/S)」の項目の「構成を開始」をクリック
フロントエンドの構成のところは、「今回はrunでバックだけやけん、いらんやん」と思うけどここ飛ばしたら利用できないの刑になります。
プロトコルは「HTTPS」を選択(最初は「HTTP」)して証明書のところで「新しい証明書を作成」をクリック
名前とか適当に決めて作成モードで「Googleマネージドの証明書を作成する」をクリックして、下の方の「ドメイン」にcloud domainsで契約したドメインを入力してあとはデフォルトでおk
次はバックエンドの構成で、「バックエンドサービスを作成」をクリック
バックエンドタイプを「サーバーレス ネットワーク エンドポイント グループ」にして(最初は「インスタンス グループ」)、新しいバックエンドのところは、最初にこしらえたcloud runを選択
あとは画面下部の作成をクリックして初期作成は終わりです
その後ロードバランシグのトップ画面で今回作ったロードバランシグを選択します
フロントエンドの箇所の「HTTPS」の欄のよこのIPを覚えます(cloud domainsじゃない人はコピー)
cloud DNSサービス(cloud domainsではないですよ!)のドメイン詳細画面に行きます
DNS名空白で、他の選択項目をデフォルト(僕のスクショ通り)で「IP」アドレスの選択から先程、覚えたIPを選択して「作成」でおk
別のドメインサービスでドメイン契約した方は、そのサービスのDNS設定画面からAレコードタイプでDNS名には「@」を入れて今回のIPを入力したらいけます。ちなみにポート番号は不要です
# ↓の「:433」がポート番号
192.0.0.11:443
あとは、お茶かコーヒーを入れてタイマーを30分設定してYouTubeでも見ながら、待機して30分くらいたったら、ロードバランサの詳細画面に戻ってきて「証明書」の箇所をクリックします
スクショのように、「ACTIVE」となっていたら、成功でそれ以外は失敗になります。
失敗になる原因としては、下記が考えられます。
特に、「IPの前後に空白が入るなんてありえない」と考えると思いますが過信はNGです
- 変なドメインサービスの利用
- DNS登録時にIPの前後に空白が入ってる
- 運が悪い
- 日頃の行いが悪い
おまけ
ここまで設定したら、cloud armerも設定したいと思うので、いくつか僕が知っていることを共有します。設定自体は簡単なので省略します
部分一致で一部のリクエストを受け付けたり除外したりするときの構文
request.path.matches(r"/index.*")
右側の優先度の数値が小さい順にバリデーションされて該当するアクションがあったら後続のアクションは処理されないです。
バックのテストの続きしないと怒られるので本日はこのへんで終わり^^