認証付きのCloud Run、Cloud Functionsにアクセスする方法

Google Cloudを使用しているとCloud Run、Cloud Functionsを使用してシステムを構築することも多いと思います。

そこで必須となる認証方法について記載します。

以下の順序で、認証付きのCloud Runについて紹介したいと思います。

Cloud Run(Cloud Functions)とは?

Google Cloud環境のフルマネージドサービスです。
コンソールから簡単に設定できて、Web画面、APIなどを簡単に作成することができます。

Cloud Functionsの第二世代は実質CloudRunで動いているようなので、
Cloud FunctionsとCloud Runは同じものとして扱います。(Cloud Runの設定が関数になっているものがCloud Functionsの認識)

Cloud Runの公式ドキュメントはこちら

Cloud Functionsの公式ドキュメントはこちら

未認証のCloud Run(Cloud Functions)作成

まずは、無料のCloud Runをコンソール画面から作成します。

コンソールのCloud Runの画面に移動してサービスを作成ボタンを押下

今回はPythonで関数を作成します。

未認証を許可を選択して、「作成」ボタンを押下します。

そうすると、上記のような画面に遷移するので「保存してデプロイ」ボタンを押下
デプロイが完了したら「保存してデプロイ」ボタンが「ソースを編集」に変わりました。

この状態でアクセスしてみましょう。

$ curl <画面上部に表示されているURL>
Hello World!

上記のような返却値があって、正常にデプロイされ、かつ特に認証を通さずともアクセス可能であることがわかります。

認証ありのCloud Runに変更

セキュリティタブに移動します。

「未認証の呼び出しを許可」から「認証が必要」に変更して「保存」ボタンを押下

※私が試したときは、画面をリロードするとラジオボタンが元に戻るなどしていたので、何度か試してみた方がいいかもしれません。(反映に時間がかかるのかもしれません。)

再度、curlでアクセスしてみると以下のような返却値に変わっており、
アクセスする権限がないことがわかります。

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/</code> from this server.</h2>
<h2></h2>
</body></html>

認証ありのCloud Runにアクセスする方法

公式ドキュメントにいくつか方法が記載されていますが、
今回は、Google Cloudの外部(ローカル環境)から、サービスアカウントキーを使用してアクセスします。

カスタムオーディエンスを設定

認証の設定をするためには、Cloud Runにカスタムオーディエンスという設定をする必要があるようです。

YAML画面に移動。

編集ボタンを押下して、「metadata」→「annotations」下に以下を追記
既に項目が存在する場合は、この手順をスキップしてください。
(通常は任意の文字列部分がCloud RunのURLになってるみたいです)

run.googleapis.com/custom-audiences: '["<任意の文字列>"]'

サービスアカウントキーを環境変数に設定

サービスアカウントキーの取得方法の公式ドキュメントはこちら

「リビジョン」タブに移動して、右側の「セキュリティ」タブの中のサービスアカウントというリンクに遷移します。

遷移したら、「キー」というタブに移動してください。

「鍵を追加」→「新しい鍵を作成」を選択します。

こんな画面になるのでJSONを選択して作成

ローカルにファイルがダウンロードされて、画面の「鍵を追加」の下に1行追加されてると思います。

適切な場所にファイルを移動したら、そのファイルパスを環境変「GOOGLE_APPLICATION_CREDENTIALS」に登録します。

Linux、Macなどなら以下のようなコマンドで登録可能かと思います。

$ export GOOGLE_APPLICATION_CREDENTIALS=<ファイルパス>

実際にアクセス

認証ありはcurlだときついので、Pythonで試します。
公式ドキュメントのサンプルコードに少し手を加えたものです。

import urllib

import google.auth.transport.requests
import google.oauth2.id_token


def make_authorized_get_request(endpoint, audience):
    """
    make_authorized_get_request makes a GET request to the specified HTTP endpoint
    by authenticating with the ID token obtained from the google-auth client library
    using the specified audience value.
    """

    # Cloud Run uses your service's hostname as the `audience` value
    # audience = 'https://my-cloud-run-service.run.app/'
    # For Cloud Run, `endpoint` is the URL (hostname + path) receiving the request
    # endpoint = 'https://my-cloud-run-service.run.app/my/awesome/url'

    req = urllib.request.Request(endpoint)

    auth_req = google.auth.transport.requests.Request()
    id_token = google.oauth2.id_token.fetch_id_token(auth_req, audience)

    req.add_header("Authorization", f"Bearer {id_token}")
    response = urllib.request.urlopen(req)

    return response.read()


res = make_authorized_get_request("<Cloud RunのURL>", "<Cloud Runに設定したオーディエンス>")print(res)

上記のPythonファイルをローカルに保存して実行

$ python <保存したファイル名>

実行結果

b'Hello World!'

正常にアクセスできていることを確認できました。

よかったらこちらの記事もどうぞ。

「認証付きのCloud Run、Cloud Functionsにアクセスする方法」への4件のフィードバック

  1. ピンバック: CloudRun - G・E・B

コメントする