厳格な act-as モードでは、Dataform で次のユーザー アクションに対して追加のセキュリティ チェックが有効になります。
- リポジトリの作成または更新
- ワークフロー構成の作成または更新
- ワークフロー呼び出しの作成
- リリース構成を更新する
この追加のセキュリティ チェックでは、これらのアクションを実行するユーザーに、有効なサービス アカウント(ワークフローの実行に認証情報が使用されるサービス アカウント)に対する iam.serviceAccounts.actAs 権限が必要です。詳細については、サービス アカウントをリソースに関連付けるをご覧ください。
これらの権限は、次の方法で有効にできます。
- リポジトリを作成する場合
strict_act_as_checksリポジトリ フラグを使用して既存のリポジトリを更新する場合
必要なロール
このドキュメントのタスクを完了するために必要な権限を取得するには、管理者に次の IAM ロールを付与するよう依頼してください。
-
カスタム サービス アカウントに対するサービス アカウント ユーザー (
roles/iam.serviceAccountUser) -
Logging でログを表示する: プロジェクトに対するログビューア (
roles/logging.viewer) -
ユーザーまたはサービス アカウントに IAM ロールを付与します。
プロジェクトに対するサービス アカウント管理者 (
roles/iam.serviceAccountAdmin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
有効なサービス アカウントの act-as 権限を確認する
Dataform ワークフローが安全に中断なく実行されるようにするには、使用するサービス アカウントの act-as 権限を確認することが重要です。このセクションでは、リソースの有効なサービス アカウントを特定し、Cloud Logging を使用して権限の問題を確認し、見つかった問題を解決する方法について説明します。
有効なサービス アカウントを特定する
ワークフローを実行している有効なサービス アカウントは、リソースタイプと次の条件に基づいて決定できます。
| リソースの種類 | 有効なサービス アカウント |
|---|---|
| リポジトリ | リポジトリを作成するときにカスタム サービス アカウントを選択すると、 それ以外の場合は、デフォルトで Dataform サービス エージェントになります。 |
| ワークフロー構成 | カスタム サービス アカウントは、ワークフロー構成を作成するときに選択できます。 それ以外の場合、デフォルトはリポジトリの Dataform サービス エージェントになります。 |
| ワークフローの呼び出し | コンパイル結果が コンパイル結果からワークフロー呼び出しを作成する場合、 それ以外の場合、デフォルトはリポジトリの Dataform サービス エージェントになります。 |
Cloud Logging で権限の問題を確認する
セキュリティを強化するため、Dataform は、Dataform リソースで使用されるサービス アカウントに iam.serviceAccounts.actAs 権限がないかどうかを確認します。
これらのチェックの結果(権限に関する問題の可能性を含む)は、Cloud Logging に記録されます。これらのログを定期的に確認して、不足している iam.serviceAccounts.actAs 権限を特定し、付与する必要があります。これらのログを確認することで、Dataform ワークフローと構成が中断なく機能し続けることを確認できます。
Cloud Logging でログを確認する
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
ログを確認する Google Cloud プロジェクトを選択します。
クエリエディタで次のオプションを使用して、Dataform
actAsログをフィルタします。失敗して対応が必要な
actAsチェックのみを一覧表示するには、次のクエリを使用します。logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result" jsonPayload.dryRunResult = falseすべての
actAsチェックを一覧表示するには、次のクエリを使用します。logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
PROJECT_IDは、実際のGoogle Cloud プロジェクト ID に置き換えます。[クエリを実行] をクリックします。
ログエントリを解釈する
クエリ結果でログエントリを開き、次の jsonPayload フィールドを表示します。
| フィールド | タイプ | 説明 |
|---|---|---|
dryRunResult |
ブール値 | true: 権限の確認に合格しました。false: 確認に失敗しました。呼び出し元プリンシパルに、サービス アカウントに対する iam.serviceAccounts.actAs 権限がありません。 |
caller |
文字列 | API 呼び出しを開始したプリンシパル(ユーザーまたはサービス アカウント)のメールアドレス。 |
serviceAccount |
文字列 | 呼び出し元プリンシパルが代行しようとしたサービス アカウント。通常、このフィールドは dryRunResult フィールドが false の場合に存在します。 |
apiMethod |
文字列 | チェックをトリガーした Dataform API メソッド(CreateWorkflowInvocation や UpdateRepository など)。 |
*_context |
オブジェクト | 呼び出された API メソッドに関連するリソース名を含むオブジェクト。詳細については、コンテキスト オブジェクトをご覧ください。 |
コンテキスト オブジェクト
ログエントリには、jsonPayload フィールド内のコンテキスト オブジェクトが含まれます。このオブジェクトのフィールドには、関連する Dataform エンティティの完全修飾 Google Cloud リソース名が含まれます。これらの名前は、次のリストに示す標準構造に従っているため、リソースを正確に識別できます。
create_workflow_invocation_context: API メソッドがCreateWorkflowInvocationの場合に存在します。workflowInvocation: ワークフロー呼び出しのリソース名。- リソース名の形式は
projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowInvocations/WORKFLOW_INVOCATION_IDです。
- リソース名の形式は
compilationResultまたはworkflowConfig: 呼び出しに使用されるソースのリソース名。compilationResultのリソース名の形式はprojects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/compilationResults/COMPILATION_RESULT_IDです。workflowConfigのリソース名の形式はprojects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_IDです。
create_repository_contextまたはupdate_repository_context: API メソッドがCreateRepositoryまたはUpdateRepositoryの場合に存在します。repository: Dataform リポジトリのリソース名。- リソース名の形式は次のとおりです。
projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID
- リソース名の形式は次のとおりです。
update_release_config_context: API メソッドがUpdateReleaseConfigの場合に存在します。releaseConfig: リリース構成のリソース名。- リソース名の形式は
projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/releaseConfigs/RELEASE_CONFIG_IDです。
- リソース名の形式は
create_workflow_config_contextまたはupdate_workflow_config_context: API メソッドがCreateWorkflowConfigまたはUpdateWorkflowConfigの場合に存在します。workflowConfig: ワークフロー構成のリソース名。- リソース名の形式は
projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_IDです。
- リソース名の形式は
ドキュメントに記載されている形式とロギング エントリを比較するには、次の値を置き換えます。
PROJECT_ID:Google Cloud プロジェクトの固有識別子。LOCATION_ID: Dataform リポジトリが配置されているリージョン。REPOSITORY_ID: Dataform リポジトリのユーザー定義 ID。これは、リポジトリの作成時に付けられた名前です。COMPILATION_RESULT_ID: Dataform コンパイル結果に対してシステムで生成された一意の識別子。RELEASE_CONFIG_ID: Dataform リリース構成のユーザー定義 ID。WORKFLOW_CONFIG_ID: Dataform ワークフロー構成のユーザー定義 ID。
権限の問題を解決する
dryRunResult フィールドが false のログエントリが見つかった場合は、次の操作を行います。
jsonPayloadの詳細で、callerフィールドのメールアドレスをメモして、プリンシパルを特定します。serviceAccountフィールドのメールアドレスをメモして、サービス アカウントを特定します。呼び出し元のプリンシパルに、サービス アカウントとして動作する権限があることを確認します。この権限を付与すると、呼び出し元はサービス アカウントが保持する権限を使用できます。
アクセスが意図的なものである場合は、ターゲット サービス アカウントの呼び出し元プリンシパルにサービス アカウント ユーザーロール(
roles/iam.serviceAccountUser)を付与します。詳細については、サービス アカウント ユーザーの IAM ロールを付与するをご覧ください。
ロールを付与すると、この呼び出し元とサービス アカウントの組み合わせの今後のログには dryRunResult: true が表示されます。
サービス アカウント ユーザーの IAM ロールを付与する
サービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)には、厳密な act-as モードに必要な iam.serviceAccounts.actAs 権限が含まれています。Dataform API を使用する場合は、呼び出す projects.locations.repositories メソッドに基づいて、有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。
createまたはpatchRepository.ServiceAccountプロパティが設定されている場合は、そのプロパティにサービス アカウント ユーザーロールが付与されている必要があります。patchメソッドを呼び出す場合は、リポジトリ内のすべてのワークフロー構成のすべての有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。
workflowConfigs.createまたはworkflowConfigs.patch- ワークフロー構成で使用される有効なサービス アカウントに、サービス アカウント ユーザーロールが付与されている必要があります。
releaseConfigs.patch- このリリース構成を使用するワークフロー構成で使用されるすべての有効なサービス アカウントに対して、サービス アカウント ユーザーのロールが付与されている必要があります。
workflowInvocations.create- ワークフローの呼び出しで使用される有効なサービス アカウントに、サービス アカウント ユーザーのロールが付与されている必要があります。
カスタム サービス アカウントにサービス アカウント ユーザー ロールを付与する手順は、次のとおりです。
Google Cloud コンソールで、[IAM] > [サービス アカウント] に移動します。
プロジェクトを選択します。
[プロジェクト「PROJECT_NAME」のサービス アカウント] ページで、カスタム サービス アカウントを選択します。
[アクセス権を持つプリンシパル] に移動し、[アクセス権を付与] をクリックします。
[新しいプリンシパル] フィールドに、デフォルトの Dataform サービス エージェント ID を入力します。
デフォルトの Dataform サービス エージェント ID の形式は次のとおりです。
service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com[ロールを選択] リストで、[サービス アカウント ユーザー] ロールを選択します。
[保存] をクリックします。
詳細については、ワークフロー構成の作成に必要なロールとリリース構成の作成に必要なロールをご覧ください。
厳密な act-as モードが自動リリースと実行に与える影響
厳密な act-as モードを有効にすると、リポジトリの自動リリースとワークフローの自動実行に次のような影響があります。
サードパーティ リポジトリに接続されていないリポジトリの場合:
- リリース構成で自動リリース用の Cron スケジュールを設定することはできません。これは、必要な
iam.serviceAccounts.actAs権限を持たないユーザーがダウンストリーム サービス アカウントに対して行ったコード変更が自動的にデプロイされないようにするために適用されます。 - ワークフロー構成で Cron スケジュールを使用してスケジュールされたワークフロー実行は、引き続き有効になります。これらの自動実行を成功させるには、ワークフロー構成で指定された有効なサービス アカウントに対する
iam.serviceAccounts.actAs権限をデフォルトの Dataform サービス エージェントに付与する必要があります。
サードパーティ リポジトリに接続されているリポジトリの場合:
- スケジュールされたリリースとスケジュールされたワークフローの実行は許可されます。
- リリース構成からの自動リリースまたはワークフロー構成からの自動実行を有効にするには、関連する有効なサービス アカウントに対する
iam.serviceAccounts.actAs権限をデフォルトの Dataform サービス エージェントに付与する必要があります。- 自動リリース構成の場合は、このリリース構成によってトリガーされるすべてのワークフロー構成の有効なサービス アカウントに対する権限を付与します。
- 自動ワークフロー構成の場合は、そのワークフロー構成で使用される有効なサービス アカウントに対する権限を付与します。
次のステップ
- リポジトリの作成方法については、リポジトリの作成をご覧ください。
- Dataform と BigQuery の連携の詳細については、ワークフローの概要をご覧ください。
- ワークフロー構成の作成方法については、実行をスケジュールするをご覧ください。
- リリース構成の作成方法については、コンパイルを構成するをご覧ください。