BigQuery AWS 接続の作成

BigQuery Omni は、接続を介して Amazon S3 のデータにアクセスします。接続ごとに独自の Amazon Web Services(AWS)の Identity and Access Management(IAM)ユーザーが設定されています。AWS IAM のロールを使用してユーザーに権限を付与します。AWS IAM ロールのポリシーにより、それぞれの接続で BigQuery がアクセスできるデータが決まります。

始める前に

次のリソースが作成されていることを確認します。

BigQuery の AWS IAM ポリシーを作成する

Amazon S3 のセキュリティに関するベスト プラクティスに従ってください。次の手順を行うことをおすすめします。

  • HTTP 経由での S3 バケットへのアクセスを防ぐ AWS ポリシーを設定します。
  • S3 バケットへの公開アクセスを防ぐ AWS ポリシーを設定します。
  • S3 サーバー側で暗号化を使用します。
  • Google アカウントに付与する権限を必要最小限のものにします。
  • CloudTrails を設定し、S3 データイベントを有効にします。

AWS IAM ポリシーを作成するには、次の手順に従います。

  1. AWS Identity and Access Management(IAM)コンソールに移動します。アクセスする S3 バケットを所有しているアカウントにログインしていることを確認します。
  2. [Policies] > [Create policy] を選択します(新しいタブが開きます)。
  3. [JSON] をクリックして、次の内容をエディタに貼り付けます。
    {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": ["s3:ListBucket"],
        "Resource": ["arn:aws:s3:::BUCKET_NAME"]
      },
      {
        "Effect": "Allow",
        "Action": [
          "s3:GetObject"
        ],
        "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
      }
    ]
    }
    
    次のように置き換えます。
  • BUCKET_NAME: BigQuery でアクセスする S3 バケット。
  1. [Name] フィールドに、「bq_omni_read_only」などのポリシー名を入力します。
  2. [Create policy] をクリックします。

ポリシーが次の形式の Amazon Resource Name(ARN)で作成されます。

  arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
  

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

  • AWS_ACCOUNT_ID: 接続の AWS IAM ユーザーの ID 番号。
  • ROLE_NAME: 選択したロール名。

Amazon S3 バケットにデータをエクスポートする必要がある場合は、s3:PutObject 権限も必要です。アクセス制御を分離するには、個別の AWS IAM ロールで別の接続を作成し、ロールに書き込み専用アクセス権を付与することをおすすめします。バケットの特定のパスに対するロールのアクセス権を制限すれば、よりきめ細かいアクセス制御を行うことができます。

BigQuery の AWS IAM ロールを作成する

次に、BigQuery 内から AWS バケットへのアクセスを許可するロールを作成します。このロールは、前のセクションで作成したポリシーを使用します。

AWS IAM ロールを作成するには:

  1. AWS IAM コンソールに移動します。アクセスする S3 バケットを所有しているアカウントにログインしていることを確認します。
  2. [Roles] > [Create role] を選択します。
  3. [Select an trusted entity] で、[Another AWS account] を選択します。
  4. [Account ID] に AWS アカウントの数値 ID を入力します。後で、この値を接続の AWS IAM ユーザーの ID 番号に置き換えます。
  5. [Require External ID] を選択し、プレースホルダ値として「00000」と入力します。値は後で置き換えます。
  6. [Next: Permissions] をクリックします。
  7. AWS データに対するアクセス権をロールに付与するには、IAM ポリシーをロールに接続します。前のセクションで作成したポリシーを検索し、切り替えボタンをクリックします。
  8. [Next: Tags] をクリックします。
  9. [Next: Review] をクリックします。ロールの名前を入力します(例: BQ_Read_Only)。
  10. [Create role] をクリックします。

BigQuery AWS 接続の作成

BigQuery AWS 接続を作成するには、Cloud Console、bq コマンドライン ツール、またはクライアント ライブラリを使用します。

Console

  1. 接続リソースを作成するには、Cloud Console の [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [データを追加] メニューで [外部データソース] を選択します。

  3. [外部データソース] ペインで、次の情報を入力します。

    • [接続タイプ] で、AWS を選択します。
    • [接続 ID] に、接続リソースの識別子を入力します。文字、数字、ダッシュ、アンダースコアを使用できます。
    • [接続ロケーション] で aws-us-east-1 を選択します。
    • (省略可)[わかりやすい名前] に、わかりやすい接続名を入力します(例: My connection resource)。後で修正が必要になった場合、わかりやすい名前だと接続リソースを簡単に識別できます。
    • (省略可)[説明] に、この接続リソースの説明を入力します。
    • [AWS ロール ID] に、作成した IAM ロール ID を arn:aws:iam:: AWS_ACCOUNT_ID:role/ROLE_NAME の形式で入力します。
  4. [接続を作成] をクリックします。コマンドラインで次の出力が表示されます。

        BigQuery AWS user id: USER_ID
        BigQuery AWS external id: EXTERNAL_ID
      

    出力には次のものが含まれます。

    • USER_ID: Google Cloud が接続ごとに制御する AWS ユーザー。
    • EXTERNAL_ID: 各接続に割り当てられた一意の文字列。

      USER_IDEXTERNAL_ID の値をメモしておきます。

bq

bq mk --connection --connection_type='AWS' \
--iam_role_id=arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME \
--location=AWS_LOCATION \
CONNECTION_NAME

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

  • AWS_ACCOUNT_ID: 接続の AWS IAM ユーザーの ID 番号。
  • ROLE_NAME: 選択したロールのポリシー名。
  • AWS_LOCATION: Google Cloud の AWS ロケーション。aws-us-east-1 に設定します。
  • CONNECTION_NAME: この接続リソースに付ける名前。

コマンドラインで次の出力が表示されます。

  IAM user: USER_ID
  External Id: EXTERNAL_ID

出力には次のものが含まれます。

  • USER_ID: Google Cloud が接続ごとに制御する AWS ユーザー。
  • EXTERNAL_ID: 各接続に割り当てられた一意の文字列。

USER_IDEXTERNAL_ID の値をメモしておきます。

Java

import com.google.cloud.bigquery.connection.v1.AwsCrossAccountRole;
import com.google.cloud.bigquery.connection.v1.AwsProperties;
import com.google.cloud.bigquery.connection.v1.Connection;
import com.google.cloud.bigquery.connection.v1.CreateConnectionRequest;
import com.google.cloud.bigquery.connection.v1.LocationName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import java.io.IOException;

// Sample to create aws connection
public class CreateAwsConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    // Note: As of now location only supports aws-us-east-1
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    // Example of role id arn:aws:iam::accountId:role/myrole
    String iamRoleId = "MY_AWS_ROLE_ID";
    AwsCrossAccountRole role = AwsCrossAccountRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setCrossAccountRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  public static void createAwsConnection(
      String projectId, String location, String connectionId, Connection connection)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      LocationName parent = LocationName.of(projectId, location);
      CreateConnectionRequest request =
          CreateConnectionRequest.newBuilder()
              .setParent(parent.toString())
              .setConnection(connection)
              .setConnectionId(connectionId)
              .build();
      Connection response = client.createConnection(request);
      AwsCrossAccountRole role = response.getAws().getCrossAccountRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamUserId()
              + " Aws externalId :"
              + role.getExternalId());
    }
  }
}

AWS ロールへの信頼関係の追加

信頼関係により、ロールポリシーで指定されているロールと S3 データへのアクセス権を BigQuery AWS 接続で使用します。

信頼関係を追加します。

  1. AWS IAM コンソールに移動します。アクセスする S3 バケットを所有しているアカウントにログインしていることを確認します。
  2. [Roles] を選択します。
  3. 作成した ROLE_NAME を選択します。
  4. [Maximum CLI/API session duration] を 12 時間に設定します。
  5. [Trust Relationships] を選択し、[Edit trust relationship] をクリックします。ポリシーの内容を次のもので置き換えます。

    {
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": "GOOGLE_AWS_USER"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "EXTERNAL_ID"
          }
        }
    }]
    }
    
  6. [Update Trust Policy] をクリックします。

これで接続が使用できるようになりました。

次のステップ

  • 接続の操作の詳細については、接続の操作をご覧ください。