Estabeleça a associação ao Amazon S3

Como administrador do BigQuery, pode criar uma associação para permitir que os analistas de dados acedam aos dados armazenados em contentores do Amazon Simple Storage Service (Amazon S3).

O BigQuery Omni acede aos dados do Amazon S3 através de ligações. Cada associação tem o seu próprio utilizador único do Amazon Web Services (AWS) Identity and Access Management (IAM). Concede autorizações aos utilizadores através de funções do AWS IAM. As políticas nas funções de IAM do AWS determinam a que dados o BigQuery pode aceder para cada ligação.

As associações são necessárias para consultar os dados do Amazon S3 e exportar os resultados da consulta do BigQuery para o seu contentor do Amazon S3.

Antes de começar

Certifique-se de que criou os seguintes recursos:

Funções necessárias

Para receber as autorizações de que precisa para criar uma associação para aceder aos dados do Amazon S3, peça ao seu administrador para lhe conceder a função de IAM administrador de associações do BigQuery (roles/bigquery.connectionAdmin) no projeto. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Crie uma política de IAM do AWS para o BigQuery

Certifique-se de que segue as práticas recomendadas de segurança para o Amazon S3. Recomendamos que faça o seguinte:

  • Configure uma política da AWS que impeça o acesso ao seu contentor do Amazon S3 através de HTTP.
  • Configure uma política da AWS que impeça o acesso público ao seu contentor do Amazon S3.
  • Use a encriptação do lado do servidor do Amazon S3.
  • Limite as autorizações concedidas à Conta Google ao mínimo necessário.
  • Configure o CloudTrails e ative os eventos de dados do Amazon S3.

Para criar uma política de IAM do AWS, use a consola do AWS ou o Terraform:

Consola AWS

  1. Aceda à consola do AWS IAM. Certifique-se de que está na conta proprietária do contentor do Amazon S3 ao qual quer aceder.

    Aceda à consola do AWS IAM

  2. Selecione Políticas > Criar política (abre num novo separador).

  3. 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",
           EXPORT_PERM
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME",
            "arn:aws:s3:::BUCKET_NAME/*"
          ]
        }
     ]
    }

    Substitua o seguinte:

    • BUCKET_NAME: o contentor do Amazon S3 ao qual quer que o BigQuery aceda.
    • EXPORT_PERM (opcional): autorização adicional se quiser exportar dados para um contentor do Amazon S3. Substituir por "s3:PutObject"
      • Para separar o controlo de acesso à exportação, recomendamos que crie outra associação com uma função do IAM da AWS separada e conceda à função acesso apenas de escrita. Para um controlo de acesso mais detalhado, também pode limitar o acesso de uma função a um caminho específico do contentor.
  4. No campo Nome, introduza um nome da política, como bq_omni_read_only.

  5. Clique em Criar política.

A sua política é criada com um Nome do recurso da Amazon (ARN) no seguinte formato:

arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Substitua o seguinte:

  • AWS_ACCOUNT_ID: o número de ID do utilizador do AWS IAM da ligação.
  • POLICY_NAME: o nome da política que escolheu.

AWS CLI

Para criar uma política de IAM do AWS, use o comando aws iam create-policy:

  aws iam create-policy \
   --policy-name POLICY_NAME \
   --policy-document '{
     "Version": "2012-10-17",
     "Statement": [
        {
         "Effect": "Allow",
         "Action": [
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME"
          ]
        },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           EXPORT_PERM
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME",
            "arn:aws:s3:::BUCKET_NAME/*"
          ]
        }
     ]
    }'

Substitua o seguinte:

  • POLICY_NAME: o nome da política que está a criar.
  • BUCKET_NAME: o contentor do Amazon S3 ao qual quer que o BigQuery aceda.
  • EXPORT_PERM (opcional): autorização adicional se quiser exportar dados para um contentor do Amazon S3. Substituir por "s3:PutObject"
    • Para separar o controlo de acesso à exportação, recomendamos que crie outra associação com uma função do IAM da AWS separada e conceda à função acesso apenas de escrita. Para um controlo de acesso mais detalhado, também pode limitar o acesso de uma função a um caminho específico do contentor.

A sua política é criada com um Nome do recurso da Amazon (ARN) no seguinte formato:

arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Substitua o seguinte:

  • AWS_ACCOUNT_ID: o número de ID do utilizador do AWS IAM da ligação.
  • POLICY_NAME: o nome da política que escolheu.

Terraform

Adicione o seguinte à sua configuração do Terraform para anexar uma política a um recurso de contentor do Amazon S3:

  resource "aws_iam_policy" "bigquery-omni-connection-policy" {
    name = "bigquery-omni-connection-policy"

    policy = <<-EOF
            {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Sid": "BucketLevelAccess",
                      "Effect": "Allow",
                      "Action": ["s3:ListBucket"],
                      "Resource": ["arn:aws:s3:::BUCKET_NAME"]
                  },
                  {
                      "Sid": "ObjectLevelAccess",
                      "Effect": "Allow",
                      "Action": ["s3:GetObject",EXPORT_PERM],
                      "Resource": [
                          "arn:aws:s3:::BUCKET_NAME",
                          "arn:aws:s3:::BUCKET_NAME/*"
                          ]
                  }
              ]
            }
            EOF
  }

Substitua o seguinte:

  • BUCKET_NAME: o contentor do Amazon S3 ao qual quer que o BigQuery aceda.
  • EXPORT_PERM (opcional): autorização adicional se quiser exportar dados para um contentor do Amazon S3. Substituir por "s3:PutObject"
    • Para separar o controlo de acesso à exportação, recomendamos que crie outra associação com uma função do AWS IAM separada e conceda à função acesso apenas de escrita. Para um controlo de acesso mais detalhado, também pode limitar o acesso de uma função a um caminho específico do contentor.

Crie uma função de IAM do AWS para o BigQuery

Em seguida, crie uma função que permita o acesso ao contentor do Amazon S3 a partir do BigQuery. Esta função usa a política que criou na secção anterior.

Para criar uma função de IAM do AWS, use a consola do AWS ou o Terraform:

Consola AWS

  1. Aceda à consola do AWS IAM. Certifique-se de que está na conta proprietária do contentor do Amazon S3 ao qual quer aceder.

    Aceda à consola do AWS IAM

  2. Selecione Funções > Criar função.

  3. Em Selecionar tipo de entidade fidedigna, selecione Identidade Web.

  4. Para Fornecedor de identidade, selecione Google.

  5. Em Público-alvo, introduza 00000 como um valor de marcador de posição. Vai substituir o valor mais tarde.

  6. Clique em Seguinte: autorizações.

  7. Para conceder à função acesso aos seus dados do Amazon S3, anexe uma política do IAM à função. Pesquise a política que criou na secção anterior e clique no botão ativar/desativar.

  8. Clique em Seguinte: Etiquetas.

  9. Clique em Seguinte: rever. Introduza um nome para a função, como BQ_Read_Only.

  10. Clique em Criar função.

AWS CLI

Use o comando seguinte para criar uma função de IAM e atribuir a política à função criada:

  aws iam create-role \
   --role-name bigquery-omni-connection \
   --max-session-duration 43200 \
   --assume-role-policy-document '{
     "Version": "2012-10-17",
     "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "accounts.google.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "accounts.google.com:sub": "00000"
                }
            }
        }
    ]
}'

Terraform

Adicione o seguinte à configuração do Terraform para criar uma função do IAM e atribuir a política à função criada:

  resource "aws_iam_role" "bigquery-omni-connection-role" {
    name                 = "bigquery-omni-connection"
    max_session_duration = 43200

    assume_role_policy = <<-EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "00000"
            }
          }
        }
      ]
    }
    EOF
  }

  resource "aws_iam_role_policy_attachment" "bigquery-omni-connection-role-attach" {
    role       = aws_iam_role.bigquery-omni-connection-role.name
    policy_arn = aws_iam_policy.bigquery-omni-connection-policy.arn
  }

  output "bigquery_omni_role" {
    value = aws_iam_role.bigquery-omni-connection-role.arn
  }

Em seguida, anexe a política à função:

  aws iam attach-role-policy \
    --role-name bigquery-omni-connection \
    --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Substitua o seguinte:

  • AWS_ACCOUNT_ID: o número de ID do utilizador do AWS IAM da ligação.
  • POLICY_NAME: o nome da política que escolheu.

Crie associações

Para se ligar ao seu contentor do Amazon S3, use a Trusted Cloud consola, a ferramenta de linhas de comando bq ou a biblioteca de cliente:

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

  2. No painel Explorador, clique em Adicionar dados.

    É apresentada a caixa de diálogo Adicionar dados.

  3. No painel Filtrar por, na secção Tipo de origem de dados, selecione Armazenamento/Data Lakes.

    Em alternativa, no campo Pesquisar origens de dados, pode introduzir aws ou Amazon S3.

  4. Na secção Origens de dados em destaque, clique em Amazon S3.

  5. Clique no cartão da solução Amazon S3 Omni: federação do BigQuery.

  6. Na caixa de diálogo Criar tabela, no campo ID da associação, selecione Criar uma nova associação do S3.

  7. No painel Origem de dados externa, introduza as seguintes informações:

    • Em Tipo de associação, selecione BigLake na AWS (através do BigQuery Omni).
    • Para o ID da ligação, introduza um identificador para o recurso de ligação. Pode usar letras, números, travessões e sublinhados.
    • Para Região, selecione a localização onde quer criar a ligação.
    • Opcional: para Nome amigável, introduza um nome amigável para a associação, como My connection resource. O nome amigável pode ser qualquer valor que ajude a identificar o recurso de associação se precisar de o modificar mais tarde.
    • Opcional: em Descrição, introduza uma descrição para este recurso de ligação.
    • Para ID da função do AWS, introduza o ID da função do IAM completo que criou neste formato:
      arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
  8. Clique em Criar associação.

  9. Clique em Aceder à associação.

  10. No painel Informações da ligação, copie a identidade Google do BigQuery. Este é um principal da Google específico de cada associação. Exemplo:

      BigQuery Google identity: IDENTITY_ID
      

Terraform

  resource "google_bigquery_connection" "connection" {
    connection_id = "bigquery-omni-aws-connection"
    friendly_name = "bigquery-omni-aws-connection"
    description   = "Created by Terraform"

    location      = "AWS_LOCATION"
    aws {
      access_role {
        # This must be constructed as a string instead of referencing the
        # AWS resources directly to avoid a resource dependency cycle
        # in Terraform.
        iam_role_id = "arn:aws:iam::AWS_ACCOUNT:role/IAM_ROLE_NAME"
      }
    }
  }

Substitua o seguinte:

bq

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

Substitua o seguinte:

  • AWS_ACCOUNT_ID: o número de ID do utilizador do AWS IAM da ligação
  • ROLE_NAME: o nome da política de função que escolheu
  • AWS_LOCATION: uma localização do Amazon S3 em Trusted Cloud by S3NS
  • CONNECTION_ID: o ID que atribui a este recurso de ligação.

A linha de comandos mostra o seguinte resultado:

  Identity: IDENTITY_ID

A saída contém o seguinte:

  • IDENTITY_ID: um principal da Google que Trusted Cloud by S3NS controla o que é específico de cada associação.

Tome nota do valor IDENTITY_ID.

Java

Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

import com.google.cloud.bigquery.connection.v1.AwsAccessRole;
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";
    // Example of location: 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";
    AwsAccessRole role = AwsAccessRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setAccessRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  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);
      AwsAccessRole role = response.getAws().getAccessRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamRoleId()
              + " Aws externalId :"
              + role.getIdentity());
    }
  }
}

Adicione uma relação de confiança à função do AWS

O BigQuery Omni oferece dois métodos para aceder em segurança aos dados do Amazon S3. Pode conceder à Trusted Cloud by S3NS conta de serviço acesso à sua função da AWS ou, se a sua conta da AWS tiver um fornecedor de identidade personalizado para o accounts.google.com, tem de adicionar a Trusted Cloud by S3NS conta de serviço como um público-alvo ao fornecedor:

Adicione uma política de fidedignidade à função do AWS

A relação de confiança permite que a ligação assuma a função e aceda aos dados do Amazon S3, conforme especificado na política de funções.

Para adicionar uma relação de confiança, use a consola da AWS ou o Terraform:

Consola AWS

  1. Aceda à consola do AWS IAM. Certifique-se de que está na conta proprietária do contentor do Amazon S3 ao qual quer aceder.

    Aceda à consola do AWS IAM

  2. Selecione Funções.

  3. Selecione o ROLE_NAME que criou.

  4. Clique em Editar e, de seguida, faça o seguinte:

    1. Defina a duração máxima da sessão como 12 horas. Como cada consulta pode ser executada durante um máximo de seis horas, esta duração permite uma nova tentativa adicional. Aumentar a duração da sessão para mais de 12 horas não permite novas tentativas. Para mais informações, consulte o limite de tempo de execução de consultas/consultas com várias declarações.

      Botão Editar na AWS para definir a duração da sessão.

    2. Clique em Guardar alterações.

  5. Selecione Relações 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": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }

    Substitua IDENTITY_ID pelo valor da identidade Google do BigQuery, que pode encontrar na Trusted Cloud by S3NS consola para a associação que criou.

  6. Clique em Atualizar política de confiança.

AWS CLI

Para criar uma relação de confiança com a ligação do BigQuery, use o comando aws iam update-assume-role-policy:

  aws iam update-assume-role-policy \
    --role-name bigquery-omni-connection \
    --policy-document '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }'
  aws iam update-assume-role-policy \
    --role-name bigquery-omni-connection \
    --policy-document '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }'

Substitua o seguinte:

Terraform

Atualize o recurso aws_iam_role na configuração do Terraform para adicionar uma relação de confiança:

    resource "aws_iam_role" "bigquery-omni-connection-role" {
      name                 = "bigquery-omni-connection"
      max_session_duration = 43200

      assume_role_policy = <<-EOF
          {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Federated": "accounts.google.com"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                  "StringEquals": {
                    "accounts.google.com:sub": "${google_bigquery_connection.connection.aws[0].access_role[0].identity}"
                  }
                }
              }
            ]
          }
          EOF
    }

A ligação está agora pronta a usar.

Configure um Fornecedor de identidade da AWS personalizado

Se a sua conta da AWS tiver um fornecedor de identidade personalizado para o accounts.google.com, tem de adicionar o IDENTITY_ID como público-alvo ao fornecedor. Pode fazê-lo:

  1. Aceda à consola do AWS IAM. Certifique-se de que está na conta proprietária do contentor do Amazon S3 ao qual quer aceder.

    Aceda à consola do AWS IAM

  2. Navegue para IAM > Fornecedores de identidade.

  3. Selecione o fornecedor de identidade para accounts.google.com.

  4. Clique em Adicionar público-alvo e adicione o IDENTITY_ID como público-alvo.

A ligação está agora pronta a usar.

Partilhe ligações com utilizadores

Pode conceder as seguintes funções para permitir que os utilizadores consultem dados e geram ligações:

  • roles/bigquery.connectionUser: permite que os utilizadores usem associações para estabelecer ligação a origens de dados externas e executar consultas nas mesmas.

  • roles/bigquery.connectionAdmin: permite que os utilizadores geram associações.

Para mais informações sobre as funções e as autorizações do IAM no BigQuery, consulte o artigo Funções e autorizações predefinidas.

Selecione uma das seguintes opções:

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

    As associações são apresentadas no seu projeto, num grupo denominado Associações externas.

  2. No painel Explorador, clique no nome do projeto > Ligações externas > ligação.

  3. No painel Detalhes, clique em Partilhar para partilhar uma associação. Depois, faça o seguinte:

    1. Na caixa de diálogo Autorizações de ligação, partilhe a ligação com outros responsáveis adicionando ou editando responsáveis.

    2. Clique em Guardar.

bq

Não pode partilhar uma ligação com a ferramenta de linhas de comando bq. Para partilhar uma associação, use a Trusted Cloud consola ou o método da API BigQuery Connections para partilhar uma associação.

API

Use o método projects.locations.connections.setIAM na secção de referência da API REST BigQuery Connections e forneça uma instância do recurso policy.

Java

Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

O que se segue?