無料で取得したドメインをCloud Load BalancingのIPに紐づけてIAPを使用してCloud Runにアクセス制限をかける
はじめに
Identity-Aware Proxy(IAP)を使用してCloud Runに許可されたGoogleアカウントだけがアクセスできるように、制限をかける方法と、無料で取得したドメインをCloud Load BalancingのIPに紐づける方法を紹介します。
参考にさせていただいた記事はこちら。
無料ドメイン取得
まずはCloud Load Balancingの設定で必要になるドメインを取得します。当初、無料ドメインを取得するのに、Freenomを使用しようと思っていましたが、どうやらMetaに訴えられて新規ドメイン登録の受け付けを停止しているようです。(2023/07/16現在)
そのため今回は、Freenomの代わりにDynamic DO!.jpで無料ドメインを取得します。
登録からドメインの取得方法はこちらを参考にしてください。
Cloud Runサービスの作成
GCPからCloud Runサービスを作成します。
-
既存のコンテナ イメージから 1 つのリビジョンをデプロイするを選択し、サンプルコンテナでテストをクリックしてテスト用のコンテナイメージをデプロイします。

-
サービス名の入力とリージョンの選択を行います。

-
Ingress の制御で「内部」を選択し、「外部 HTTP(S) ロードバランサからのトラフィックを許可する」にチェックを入れます。
これによりCloud Runへの内部アクセスのみを許可するようにします。

-
認証で「認証が必要」を選択して、作成をクリックします。
これにより内部アクセスでも認証が必要になります。

HTTPSロードバランサの設定
IAPを使用するためには、HTTPSロードバランサの設定が必要になります。
-
ロードバランサの作成をクリックし、
アプリケーション ロードバランサ(HTTP/S)から構成を開始をクリックします。

-
「グローバル / リージョン」の
グローバル外部アプリケーション ロードバランサを選択して、続行をクリックします。

-
新規のプロジェクトを作成後にロードバランサを作成しようとした際に以下のように表示され、作成できない場合があります。

-
この場合一度、「グローバル / リージョン」の
従来のアプリケーション ロードバランサを選択して、続行をクリックします。

-
Compute Engine APIの有効化する画面が表示されるため
有効にするをクリックします。

-
Compute Engine APIの有効化後に再度、ロードバランサ作成画面に戻り「グローバル / リージョン」の
グローバル外部アプリケーション ロードバランサを選択して、続行をクリックすることで次に進めます。
-
フロントエンドの構成
-
フロントエンドの構成をクリックし名前を入力します。ついでにロードバランサの名前も入力しておきます。

-
プロトコルを
HTTPSに変更し、IP addressからIP アドレスを作成をクリックします。

-
「証明書」から
新しい証明書を作成をクリックして、証明書を作成します。
名前を入力、作成モードにGoogleマネージドを選択し、ドメイン名に先ほどDynamic DO!.jpで取得したドメインを入力します。

-
完了をクリックしてフロントエンドの構成を完了します。
バックエンドの構成
-
バックエンドの構成をクリックし、
バックエンドサービスを作成をクリックします。

-
名前を入力し、バックエンド タイプはCloud Runを使用したいので、
サーバーレス ネットワークエンドポイント グループを選択します。

-
「バックエンド」からサーバーレス ネットワークエンドポイント グループを作成します。

-
名前を入力し、リージョンをCloud Runで指定したリージョンと同じにします。
Cloud Runにチェックを入れて、「サービス」に先ほど作成したCloud Runのサービスを選択します。作成をクリックして元の画面に戻ります。

-
Cloud CDNは後にIAPを有効に際にエラーになるため、チェックを外しておきます。

-
作成をクリックしてバックエンドの構成を完了します。
ロードバランサの作成と確認
-
作成をクリックしてロードバランサの作成を完了します。今回は「ルーティングルール」は設定しません。
DNSのゾーン作成
-
ロードバランサが作成できたら、ロードバランサの詳細画面に移動し、「IP:ポート」からIPアドレスをコピーしておきます。

-
Cloud DNSに移動し、ゾーンの作成をします。APIが有効になっていない場合は有効にしてください。
-
ゾーン名を入力し、ドメイン名にDynamic DO!.jpで取得したドメインを入力します。
「DNSSEC」をオンにして作成をクリックします。

-
ゾーンの作成が完了したら、
標準を追加をクリックしてAレコードとドメインを紐付けます。

-
IPv4アドレス1に先ほどロードバランサで作成されたIPアドレスを入力します。
「IPアドレスの選択」からも選択できます。

-
作成をクリックしてゾーンの作成を完了します。
IPアドレスの更新
ロードバランサで作成されたIPアドレスをDNSに反映させるために、Dynamic DO!からIPアドレスを更新します。
-
サービス状態ページにアクセスし、
IPアドレスにロードバランサで作成されたIPアドレスを入力しIPアドレス更新をクリックします。
IAPの有効化
-
作成したロードバランサで IAP を使用できるようにIAPの有効化をします。APIが有効になっていない場合は有効にしてください。

-
初回はOAuth同意画面の構成が必要なので、
OAuth同意画面の構成をクリックします。

-
外部にチェックを入れて作成をクリックします。

-
アプリ名、ユーザーサポートメールアドレス、デベロッパーの連絡先情報を入力します。
-
他には特に入力せず、スコープ→テストユーザー→概要で進めて構成を完了します。
詳しい設定は以下を参照してください。
https://cloud.google.com/iap/docs/enabling-compute-howto?hl=ja#oauth-configure -
Identity-Aware Proxyの画面に戻り、
IAPのトグルをオンにして有効にします。


IAMでの権限付与
現在IAPが作成されたアカウントにはCloud Runを実行できる権限がないので権限を付与します。
OAuth認証されたユーザのアクセス許可
- 「Identity-Aware Proxy」にアクセスし、
プリンシパルのを追加からIAPアクセスを許可したいGoogleアカウントかGoogleグループ等を指定して、IAMロール(IAP-secured Web App User)を付与します。
Cloud Run実行権限を付与
IAPが作成したアカウントがCloud Runを実行できるようにするために、Cloud Run 起動元(Cloud Run Invoker)のロールを付与します。
IAPが作成したサービスアカウントのプリンシパル名は以下のような形式になっています。
service-<プロジェクト番号>@gcp-sa-iap.iam.gserviceaccount.com
-
Cloud Runのコンソールに移動し、作成したhelloサービスを選択して
プリンシパルを追加から権限を付与します。

-
「新しいプリンシパル」に先ほどのIAPサービスアカウントのプリンシパル名を入力します。
※完全なプリンシパル名を入力しないと選択肢に出てこないので注意してください。
ロールにCloud Run 起動元を選択して保存をクリックします。

動作確認
-
ブラウザから
https://<ドメイン名>にアクセスすると、Google アカウントのログイン画面が表示されるようになります。
IAP-secured Web App User ロールを付与したユーザーでログインします。

-
ログイン後にデモコンテナの画面が表示されたら成功です。

最後に
Identity-Aware Proxy(IAP)を使用してCloud Runに制限をかける方法と、無料で取得したドメインをCloud Load BalancingのIPに紐づける方法を紹介しました。
誤っている点や、もっと良い方法があればご指摘いただけると幸いです。
Discussion