関数 ID

他のエンティティが Cloud Functions とやり取りするためにアクセスする必要がある場合と同様に、関数自体が処理を行うために Google Cloud の他のリソースへのアクセスを必要とすることがよくあります。すべての関数は、他のリソースにアクセスするときに ID として機能するサービス アカウントに関連付けられます。関数が ID として使用するサービス アカウントは、ランタイム サービス アカウントとも呼ばれます。

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

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

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

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

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

App Engine のデフォルト サービス アカウントの権限を変更する

Console

  1. Google Cloud Console に移動します。

    Google Cloud Console に移動

  2. テーブルから App Engine のデフォルトのサービス アカウント(PROJECT_ID@appspot.gserviceaccount.com)を選択します。

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

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

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

gcloud

編集者の役割を削除し、gcloud projects add-iam-policy-binding コマンドを使用して新しいロールを追加します。

# Remove the Editor role
gcloud projects remove-iam-policy-binding PROJECT_ID \
  --member="PROJECT_ID@appspot.gserviceaccount.com"
  --role="roles/editor"

# Add the desired role
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="PROJECT_ID@appspot.gserviceaccount.com"
  --role="ROLE"

ここで、PROJECT_ID は使用するプロジェクトのプロジェクト ID、ROLE はランタイム サービス アカウントに割り当てる新しいロールです。

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

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

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

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

      • App Engine デフォルト サービス アカウント(PROJECT_ID@appspot.gserviceaccount.com
      • Cloud Functions サービス エージェント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com

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

  4. 作成したサービス アカウントを、メンバーとしてアクセスする必要のあるリソースに追加します。その方法はリソースタイプによって異なります。

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

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

Console

  1. Google Cloud Console に移動します。

    Google Cloud Console に移動

  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 はサービス アカウントのメールアドレスです。

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

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

Console

  1. Google Cloud Console に移動します。

    Google Cloud Console に移動

  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 で ID と承認を行うには、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 スコープの完全なリストを調べて、必要なスコープを探してください。

次のステップ

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