呼び出しを認証する
認証された Cloud Functions の関数を呼び出すには、基盤となるプリンシパルに起動元の IAM 権限が必要です。
- 第 1 世代の関数の場合は
cloudfunctions.functions.invoke
。これは通常、Cloud Functions 起動元のロールによって行われます。 - 第 2 世代の関数の場合は
run.routes.invoke
。これは通常、Cloud Run 起動元ロールによって行われます。
関数でその他の管理アクションを作成、更新、実行するには、適切なロールを持つプリンシパルが必要です。詳しくは、IAM を使用したアクセスの承認をご覧ください。
ただし、関数の呼び出しはより複雑なイベントになる場合があります。イベント ドリブン関数を呼び出すことができるのは、関数が登録されているイベントソースだけですが、HTTP 関数は、異なる場所で発生するさまざまな種類の ID によって呼び出すことができます。呼び出し元は、関数やその関数を使用したい別の関数またはサービスをテストするデベロッパーである可能性があります。デフォルトでは、これらの ID は、自身を認証するためのリクエストとともに ID トークンを提供する必要があります。また、使用するアカウントに適切な権限が付与されている必要もあります。
ID トークンなしの未認証アクセスは可能ですが、有効にする必要があります。詳しくは、IAM を使用したアクセスの承認をご覧ください。
デベロッパー テストの認証
デベロッパーは、関数を作成、更新、削除するためのアクセス権が必要になります。また、アクセス権は通常の(IAM)プロセスを使用して付与されます。
ただし、デベロッパーは、テスト目的で関数を呼び出す必要がある場合もあります。curl
などのツールを使用して関数を呼び出すには、次の点にご注意ください。
呼び出し権限を含む Cloud Functions ユーザー アカウントにロールを割り当てます。
cloudfunctions.functions.invoke
権限。第 1 世代の関数の場合はcloudfunctions.functions.invoke
。これは通常、Cloud Functions 起動元のロールによって行われます。デフォルトでは、Cloud Functions 管理者と Cloud Functions デベロッパーのロールにこの権限が含まれています。ロールとそれに関連する権限の詳細については、Cloud Functions IAM ロールをご覧ください。- 第 2 世代の関数の場合は
run.routes.invoke
。これは通常、Cloud Run 起動元ロールによって行われます。
ローカルマシンから作業している場合は、Google Cloud CLI を初期化してコマンドライン アクセスを設定します。
Authorization
ヘッダーに保存されている Google 生成の ID トークンとして認証情報をリクエストに提供します。たとえば、gcloud
を使用して ID トークンを取得するには、次のコマンドを実行します。curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://FUNCTION_URL
ここで、FUNCTION_URL は関数の URL です。この URL は、Google Cloud コンソールの Cloud Functions ページから取得するか、Google Cloud CLI のデプロイ コマンドの例の最初のステップで説明されている
gcloud functions describe
コマンドを実行して取得します。
呼び出す関数に対する cloudfunctions.functions.invoke
権限がアカウントに付与されていれば、gcloud
によって作成されたトークンを使用して、どのプロジェクトでも HTTP 関数を呼び出すことができます。開発目的では、gcloud
で生成された ID トークンを使用します。ただし、このようなトークンにはオーディエンス クレームがないため、リレー攻撃を受けやすくなります。本番環境では、適切な対象を指定したサービス アカウントに対して発行された ID トークンを使用します。この方法では、トークンの使用を目的のサービスのみに制限することでセキュリティを強化します。
通常どおり、関数の開発と使用に必要な最小限の権限セットを割り当てることをおすすめします。関数の IAM ポリシーは、必要最小限のユーザーとサービス アカウントに限定してください。
関数呼び出しに対する関数の認証
複数の関数を接続するサービスをビルドする場合は、それぞれの関数が他の関数の特定のサブセットにのみリクエストを送信できるようにすることをおすすめします。たとえば、login
関数の場合、user profiles
関数へのアクセスは許可しますが、search
関数へのアクセスは許可しません。
特定の呼び出し側関数からのリクエストを受信するように受信側関数を構成するには、受信側の関数で、呼び出し側関数のサービス アカウントに適切な起動元ロールを付与する必要があります。第 1 世代の関数の場合、起動元のロールは Cloud Functions 起動元(roles/cloudfunctions.invoker
)です。第 2 世代の関数の場合は Cloud Run 起動元(roles/run.invoker
)で、基盤となるサービスで付与される必要があります。
Cloud Functions(第 1 世代)
コンソール
第 1 世代の関数の場合は、Cloud Functions 起動元を使用します。
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(サービス アカウントのメールアドレス)です。
Cloud Functions(第 2 世代)
コンソール
第 2 世代の関数の場合は、Cloud Run 起動元を使用します。
Google Cloud コンソールに移動します。
Cloud Run サービスリストで、受信側関数の横にあるチェックボックスをオンにします(関数自体はクリックしないでください)。
[権限] パネルが開きます。
[プリンシパルを追加] をクリックします。
呼び出し側のサービスの ID を入力します。これは通常、メールアドレスになります(デフォルトは
PROJECT_NUMBER-compute@developer.gserviceaccount.com
)。プロジェクト番号は、プロジェクト ID やプロジェクト名とは異なることに注意してください。プロジェクト番号は、Google Cloud コンソールの [ダッシュボード] ページで確認できます。
[ロールの選択] プルダウン メニューから、
Cloud Run Invoker
ロールを選択します。[保存] をクリックします。
gcloud
gcloud functions add-invoker-policy-binding
コマンドを使用します。
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY'
ここで、RECEIVING_FUNCTION
は受信側関数の名前、CALLING_FUNCTION_IDENTITY
は呼び出し側関数の ID(サービス アカウントのメールアドレス)です。
この呼び出し側関数は受信側関数を呼び出すため、認証用に Google によって署名された ID トークンも備えている必要があります。これには、次の 2 つの手順を行います。
audience フィールド(
aud
)に受信側関数の URL を設定して、Google によって署名された ID トークンを作成します。関数に対するリクエストの
Authorization: Bearer ID_TOKEN
ヘッダーに ID トークンを含めます。
このプロセスを管理する最も簡単かつ信頼性の高い方法は、以下に示すように認証ライブラリを使用してこのトークンを生成し、適用することです。
プログラムによるトークンの生成
次のコードは、ID トークンを生成した後、そのトークンを使用して Cloud Functions の関数を呼び出します。このコードは、ライブラリが認証情報を取得できる環境で動作します。これには、ローカルのアプリケーションのデフォルト認証情報をサポートする環境も含まれます。
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 に置き換えます。この URL は、前述のデベロッパー テストの認証セクションで説明されている方法で取得できます。
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
ヘッダーに含めます。
次のステップ
関数へのアクセスを管理する方法を学習する。
ID トークンを生成するその他の方法についてサポートを受ける。