呼び出しの認証
関数でその他の管理アクションを作成、更新、実行するには、適切なロールを持つプリンシパルが必要です。詳しくは、IAM を使用したアクセスの承認をご覧ください。
ただし、関数の呼び出しはより複雑なイベントになる場合があります。イベント ドリブン関数を呼び出すことができるのは、関数が登録されているイベントソースだけですが、HTTP 関数は、異なる場所で発生するさまざまな種類の ID によって呼び出すことができます。呼び出し元は、関数やその関数を使用したい別の関数またはサービスをテストするデベロッパーである可能性があります。デフォルトでは、これらの ID は、自身を認証するためのリクエストとともに ID トークンを提供する必要があります。また、使用するアカウントに適切な権限が付与されている必要もあります。
ID トークンなしの未認証アクセスは可能ですが、有効にする必要があります。詳しくは、IAM を使用したアクセスの承認をご覧ください。
デベロッパー テストの認証
デベロッパーは、関数を作成、更新、削除するためのアクセス権が必要になります。また、アクセス権は通常の(IAM)プロセスを使用して付与されます。
ただし、デベロッパーは、テスト目的で関数を呼び出す必要がある場合もあります。curl
などのツールを使用して関数を呼び出すには、次の操作を行う必要があります。
Cloud Functions へのアクセスに使用しているユーザー アカウントに、
cloudfunctions.functions.invoke
権限を含むロールを割り当てます。デフォルトでは、Cloud Functions 管理者と Cloud Functions デベロッパーのロールにこの権限が含まれています。ロールとそれに関連する権限の詳細については、Cloud Functions IAM ロールをご覧ください。ローカルマシンから作業している場合は、Google Cloud CLI を初期化してコマンドライン アクセスを設定します。次のコマンドを実行して、ユーザー アカウントの鍵をローカルマシンにダウンロードします。ここで、
gcloud
コマンドを実行して鍵を確認できます。gcloud auth login --update-adc
リクエストに、
Authorization
ヘッダーに保存されている Google 生成の ID トークンとして認証情報を指定します。たとえば、次のようにgcloud
でトークンを取得します。curl -H "Authorization: bearer $(gcloud auth print-identity-token)" \ https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
通常どおり、関数の開発と使用に必要な最小限の権限セットを割り当てることをおすすめします。関数の IAM ポリシーは、必要最小限のユーザーとサービス アカウントに限定してください。
関数呼び出しに対する関数の認証
複数の関数を接続するサービスをビルドする場合は、それぞれの関数が他の関数の特定のサブセットにのみリクエストを送信できるようにすることをおすすめします。たとえば、login
関数の場合、user profiles
関数へのアクセスは許可しますが、search
関数へのアクセスは許可しません。
特定の呼び出し側関数からのリクエストを受信するように受信側関数を構成するには、受信側の関数で、呼び出し側関数のサービス アカウントに Cloud Functions 起動元(roles/cloudfunctions.invoker
)ロールを付与する必要があります。
コンソール
Google Cloud コンソールに移動します。
受信側関数の横にあるチェックボックスをオンにします。
画面の上部の [権限] をクリックします。[権限] パネルが開きます。
[プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、呼び出し側関数の ID を入力します。これはサービス アカウントのメールアドレスです。
[役割を選択] プルダウン メニューから Cloud Functions > Cloud Functions 起動元 役割を選択します。
[保存] をクリックします。
gcloud
gcloud functions add-iam-policy-binding
コマンドを使用します。
gcloud functions add-iam-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY' \ --role='roles/cloudfunctions.invoker'
ここで、RECEIVING_FUNCTION
は受信側関数の名前、CALLING_FUNCTION_IDENTITY
は呼び出し側関数の ID(サービス アカウントのメールアドレス)です。
この呼び出し側関数は受信側関数を呼び出すため、認証用に Google によって署名された ID トークンも備えている必要があります。これには、次の 2 つの手順を行います。
audience フィールド(
aud
)に受信側関数の URL を設定して、Google によって署名された ID トークンを作成します。関数に対するリクエストの
Authorization: Bearer ID_TOKEN
ヘッダーに ID トークンを含めます。
このプロセスを管理する最も簡単かつ信頼性の高い方法は、以下に示すように認証ライブラリを使用してこのトークンを生成し、適用することです。
プログラムによるトークンの生成
次のコードを使用して ID トークンを生成できます。このコードは、ライブラリが認証情報を取得できる環境で動作します。これには、ローカルのアプリケーションのデフォルト認証情報をサポートする環境も含まれます。
Node.js
Python
Go
Java
手動でのトークンの生成
関数呼び出しの際になんらかの理由で認証ライブラリを使用できない場合、ID トークンを手動で取得するには、Compute Metadata Server を使用する方法と、自己署名 JWT を作成して Google によって署名された ID トークンと交換する方法の 2 つがあります。
メタデータ サーバーの使用
次のように、Compute Metadata Server を使用して、特定のユーザーの ID トークンを取得します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=[AUDIENCE]" \
-H "Metadata-Flavor: Google"
ここで、AUDIENCE は呼び出す関数の URL(https://GCP_REGION-PROJECT_ID.cloudfunctions.net/my-function
など)です。
Google によって署名された ID トークンと自己署名 JWT の交換
受信側の関数で、呼び出し側関数のサービス アカウントに Cloud Functions 起動元(
roles/cloudfunctions.invoker
)ロールを付与します。サービス アカウントとキーを作成し、呼び出し側関数またはサービスがリクエストを発信するホストに、秘密鍵(JSON 形式)を含むファイルをダウンロードします。
ヘッダーを
{"alg":"RS256","typ":"JWT"}
に設定して JWT を作成します。ペイロードには、受信側関数の URL に設定されたtarget_audience
クレームと、上述のサービス アカウントのメールアドレスに設定されたiss
クレームとsub
クレームを含める必要があります。また、exp
クレームとiat
クレームも含める必要があります。aud
クレームはhttps://www.googleapis.com/oauth2/v4/token
に設定する必要があります。先ほどダウンロードした秘密鍵を使用して、JWT に署名します。
この JWT を使用して、https://www.googleapis.com/oauth2/v4/token に POST リクエストを送信します。認証データはリクエストのヘッダーと本文に含める必要があります。
ヘッダー内:
Authorization: Bearer $JWT - where $JWT is the JWT you just created Content-Type: application/x-www-form-urlencoded
本文内:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$JWT
$JWT
は、作成した JWT で置き換えますこれにより、Google によって署名された
id_token
を含む別の JWT が返されます。
GET/POST リクエストを受信側関数に送信します。Google によって署名された ID トークンをリクエストの Authorization: Bearer ID_TOKEN_JWT
ヘッダーに含めます。