関数 ID
セキュリティ上、Google Cloud のエンティティ間のほとんどのやり取りでは、パスワードや鍵などのなんらかのシークレットによって保護される検証可能な ID を各エンティティが持つ必要があります。他のエンティティが Cloud Functions にアクセスするために ID を必要とするのと同様に、関数自体が処理を行うために Google Cloud の他のリソースへのアクセスを必要とすることがよくあります。すべての関数は、他のリソースにアクセスするときに ID として機能するサービス アカウントに関連付けられます。関数が ID として使用するサービス アカウントは、ランタイム サービス アカウントとも呼ばれます。
本番環境で使用する場合は、各関数にユーザー管理のサービス アカウントを割り当てて、専用の ID を割り当てることをおすすめします。ユーザーが管理するサービス アカウントでは、Identity and Access Management を使用して最小限の権限セットを付与することでアクセスを制御できます。
ランタイム サービス アカウント
関数のデプロイ時に別のランタイム サービス アカウントを指定しない限り、Cloud Functions は関数実行の ID としてデフォルトのサービス アカウントを使用します。
- Cloud Functions(第 1 世代)では、App Engine のデフォルト サービス アカウント
PROJECT_ID@appspot.gserviceaccount.com
を使用します。 Cloud Functions(第 2 世代)では、デフォルトのコンピューティング サービス アカウント
PROJECT_NUMBER-compute@developer.gserviceaccount.com
を使用します。プロジェクト番号は、プロジェクト ID やプロジェクト名とは異なることに注意してください。プロジェクト番号は、Google Cloud コンソールの [ダッシュボード] ページで確認できます。
これらのデフォルトのサービス アカウントには編集者のロールがあり、多くの Google Cloud サービスに幅広くアクセスできます。これは関数を開発する最も速い方法ですが、デフォルトのサービス アカウントはテストと開発でのみ使用することをおすすめします。本番環境では、ランタイム サービス アカウントに目標を達成するために必要な最小限の権限セットのみを付与する必要があります。
本番環境で関数を保護するには:
デフォルトのランタイム サービス アカウントの権限を変更する
コンソール
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
)を、両方の Google 管理のサービス アカウントに付与します。ここで、PROJECT...
は、関数が存在するプロジェクトを指します。- デフォルトのサービス アカウント: 第 1 世代と第 2 世代のどちらを使用するかによって異なります。
- 第 1 世代: App Engine のデフォルトのサービス アカウント(
PROJECT_ID@appspot.gserviceaccount.com
) - 第 2 世代: Compute Engine のデフォルトのサービス アカウント(
PROJECT_NUMBER-compute@developer.gserviceaccount.com
)
- 第 1 世代: App Engine のデフォルトのサービス アカウント(
- Cloud Functions サービス エージェント(
service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)
これらの Google アカウントは、サービス アカウントのプロジェクト間のアクセスを管理します。
- デフォルトのサービス アカウント: 第 1 世代と第 2 世代のどちらを使用するかによって異なります。
サービス アカウントにリソースへのアクセス権を付与します。その方法はリソースタイプによって異なります。
サービス アカウントと関数を接続します。これは、デプロイ時に、または以前にデプロイされた関数を更新することによって実行できます。
デプロイ時にユーザー管理のサービス アカウントを追加する
コンソール
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 スコープの完全なリストを調べて、必要なスコープを探してください。
次のステップ
関数へのアクセスを許可する方法や、関数を呼び出せるようにデベロッパーやその他の関数の認証を行う方法を学習する。