関数 ID

セキュリティ上、Google Cloud のエンティティ間のほとんどのやり取りでは、パスワードや鍵などのなんらかのシークレットによって保護される検証可能な ID を各エンティティが持つ必要があります。他のエンティティが Cloud Functions にアクセスするために ID を必要とするのと同様に、関数自体が処理を行うために Google Cloud の他のリソースへのアクセスを必要とすることがよくあります。すべての関数は、他のリソースにアクセスするときに ID として機能するサービス アカウントに関連付けられます。関数が ID として使用するサービス アカウントは、ランタイム サービス アカウントとも呼ばれます。

本番環境で使用する場合は、各関数にユーザー管理のサービス アカウントを割り当てて、専用の ID を割り当てることをおすすめします。ユーザーが管理するサービス アカウントでは、Identity and Access Management を使用して最小限の権限セットを付与することでアクセスを制御できます。

ランタイム サービス アカウント

関数のデプロイ時に別のランタイム サービス アカウントを指定しない限り、Cloud Functions は関数実行の ID としてデフォルトのサービス アカウントを使用します。

これらのデフォルトのサービス アカウントには編集者のロールがあり、多くの Google Cloud サービスに幅広くアクセスできます。これは関数を開発する最も速い方法ですが、デフォルトのサービス アカウントはテストと開発でのみ使用することをおすすめします。本番環境では、ランタイム サービス アカウントに目標を達成するために必要な最小限の権限セットのみを付与する必要があります。

本番環境で関数を保護するには:

デフォルトのランタイム サービス アカウントの権限を変更する

コンソール

  1. Google Cloud コンソールで [IAM] ページに移動します。

    Google Cloud コンソールに移動

  2. テーブルから App Engine のデフォルト サービス アカウントまたはデフォルトのコンピューティング サービス アカウントを選択します。

  3. 行の右側にある鉛筆アイコンをクリックして、[権限を編集] タブを表示します。

  4. [ロール] プルダウンを使用して、ロールを追加または削除し、最小限のアクセス権限を設定します。

  5. [保存] をクリックします。

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 は、デフォルトのランタイム サービス アカウントに割り当てる新しいロールです。

個別のサービス アカウントを関数に使用する

関数に対するアクセスをより柔軟に制御できるように、それぞれに独自のユーザー管理サービス アカウントを付与します。

  1. サービス アカウントを作成します。名前をメモしておきます。
  2. その関数が機能するためにアクセスする必要のあるリソースに基づいて、適切なロール付与します。
  3. サービス アカウントと関数が異なるプロジェクトにある場合、サービス アカウントが存在するプロジェクトが異なります。

    1. プロジェクト間で動作するようにサービス アカウントを構成します。
    2. サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を、両方の Google 管理のサービス アカウントに付与します。ここで、PROJECT... は、関数が存在するプロジェクトを指します。

      • デフォルトのサービス アカウントは、第 1 世代と第 2 世代のどちらを使用しているかによって異なります。
        • 第 1 世代: App Engine のデフォルトのサービス アカウント(PROJECT_ID@appspot.gserviceaccount.com
        • 第 2 世代: Compute Engine のデフォルトのサービス アカウント(PROJECT_NUMBER-compute@developer.gserviceaccount.com
      • Cloud Functions サービス エージェント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com

      これらの Google アカウントは、サービス アカウントのプロジェクト間のアクセスを管理します。

  4. サービス アカウントにリソースへのアクセス権を付与します。その方法はリソースタイプによって異なります。

  5. サービス アカウントと関数を接続します。これは、デプロイ時に、または以前にデプロイされた関数を更新することによって実行できます。

デプロイ時にユーザー管理のサービス アカウントを追加する

コンソール

  1. Google Cloud コンソールに移動します。

    Google Cloud コンソールに移動

  2. 必要に応じて関数を指定および構成します。

  3. [ランタイム、ビルド...] をクリックして、その他の設定を表示します。

  4. [ランタイム] タブを選択します。

  5. [サービス アカウント] プルダウンをクリックして、目的のサービス アカウントを選択します。

  6. [次へ]、[デプロイ] の順にクリックします。

gcloud

gcloud functions deploy で関数をデプロイするときに、--service-account フラグを追加します。次に例を示します。

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

ここで、FUNCTION_NAME は関数名、SERVICE_ACCOUNT_EMAIL はサービス アカウントのメールアドレスです。

既存の関数のサービス アカウントを更新する

既存の関数のランタイム サービス アカウントを更新できます。

コンソール

  1. Google Cloud コンソールに移動します。

    Google Cloud コンソールに移動

  2. 目的の関数の名前をクリックして、詳細ページに移動します。

  3. 詳細ページの上部にある編集鉛筆アイコンをクリックして、関数を編集します。

  4. [ランタイム、ビルド...] をクリックして、その他の設定を表示します。

  5. [ランタイム] タブを選択します。

  6. [サービス アカウント] プルダウンをクリックして、目的のサービス アカウントを選択します。

  7. [次へ]、[デプロイ] の順にクリックします。

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 スコープの完全なリストを調べて、必要なスコープを探してください。

次のステップ

関数へのアクセスを許可する方法や、関数を呼び出せるようにデベロッパーやその他の関数の認証を行う方法を学習する。