関数 ID

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

関数の実行中、Cloud Functions はサービス アカウント PROJECT_ID@appspot.gserviceaccount.com を ID として使用します。たとえば、Google Cloud クライアント ライブラリを使用して Google Cloud Platform サービスにリクエストを送信するときに、Cloud Functions は自動的にトークンを取得して使用し、サービスの認証を行うことができます。

デフォルトの権限の変更

デフォルトでは、ランタイム サービス アカウントには編集者の役割が付与され、多くの GCP サービスにアクセスできます。これにより、関数の開発時間は短縮できますが、本番環境で必要以上に権限が付与される可能性があるため、最小限の権限が付与されるように構成する必要があります。

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

関数固有の ID

複数の関数がすべて異なるリソースにアクセスする場合、それぞれの関数に独自の ID が必要になることがあります。このような ID を設定するには、適切な役割が設定された名前付きのサービス アカウントを使用して関数をデプロイします。デプロイされるサービス アカウントは、接続先の関数と同じプロジェクトで作成されている必要があります。

デフォルト以外の ID 使用するために必要な権限

デフォルト以外のサービス アカウントで関数をデプロイするには、デプロイするサービス アカウントに対する iam.serviceAccounts.actAs 権限がデプロイ側に必要です。

ユーザーがサービス アカウントを作成すると、この権限が自動的に付与されます。それ以外の場合は、正しい権限を持つユーザーがサービス アカウントに対するこの権限をデプロイ側に付与する必要があります。

デフォルト以外の ID を持つ新しい関数をデプロイする

新しい ID の関数をデプロイする前に、使用するサービス アカウントが作成されている必要があります。まだの場合は、アカウントを作成してください。詳しくは、サービス アカウントの作成と管理をご覧ください。

Console

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

    Google Cloud Console に移動

  2. 必要に応じて関数を構成します。

  3. [環境変数、ネットワーキング、タイムアウトなど] をクリックして、追加の設定を表示します。

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

  5. [作成] をクリックします。

gcloud

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

    gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL
    

ここで、FUNCTION_NAME は関数名、SERVICE_ACCOUNT_EMAIL は新しい ID に関連付けられたサービス アカウントです。

既存の関数の ID を更新する

既存の関数を更新して、新しいランタイム サービス アカウントを作成することもできます。

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 は新しい ID に関連付けられたサービス アカウントです。

ID とアクセス トークンの取得

Compute Metadata Server を使用して、ID トークンとアクセス トークンを取得します。ローカルのパソコンから直接メタデータ サーバーにクエリを送信することはできません。

ID トークン

ID トークンは、他の Cloud Functions を呼び出すときや、ID トークンの検証が可能な他のサービスを呼び出すときに使用します。

次のように、Compute Metadata Server を使用して、特定のユーザーの ID トークンを取得します。

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
      -H "Metadata-Flavor: Google"
    

AUDIENCE は、リクエストされた JWT ユーザーです。例: 呼び出すサービスの URL(https://service.domain.com など)、IAP で保護されたリソースの OAuth クライアント ID(1234567890.apps.googleusercontent.com)。

アクセス トークン

アクセス トークンは、Google API を呼び出すときに使用します。

デフォルトでは、アクセス トークンに cloud-platform スコープが設定されています。IAM でアクセスが許可されていれば、すべての Google Cloud Platform API にアクセスできます。他の 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 スコープの完全なリストを調べて、必要なスコープを探してください。

次のステップ

アクセスの管理方法を学習する。また、関数に対するデベロッパー、関数、エンドユーザーの認証を安全に行う方法を学習する。