创建 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. 点击创建政策

您的政策即创建完毕,并使用如下格式的 Amazon 资源名称 (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 type of 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. 点击下一步:审核。输入角色的名称,例如 BQ_Read_Only
  10. 点击 Create role

创建 BigQuery AWS 连接

如需创建 BigQuery AWS 连接,请使用 Cloud Console、bq 命令行工具或客户端库:

控制台

  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 角色添加信任关系

信任关系可让 BigQuery AWS 连接担任相应角色并访问角色政策中指定的 S3 数据。

添加信任关系:

  1. 转到 AWS IAM 控制台。确保您使用的帐号拥有要访问的 S3 存储分区。
  2. 选择 Roles
  3. 选择您创建的 ROLE_NAME
  4. Maximum CLI/API session duration 设置为 12 hours
  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

连接现在可以使用了。

后续步骤

  • 如需详细了解如何处理连接,请参阅处理连接