インターネット アクセスとファイアウォール ルールを構成する

このドキュメントでは、次の方法について説明します。

  • インターネット アクセス用の Dataflow 仮想マシン(VM)インスタンスを構成する
  • タグを使用してワーカー VM ネットワーキングを保護する
  • Dataflow ジョブに関連付けられたネットワークにファイアウォール ルールを定義する

このドキュメントでは、Google Cloud Platform ネットワークに関する基本的な知識が必要になります。Dataflow ジョブのネットワークを定義する方法については、ネットワークとサブネットワークの指定をご覧ください。ネットワーキングの問題のトラブルシューティング方法の詳細については、Dataflow のネットワーキングに関する問題のトラブルシューティングをご覧ください。

Dataflow 用 Google Cloud API へのアクセス

Dataflow ワーカー仮想マシン(VM)は、Google Cloud API とサービスにアクセスできる必要があります。依存関係のある Google Cloud エンドポイントは経時的に変化する可能性がありますが、すべて VPC Service Controls をサポートしています。 Google Cloud API へのアクセスを構成するには、次のいずれかの方法を使用します。

デフォルトでは、ファイアウォール ルールと DNS 構成によってGoogle Cloud API にアクセスできるようになります。ただし、VPC Service Controls を使用している場合などは、 Google Cloud API のサブセットへのアクセスを積極的に制限している可能性があります。この場合、少なくとも restricted.googleapis.com へのアクセス権を付与します。Private Service Connect を使用している場合は、vpc-sc バンドルへのアクセス権を付与します。private.googleapis.com など、より制約の少ないドメインへのアクセス権を付与しても、必要な機能を使用できるようになります。

特定のドメインを介して必要な Google Cloud API にアクセスできるようにするには、次の要件を満たす環境が必要です。

  • ファイアウォール ルールでは、選択したドメインにあるすべてのアドレス範囲への下り(外向き)トラフィックを許可する必要があります。

  • DNS は *.googleapis.com を選択したドメインに解決する必要があります。

たとえば、ファイアウォール ルールで下り(外向き)トラフィックを restricted.googleapis.com のアドレス範囲に制限している場合、*.googleapis.com はこの範囲内のアドレスに解決される必要があります。詳細については、googleapis.com の DNS を構成するをご覧ください。

同様に、Private Service Connect を使用している場合は、googleapis.com デフォルト ドメインの DNS レコードを作成して、少なくとも vpc-sc バンドル内のすべてのサービスへのアクセスを確保する必要があります。

Dataflow 用のインターネット アクセス

ユースケースによっては、VM が Google Cloud Platform の外部にあるリソースへのアクセスを必要とする場合があります。Dataflow にインターネット アクセスを構成するには、次のいずれかの方法を使用します。

  • 外部 IP アドレスを使用して、インターネット アクセスの要件を満たすようにワーカー VM を構成します。

  • Cloud NAT などの NAT ソリューションを構成します。この方法は、 Google Cloud の外部にある、インターネット アクセスを必要とする API とサービスにアクセスするジョブの実行に使用します。たとえば、Python SDK ジョブは、パイプラインの依存関係をダウンロードするために Python Package Index(PyPI)にアクセスしなければならないことがあります。この場合は、ワーカー VM に外部 IP アドレスを構成するか、Cloud NAT を使用する必要があります。ジョブの送信中に Python パイプラインの依存関係を指定することもできます。たとえば、カスタム コンテナを使用して Python パイプラインの依存関係を指定すると、実行時に PyPI にアクセスする必要がなくなります。

    詳細については、Apache Beam ドキュメントの Python パイプラインの依存関係の管理をご覧ください。

外部 IP アドレスをオフにする

デフォルトでは、Dataflow は外部 IP アドレスと内部 IP アドレスの両方をワーカーに割り当てます。外部 IP アドレスをオフにすると、Dataflow ジョブがアクセスできるのは次の場所のリソースのみになります。

外部 IP アドレスがなくても、管理タスクやモニタリング タスクは実行できます。上記のリストにあるオプションで SSH を使用することで、ワーカーにアクセスできます。ただし、パイプラインはインターネットにアクセスできず、インターネット ホストは Dataflow ワーカーにアクセスできません。

外部 IP アドレスを使用しないことで、データ処理インフラストラクチャのセキュリティを強化できます。また、Google Cloudプロジェクトの割り当てに対して使用される外部 IP アドレスの数を減らすこともできます。

外部 IP アドレスをオフにすると、インターネット アクセスを必要とする Google Cloud 外部の API やサービスに、Dataflow ジョブでアクセスできなくなります。

外部 IP アドレスを無効にするには、次のいずれかを行います。

Java

  1. ネットワークまたはサブネットワークでプライベート Google アクセスを有効にします。
  2. Dataflow ジョブのパラメータに、--usePublicIps=false--network=NETWORK-NAME または --subnetwork=SUBNETWORK-NAME を指定します。

    選択した内容に応じて、次のいずれかを置き換えます。

    • NETWORK-NAME: Compute Engine ネットワークの名前
    • SUBNETWORK-NAME: Compute Engine サブネットワークの名前

Python

  1. すべての Python パッケージ依存関係をステージングするには、Apache Beam のパイプライン依存関係の手順を行ってください。
  2. ネットワークまたはサブネットワークでプライベート Google アクセスを有効にします。
  3. Dataflow ジョブのパラメータに、--no_use_public_ips--network=NETWORK または --subnetwork=SUBNETWORK を指定します。

    選択した内容に応じて、次のいずれかを置き換えます。

    • NETWORK-NAME: Compute Engine ネットワークの名前
    • SUBNETWORK-NAME: Compute Engine サブネットワークの名前

Go

  1. ネットワークまたはサブネットワークでプライベート Google アクセスを有効にします。
  2. Dataflow ジョブのパラメータに、--no_use_public_ips--network=NETWORK または --subnetwork=SUBNETWORK を指定します。

    選択した内容に応じて、次のいずれかを置き換えます。

    • NETWORK-NAME: Compute Engine ネットワークの名前
    • SUBNETWORK-NAME: Compute Engine サブネットワークの名前

タグを使用してワーカー VM ネットワーキングを保護する

タグを使用すると、特定の VM インスタンスにネットワーク ファイアウォール ルールを適用できます。Dataflow ジョブを実行するときに、ジョブを実行する Dataflow ワーカー VM のタグを指定できます。これらのタグのファイアウォール ルールは、Dataflow ワーカー VM に適用されます。

Dataflow は、VM ネットワーキング用に次の 2 種類のタグをサポートしています。

Dataflow でセキュアタグを使用する

セキュアタグ(Identity and Access Management(IAM)で管理されるタグとも呼ばれます)は、Resource Manager で作成および管理する Key-Value ペアです。ネットワーク タグとは異なり、セキュアタグは IAM を使用したアクセス制御をサポートしています。

ネットワーク タグの代わりにセキュアタグを使用するメリットは次のとおりです。

  • セキュアタグは、タグの不正な変更と、その結果としてファイアウォール ルールに望ましくない変更が加えられないようにします。

  • グローバルおよびリージョン ネットワーク ファイアウォール ポリシーは、セキュアタグをサポートしています。セキュアタグを使用すると、複数のファイアウォール ルールをグループ化して同時に更新できます。更新は IAM アクセス制御に則って管理されます。

  • セキュアタグは Google Cloud Platform 階層の親リソースから継承されるため、組織レベルなどの上位レベルでタグを定義できます。詳細については、タグの継承をご覧ください。

  • セキュアタグを使用すると、上り(内向き)ファイアウォール ルールに、VPC ネットワーク ピアリングを使用して接続された VPC ネットワーク内の送信元を含めることが可能です。Dataflow ジョブの場合、ファイアウォール ルールには、ワーカー VM ネットワークとピアリングされた VPC ネットワークの両方の送信元を含めることが可能です。

セキュアタグとネットワーク タグの違いについては、タグとネットワーク タグの比較をご覧ください。

Dataflow ジョブにセキュアタグを適用する手順は次のとおりです。

  1. ファイアウォール ポリシーのセキュアタグを構成します。詳細については、セキュアタグを構成するをご覧ください。

  2. リソース(タグ値)の Dataflow サービス アカウントTag User ロール(roles/resourcemanager.tagUser)を付与します。必要な権限の詳細については、リソースのタグを管理するをご覧ください。

  3. Dataflow ジョブを作成するときに、次の形式で use_vm_tags サービス オプションを使用します。

Java

--dataflowServiceOptions=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2

Python

--dataflow_service_options=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2

Go

--dataflow_service_options=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2

gcloud

additional-experiments オプションを指定して gcloud dataflow jobs run コマンドを使用します。Flex テンプレートを使用している場合は、gcloud dataflow flex-template run コマンドを使用します。

--additional-experiments=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2

Dataflow でネットワーク タグを使用する

ネットワーク タグは、ファイアウォール ルールに設定して Compute Engine VM に追加できるテキスト属性です。セキュアタグとは異なり、ネットワーク タグはテキスト文字列です。Resource Manager で管理されるリソースではありません。

ネットワーク タグを Dataflow ジョブに適用するには、次のように use_network_tags 試験運用版を使用します。

Java

--dataflowServiceOptions=use_network_tags=TAG_NAME

Python

--dataflow_service_options=use_network_tags=TAG_NAME

Go

--dataflow_service_options=use_network_tags=TAG_NAME

gcloud

additional-experiments オプションを指定して gcloud dataflow jobs run コマンドを使用します。Flex テンプレートを使用している場合は、gcloud dataflow flex-template run コマンドを使用します。

--additional-experiments=use_network_tags=TAG_NAME

ネットワーク タグを指定すると、Flex テンプレート ランチャー VM に、デフォルトのネットワーク タグ Dataflow も追加されます。

TAG_NAME はタグの名前に置き換えます。複数のタグを追加する場合は、TAG_NAME_1;TAG_NAME_2;TAG_NAME_3;... のように各タグをセミコロン(;)で区切ります。

ジョブの開始後に、ジョブにネットワーク タグを追加することはできません。

Dataflow は、作成するすべてのワーカー VM にネットワーク タグ dataflow を常に追加します。

ネットワーク タグに適用される制限をご確認ください。

Dataflow のファイアウォール ルール

ファイアウォール ルールを使用すると、VM との間のトラフィックを許可または拒否できます。Dataflow ジョブで Dataflow Shuffle または Streaming Engine を使用する場合に必要なのは、ファイアウォール ルールで必ず Google Cloud API へのアクセスを許可しておくことだけです。それ以外の場合、ストリーミング ジョブの場合は TCP ポート 12345 で、バッチジョブの場合は TCP ポート 12346 で Dataflow VM がネットワーク トラフィックを送受信できるように、ファイアウォール ルールを構成する必要があります。プロジェクト オーナー、編集者、またはセキュリティ管理者は、Dataflow VM で使用される VPC ネットワークに必要なファイアウォール ルールを作成する必要があります。

Dataflow にファイアウォール ルールを構成する前に、次のドキュメントをご覧ください。

Dataflow のファイアウォール ルールを作成する場合は、Dataflow ネットワーク タグを指定します。作成しない場合、ファイアウォール ルールは VPC ネットワーク内のすべての VM に適用されます。

該当する場合、階層型ファイアウォール ポリシーが最初に評価され、これらポリシーのルールによって VPC ファイアウォール ルールがプリエンプトされます。プロジェクトが、階層型ファイアウォール ポリシーが使用されているフォルダまたは組織の一部となっており、そのプロジェクトに Dataflow ジョブが含まれている場合、ポリシーを変更するには compute.orgFirewallPolicyAdmin ロールが必要です。

パイプライン コードの実行時にカスタム ネットワーク タグを作成しない場合、Dataflow VM はデフォルトの dataflow タグを使用します。カスタム ネットワーク タグなしでファイアウォール ルールを作成するには、デフォルトの dataflow タグを使用してください。

パイプライン コードの実行時にカスタム ネットワーク タグを作成した場合、Dataflow VM はそのタグを使用します。ファイアウォール ルールの作成にはカスタムタグを使用してください。

自動的に作成される default ネットワークなど、一部の VPC ネットワークには、Dataflow のファイアウォール要件を満たす default-allow-internal ルールが含まれています。

上り(内向き)ファイアウォール ルールの例

上り(内向き)ファイアウォール ルールにより、Dataflow VM 間のパケット受信が許可されます。下り(外向き)ルールでこのようなトラフィックが許可される場合でも、上り(内向き)許可ファイアウォール ルールを作成する必要があります。作成しないと、トラフィックは常にブロックされます。

次の例では、Dataflow にファイアウォール上り(内向き)ルールが作成され、すべてのワーカー VM にデフォルトのネットワーク タグ dataflow が設定されています。プロジェクト所有者、編集者、またはセキュリティ管理者は、次の gcloud コマンドを使用して、TCP ポート 12345 および 12346 で、ネットワーク タグ dataflow を持つ VM から同じタグを持つ他の VM へのトラフィックを許可する上り(内向き)許可ルールを作成できます。

gcloud compute firewall-rules create FIREWALL_RULE_NAME_INGRESS \
    --action=allow \
    --direction=ingress \
    --network=NETWORK  \
    --target-tags=CUSTOM_TAG \
    --source-tags=CUSTOM_TAG \
    --priority=PRIORITY_NUM \
    --rules tcp:12345-12346

次のように置き換えます。

  • FIREWALL_RULE_NAME_INGRESS: ファイアウォール ルールの名前

  • NETWORK: ワーカー VM が使用するネットワークの名前

  • CUSTOM_TAG: ネットワーク タグのカンマ区切りリスト

    ネットワーク タグを使用する際のガイドラインは次のとおりです。

    • --target-tags を省略すると、VPC ネットワーク内のすべての VM にルールが適用されます。

    • --source-tags と他のすべての送信元仕様を省略すると、任意の送信元からのトラフィックが許可されます。

    • カスタム ネットワーク タグを指定せずに、ルールを Dataflow VM に固有のルールにする場合は、ネットワーク タグとして dataflow を使用します。

    • カスタム ネットワーク タグを指定していて、ルールを Dataflow VM に固有のルールにする場合は、カスタム ネットワーク タグを使用します。

  • PRIORITY_NUM: ファイアウォール ルールの優先度

    数字が小さいほど優先度は高く、0 が最も優先度が高くなります。

下り(外向き)ファイアウォール ルールの例

下り(外向き)ファイアウォール ルールを使用すると、Dataflow VM 間のパケット送信を許可できます。下り(外向き)拒否のファイアウォール ルールを作成した場合は、VPC ネットワークでカスタム下り(外向き)許可ファイアウォール ルールの作成が必要になることがあります。

この例では、Dataflow 用の下り(外向き)ファイアウォール ルールが作成され、すべてのワーカー VM に dataflow というデフォルトのネットワーク タグが設定されています。プロジェクト所有者、編集者、またはセキュリティ管理者は、次の gcloud コマンドを使用して、ネットワーク タグ dataflow を持つ VM の TCP ポート 12345 および 12346 から同じタグを持つ他の VM へのトラフィックを許可する、下り(外向き)許可ルールを作成できます。

gcloud compute firewall-rules create FIREWALL_RULE_NAME_EGRESS \
    --network=NETWORK \
    --action=allow \
    --direction=egress \
    --target-tags=CUSTOM_TAG \
    --source-tags=CUSTOM_TAG \
    --destination-ranges=DESTINATION-RANGES\
    --priority=PRIORITY_NUM  \
    --rules tcp:12345-12346

次のように置き換えます。

  • FIREWALL_RULE_NAME_EGRESS: ファイアウォール ルールの名前

  • NETWORK: ワーカー VM が使用するネットワークの名前

  • CUSTOM_TAG: ネットワーク タグのカンマ区切りリスト

    ネットワーク タグを使用する際のガイドラインは次のとおりです。

    • --target-tags を省略すると、VPC ネットワーク内のすべての VM にルールが適用されます。

    • --source-tags と他のすべての送信元仕様を省略すると、任意の送信元からのトラフィックが許可されます。

    • カスタム ネットワーク タグを指定せずに、ルールを Dataflow VM に固有のルールにする場合は、ネットワーク タグとして dataflow を使用します。

    • カスタム ネットワーク タグを指定していて、ルールを Dataflow VM に固有のルールにする場合は、カスタム ネットワーク タグを使用します。

  • DESTINATION-RANGES: CIDR のカンマ区切りリスト

    選択したサブネットワークのプライマリ IP アドレス範囲を含めます。

  • PRIORITY_NUM: ファイアウォール ルールの優先度

    数字が小さいほど優先度は高く、0 が最も優先度が高くなります。

Dataflow で使用される特定の TCP ポートについては、プロジェクト コンテナ マニフェストで確認できます。コンテナ マニフェストは、ホストのポートをコンテナにマッピングするために、ポートを明示的に指定します。

ワーカー VM への SSH アクセス

Dataflow では SSH は必要ありませんが、SSH はトラブルシューティングに役立ちます。

ワーカー VM に外部 IP アドレスがある場合、 Google Cloud コンソールまたは Google Cloud CLI を使用して VM に接続できます。SSH を使用して接続するには、少なくとも、gcloud を実行しているシステムか、Google Cloud コンソールへのアクセスに使用するウェブブラウザを実行しているシステムの IP アドレスからの受信接続を、TCP ポート 22 に対して許可するファイアウォール ルールが必要です。

ネットワークの構成とアクティビティを表示するには、いずれかのワーカーで SSH セッションを開き、iproute2 を実行します。詳細については、Linux Foundation wiki の iproute2 ページをご覧ください。

内部 IP アドレスのみを持つワーカー VM に接続する必要がある場合は、内部専用 VM の接続オプションを選択するをご覧ください。

次のステップ