関数 ID
セキュリティ上、Google Cloud のエンティティ間のほとんどのやり取りでは、パスワードや鍵などのなんらかのシークレットによって保護される検証可能な ID を各エンティティが持つ必要があります。他のエンティティが Cloud Run functions にアクセスするために ID を必要とするのと同様に、関数自体が処理を行うために Google Cloud の他のリソースへのアクセスを必要とすることがよくあります。すべての関数は、他のリソースにアクセスするときに ID として機能するサービス アカウントに関連付けられます。関数が ID として使用するサービス アカウントは、ランタイム サービス アカウントとも呼ばれます。
本番環境で使用する場合は、各関数にユーザー管理のサービス アカウントを割り当てて、専用の ID を割り当てることをおすすめします。ユーザーが管理するサービス アカウントでは、Identity and Access Management を使用して最小限の権限セットを付与することでアクセスを制御できます。
ランタイム サービス アカウント
関数のデプロイ時に別のランタイム サービス アカウントを指定しない限り、Cloud Run functions は関数実行の ID としてデフォルトのサービス アカウントを使用します。
Cloud Run functions では、デフォルトのコンピューティング サービス アカウント
PROJECT_NUMBER-compute@developer.gserviceaccount.com
が使用されます。プロジェクト番号は、プロジェクト ID やプロジェクト名とは異なることに注意してください。プロジェクト番号は、Google Cloud コンソールの [ダッシュボード] ページで確認できます。
組織のポリシーの構成によっては、デフォルトのサービス アカウントにプロジェクトの編集者のロールが自動的に付与される場合があります。iam.automaticIamGrantsForDefaultServiceAccounts
組織ポリシー制約を適用して、自動的なロール付与を無効にすることを強くおすすめします。2024 年 5 月 3 日以降に組織を作成した場合、この制約はデフォルトで適用されます。
自動ロール付与を無効にする場合、デフォルトのサービス アカウントに付与するロールを決定し、これらのロールを付与する必要があります。
デフォルトのサービス アカウントにすでに編集者ロールが設定されている場合は、編集者ロールを権限の低いロールに置き換えることをおすすめします。サービス アカウントのロールを安全に変更するには、Policy Simulator を使用して変更の影響を確認してから、適切なロールを付与または取り消す操作を行います。
本番環境で関数を保護するには:
デフォルトのランタイム サービス アカウントの権限を変更する
コンソール
Google Cloud コンソールで [IAM] ページに移動します。
テーブルから App Engine のデフォルト サービス アカウントまたはデフォルトのコンピューティング サービス アカウントを選択します。
行の右側にある鉛筆アイコンをクリックして、[権限を編集] タブを表示します。
[ロール] プルダウンを使用して、ロールを追加または削除し、最小限のアクセス権限を設定します。
[保存] をクリックします。
gcloud
編集者のロールを削除し、gcloud projects add-iam-policy-binding
コマンドを使用して新しいロールを追加します。
# Remove the Editor role gcloud projects remove-iam-policy-binding PROJECT_ID \ --member="SERVICE_ACCOUNT_EMAIL" \ --role="roles/editor" # Add the desired role gcloud projects add-iam-policy-binding PROJECT_ID \ --member="SERVICE_ACCOUNT_EMAIL" \ --role="ROLE"
ここで、PROJECT_ID
は、使用しているプロジェクトのプロジェクト ID です。SERVICE_ACCOUNT_EMAIL
は、ランタイム サービス アカウントで説明したデフォルトのランタイム サービス アカウントのメールアドレスです。ROLE
は、デフォルトのランタイム サービス アカウントに割り当てる新しいロールです。
個別のサービス アカウントを関数に使用する
関数に対するアクセスをより柔軟に制御できるように、それぞれに独自のユーザー管理サービス アカウントを付与します。
- サービス アカウントを作成します。名前をメモしておきます。
- その関数が機能するためにアクセスする必要のあるリソースに基づいて、適切なロールを付与します。
サービス アカウントと関数が異なるプロジェクトにある場合、サービス アカウントが存在するプロジェクトが異なります。
- プロジェクト間で動作するようにサービス アカウントを構成します。
サービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator
)を Cloud Run サービス エージェント(service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
)に付与します。PROJECT
は、関数が存在するプロジェクトを指します。Cloud Run サービス エージェントは、サービス アカウントのプロジェクト間のアクセスを管理します。別のプロジェクトから、サービス アカウントの Cloud Run functions サービス エージェント(
service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)にiam.serviceaccounts.actAs
権限を付与します。
サービス アカウントにリソースへのアクセス権を付与します。その方法はリソースタイプによって異なります。
サービス アカウントと関数を接続します。これは、デプロイ時に、または以前にデプロイされた関数を更新することによって実行できます。
デプロイ時にユーザー管理のサービス アカウントを追加する
コンソール
Google Cloud コンソールに移動します。
必要に応じて関数を指定および構成します。
[ランタイム、ビルド...] をクリックして、その他の設定を表示します。
[ランタイム] タブを選択します。
[サービス アカウント] プルダウンをクリックして、目的のサービス アカウントを選択します。
[次へ]、[デプロイ] の順にクリックします。
gcloud
gcloud functions deploy
で関数をデプロイするときに、--service-account
フラグを追加します。次に例を示します。
gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL
ここで、FUNCTION_NAME
は関数名、SERVICE_ACCOUNT_EMAIL
はサービス アカウントのメールアドレスです。
既存の関数のサービス アカウントを更新する
既存の関数のランタイム サービス アカウントを更新できます。
コンソール
Google Cloud コンソールに移動します。
目的の関数の名前をクリックして、詳細ページに移動します。
詳細ページの上部にある編集鉛筆アイコンをクリックして、関数を編集します。
[ランタイム、ビルド...] をクリックして、その他の設定を表示します。
[ランタイム] タブを選択します。
[サービス アカウント] プルダウンをクリックして、目的のサービス アカウントを選択します。
[次へ]、[デプロイ] の順にクリックします。
gcloud
gcloud functions deploy
で関数をデプロイするときに、--service-account
フラグを追加します。
gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL
ここで、FUNCTION_NAME
は関数名、SERVICE_ACCOUNT_EMAIL
はサービス アカウントです。
再デプロイされた関数は、新しいランタイム サービス アカウントを使用するようになります。
メタデータ サーバーを使用したトークンの取得
Google Cloud でアクセスを管理するには、IAM 定義のサービス アカウントの使用をおすすめしますが、サービスによっては、API キー、OAuth 2.0 クライアント、またはサービス アカウント キーなどの別の方法を使用する必要があります。外部リソースへのアクセスにも、別の方法が必要になることがあります。
ターゲット サービスで OpenID Connect ID トークンまたは Oauth 2.0 アクセス トークンを提示する必要がある場合は、完全な OAuth クライアントを設定するのではなく、Compute Metadata Server を使用してこれらのトークンを取得できます。
ID トークン
次のように、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://service.domain.com
など)、IAP で保護されたリソースの OAuth クライアント ID(1234567890.apps.googleusercontent.com
など)。
アクセス トークン
OAuth 2.0 アクセス トークンでは、スコープを使用してアクセス権限を定義します。デフォルトでは、Google Cloud のアクセス トークンには cloud-platform
スコープが設定されています。他の Google または Google Cloud APIs にアクセスするには、適切なスコープのアクセス トークンを取得する必要があります。
アクセス トークンを取得するには、Compute Metadata Server を使用します。
特定のスコープを持つアクセス トークンが必要な場合は、次のようにしてアクセス トークンを生成します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \ -H "Metadata-Flavor: Google"
SCOPES
は、リクエストされた OAuth スコープのカンマ区切りのリストです。例: https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets
Google OAuth スコープの完全なリストを調べて、必要なスコープを探してください。
次のステップ
関数へのアクセスを許可する方法や、関数を呼び出せるようにデベロッパーやその他の関数の認証を行う方法を学習する。