Como criar uma conexão do BigQuery com a AWS

O BigQuery Omni acessa os dados do Amazon S3 por meio de conexões. Cada conexão tem um usuário único do Identity and Access Management (IAM) da Amazon Web Services (AWS). Você concede permissões aos usuários por meio de papéis do IAM da AWS. As políticas nos papéis do IAM da AWS determinam quais dados o BigQuery pode acessar para cada conexão.

Antes de começar

Certifique-se criar os seguintes recursos:

Como criar um papel do IAM da AWS para o BigQuery

Siga as práticas recomendadas de segurança para o Amazon S3. Portanto, recomendamos que você faça o seguinte:

  • Configure uma política da AWS que impeça o acesso ao bucket do S3 por HTTP.
  • Configure uma política da AWS que impeça o acesso público ao bucket do S3.
  • Criptografe o servidor do S3.
  • Limite o mínimo de permissões concedidas à Conta do Google.
  • Configure o CloudTrails e ative eventos de dados do S3.

Para criar um papel do IAM da AWS, siga estas etapas:

  1. Acesse o console do Identity and Access Management (IAM) da AWS. Verifique se você está na conta proprietária do bucket do S3 que você quer acessar.
  2. Selecione Papéis > Criar papel.
  3. Em Selecionar o tipo de entidade confiável, selecione Outra conta da AWS.
  4. Em ID da conta, insira o ID numérico da conta da AWS. Posteriormente, você substituirá esse valor pelo número de ID do usuário do IAM da AWS para a conexão.
  5. Selecione Exigir ID externo e insira 00000 como um valor de marcador. Posteriormente, você substituirá esse valor pelo ID externo da conexão.
  6. Clique em Próximo: permissões.
  7. Para conceder o papel de acesso aos dados da AWS, crie uma política do IAM e anexe-a ao papel. Por exemplo, crie uma política do IAM que forneça acesso somente leitura ao bucket.

    1. Selecione Políticas > Criar política (será aberto em uma nova guia).
    2. Clique em JSON e cole o seguinte no editor.
    {
    "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/*"]
      }
    ]
    }
    

    Substitua:

    • BUCKET_NAME: o bucket do S3 que você quer que o BigQuery acesse.
  8. No campo Nome, digite um nome de política.

  9. Para criar a política de acesso ao S3, clique em Criar política.

  10. Para anexar a política ao papel, na guia Criar papel, selecione a política.

  11. No campo Nome, insira um nome para o papel.

  12. Clique em Criar papel.

A política será criada com um Amazon Resource Name (ARN) no seguinte formato:

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

Substitua:

  • AWS_ACCOUNT_ID: o número do ID do usuário do IAM da AWS da conexão.
  • ROLE_NAME: o nome do papel que você escolheu.

Caso precise exportar dados para um bucket do Amazon S3, também precisará da permissão s3:PutObject. Para separar o controle de acesso, recomendamos que você crie outra conexão com um papel do IAM da AWS e conceda o acesso somente de gravação. Para um controle de acesso mais granular, também é possível limitar o acesso de um papel a um caminho específico do bucket.

Como criar a conexão da AWS com o BigQuery

Para criar uma conexão da AWS com o BigQuery, use o Console do Cloud, a ferramenta de linha de comando bq ou a biblioteca de cliente:

Console

  1. Para criar um recurso de conexão, acesse a página do BigQuery no Console do Cloud.

    Acesse a página do BigQuery

  2. No menu Adicionar dados, selecione Fonte de dados externa.

  3. No painel Fonte de dados externa, insira as seguintes informações:

    • Em Tipo de conexão, selecione AWS.
    • Em ID da conexão, insira um identificador para o recurso de conexão. Use letras, números, traços e sublinhados.
    • Em Local da conexão, selecione aws-us-east-1.
    • (Opcional) Em Nome amigável, insira um nome fácil de usar para a conexão, como My connection resource. O nome intuitivo pode ser qualquer valor que ajude você a identificar o recurso de conexão se precisar modificá-lo mais tarde.
    • (Opcional) Em Descrição, insira uma descrição para este recurso de conexão.
    • Em ID do papel da AWS, insira o ID completo do papel do IAM que você criou neste formato: arn:aws:iam:: AWS_ACCOUNT_ID:role/ROLE_NAME.
  4. Clique em Criar conexão. A linha de comando mostra a seguinte saída:

        IAM user: USER_ID
        External Id: EXTERNAL_ID
      

    A saída contém o seguinte:

    • USER_ID: um usuário da AWS controlado pelo Google Cloud para cada conexão.
    • EXTERNAL_ID: uma string exclusiva que é atribuída a cada conexão.

      Anote os valores USER_ID e EXTERNAL_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

Substitua:

  • AWS_ACCOUNT_ID: o número do ID do usuário do IAM da AWS da conexão.
  • ROLE_NAME: o nome da política de papéis que você escolheu.
  • AWS_LOCATION: um local da AWS no Google Cloud. Precisa ser definido como aws-us-east-1.
  • CONNECTION_NAME: nome que você der a esse recurso de conexão.

A linha de comando mostra a seguinte saída:

  IAM user: USER_ID
  External Id: EXTERNAL_ID

A saída contém o seguinte:

  • USER_ID: um usuário da AWS controlado pelo Google Cloud para cada conexão.
  • EXTERNAL_ID: uma string exclusiva que é atribuída a cada conexão.

Anote os valores USER_ID e EXTERNAL_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());
    }
  }
}

Como adicionar um relacionamento de confiança ao papel da AWS

O relacionamento de confiança permite que a conexão entre o BigQuery a AWS use o papel e acesse os dados do S3, conforme especificado na política de papéis.

Adicionar um relacionamento de confiança:

  1. Acesse o console do IAM da AWS. Verifique se você está na conta proprietária do bucket do S3 que você quer acessar.
  2. Selecione Papéis.
  3. Selecione o ROLE_NAME que você criou.
  4. Defina a Duração máxima da sessão de CLI/API como 12 horas.
  5. Selecione Relacionamentos de confiança e clique em Editar relação de confiança. Substitua o conteúdo da política pelo seguinte:

    {
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": "GOOGLE_AWS_USER"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "EXTERNAL_ID"
          }
        }
    }]
    }
    
  6. Clique em Atualizar política de confiança.

A conexão está pronta para ser usada.

A seguir