Configurar o acesso a uma fonte: Amazon S3

É possível configurar o acesso a um bucket do Amazon S3 usando um destes dois métodos:

Regiões com suporte

O Serviço de transferência do Cloud Storage pode transferir dados das seguintes regiões do Amazon S3: af-south-1, ap-east-1, ap-northeast-1, ap-northeast-2, ap-northeast-3, ap-south-1, ap-south-2, ap-southeast-1, ap-southeast-2, ap-southeast-3, ca-central-1, eu-central-1, eu-central-2, eu-north-1, eu-south-1, eu-south-2, eu-west-1, eu-west-2, eu-west-3, me-central-1, me-south-1, sa-east-1, us-east-1, us-east-2, us-west-1, us-west-2.

Permissões necessárias

Para usar o Serviço de transferência do Cloud Storage para mover dados de um bucket do Amazon S3, sua conta de usuário ou papel de identidade federado precisa ter as permissões apropriadas para o bucket:

Permissão Descrição Uso
s3:ListBucket Permite a listagem de objetos no bucket pelo Storage Transfer Service. Sempre obrigatório.
s3:GetObject Permite a leitura de objetos no bucket pelo Storage Transfer Service. Obrigatório se você estiver transferindo a versão atual de todos os objetos. Se o manifesto especificar uma versão do objeto, use s3:GetObjectVersion.
s3:GetObjectVersion Permite que o Serviço de transferência do Cloud Storage leia versões específicas de objetos no bucket. Obrigatório se o manifesto especificar uma versão do objeto. Do contrário, use s3:GetObject.
s3:DeleteObject Permite a exclusão de objetos no bucket pelo Serviço de transferência do Cloud Storage. Obrigatório se você definir deleteObjectsFromSourceAfterTransfer como true.

Autenticar usando as credenciais de acesso

Para usar um ID de chave de acesso e uma chave secreta para autenticar na AWS, siga estas etapas:

  1. Crie um usuário do gerenciamento de identidade e acesso da AWS (IAM) com um nome que você possa reconhecer facilmente, como transfer-user.

  2. Em Tipo de acesso da AWS, selecione Chave de acesso - Acesso programático.

  3. Atribua um dos seguintes papéis ao usuário:

    • AmazonS3ReadyOnlyAccess para fornecer acesso somente leitura à fonte. Isso permite transferências, mas não oferece suporte a exclusão de objetos na fonte após a conclusão da transferência.
    • AmazonS3FullAccess se a transferência estiver configurada para excluir objetos na fonte.
    • Um papel personalizado com as permissões apropriadas da tabela Permissões necessárias acima. O JSON das permissões mínimas é semelhante ao exemplo abaixo:

      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::AWS_BUCKET_NAME/*",
                    "arn:aws:s3:::AWS_BUCKET_NAME"
                ]
            }
        ]
      }
  4. Anote o ID da chave de acesso e a chave de acesso secreta quando o usuário for criado.

A forma como você transmite o ID da chave de acesso e a chave de acesso secreta para o Serviço de transferência do Cloud Storage depende da interface usada para iniciar a transferência.

console do Cloud

Insira os valores diretamente no formulário de criação do job de transferência.

Consulte Criar transferências para começar.

CLI da gcloud

Crie um arquivo JSON com o seguinte conteúdo:

{
  "accessKeyId": "AWS_ACCESS_KEY_ID",
  "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}

Transmita o local do arquivo para o comando gcloud transfer jobs create usando a sinalização source-creds-file:

gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
  --source-creds-file=PATH/TO/KEYFILE.JSON

API REST

O objeto transferSpec precisa conter as informações da chave como parte do objeto awsS3DataSource:

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "awsAccessKey": {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
  },
  "gcsDataSink": {
    "bucketName": "GCS_SINK_NAME"
  }
}

Bibliotecas de cliente

Veja os exemplos na página Criar transferências.

Salvar suas credenciais de acesso no Secret Manager

O Secret Manager é um serviço seguro que armazena e gerencia dados sensíveis, como senhas. Ele usa controle de acesso baseado em papéis, geração de registros de auditoria e criptografia forte para proteger os secrets.

O Serviço de transferência do Cloud Storage pode aproveitar o Secret Manager para proteger suas credenciais de acesso à AWS. Carregue seu token no Secret Manager e, em seguida, transmita o nome do recurso do secret para o Serviço de transferência do Cloud Storage.

Ativar a API

Enable the Secret Manager API.

Enable the API

Configurar outras permissões

Permissões do usuário

O usuário que cria o secret requer o seguinte papel:

  • Administrador do Secret Manager (roles/secretmanager.admin)

Saiba como conceder um papel.

Permissões do agente de serviço

O agente de serviço do Serviço de transferência do Cloud Storage requer o seguinte papel do IAM:

  • Acessador de secrets do Secret Manager (roles/secretmanager.secretAccessor)

Para conceder o papel ao agente de serviço:

console do Cloud

  1. Siga as instruções para recuperar seu e-mail do agente de serviço.

  2. Acesse a página IAM no Console do Google Cloud.

    Acessar IAM

  3. Clique em Conceder acesso.

  4. Na caixa de texto Novos principais, digite o e-mail do agente de serviço.

  5. No menu suspenso Selecionar um papel, pesquise e selecione Acessador de secrets do Secret Manager.

  6. Clique em Save.

gcloud

Use o comando gcloud projects add-iam-policy-binding para adicionar o papel do IAM ao agente de serviço.

  1. Siga as instruções para recuperar seu e-mail do agente de serviço.

  2. Na linha de comando, insira o seguinte comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:SERVICE_AGENT_EMAIL' \
      --role='roles/secretmanager.secretAccessor'
    

Criar um secret

Crie um secret com o Secret Manager:

console do Cloud

  1. Acesse a página do Secret Manager no console do Google Cloud:

    Acessar o Secret Manager

  2. Clique em Criar secret.

  3. Digite um nome.

  4. Na caixa de texto Valor do secret, insira suas credenciais no seguinte formato:

    {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
    
  5. Clique em Criar secret.

  6. Depois de criar o secret, anote o nome completo do recurso do secret:

    1. Selecione a guia Visão geral.

    2. Copie o valor de ID do recurso. Ele usa o seguinte formato:

      projects/1234567890/secrets/SECRET_NAME

gcloud

Para criar um novo secret usando a ferramenta de linha de comando gcloud, transmita as credenciais formatadas como JSON para o comando gcloud secrets create:

printf '{
  "accessKeyId": "AWS_ACCESS_KEY_ID",
  "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}' | gcloud secrets create SECRET_NAME --data-file=-

Recupere o nome completo do recurso do secret:

gcloud secrets describe SECRET_NAME

Anote o valor de name na resposta. Ele usa o seguinte formato:

projects/1234567890/secrets/SECRET_NAME

Para mais detalhes sobre como criar e gerenciar secrets, consulte a documentação do Secret Manager.

Transmitir seu secret para o comando de criação de job

Para usar o Secret Manager com o Serviço de transferência do Cloud Storage, é necessário usar a API REST a fim de criar um job de transferência.

Transmita o nome do recurso do Secret Manager igual ao valor do campo transferSpec.awsS3DataSource.credentialsSecret:

POST https://storagetransfer.googleapis.com/v1/transferJobs

{
  "description": "Transfer with Secret Manager",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
      "awsS3DataSource": {
          "bucketName": "AWS_BUCKET_NAME",
          "credentialsSecret": "SECRET_RESOURCE_ID",
      },
      "gcsDataSink": {
          "bucketName": "CLOUD_STORAGE_BUCKET_NAME"
      }
  }
}

Autenticar usando a identidade federada

Para usar a identidade federada a fim de autenticar na AWS:

  1. Crie um novo papel do IAM na AWS.

  2. Selecione Política de confiança personalizada como o tipo de entidade confiável.

  3. Copie e cole a seguinte política de confiança:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "SUBJECT_ID"
            }
          }
        }
      ]
    }
    
  4. Substitua SUBJECT_ID pelo subjectID da conta de serviço gerenciada pelo Google que é criada automaticamente ao usar o Serviço de transferência do Cloud Storage. Para recuperar o subjectID:

    1. Acesse a página de referência de googleServiceAccounts.get.

      Você verá um painel interativo com o título Testar este método.

    2. No painel, em Parâmetros de solicitação, insira o ID do projeto. O projeto especificado aqui precisa ser o que você está usando para gerenciar o Serviço de transferência do Cloud Storage.

    3. Clique em Execute. O subjectId é incluído na resposta.

  5. Conceda uma das seguintes políticas de permissões ao papel:

    • AmazonS3ReadOnlyAccess fornece acesso somente leitura à fonte. Isso permite transferências, mas não oferece suporte a exclusão de objetos na fonte após a conclusão da transferência.
    • AmazonS3FullAccess se a transferência estiver configurada para excluir objetos na fonte.
    • Um papel personalizado com as permissões apropriadas da tabela Permissões necessárias acima. O JSON das permissões mínimas é semelhante ao exemplo abaixo:

      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::AWS_BUCKET_NAME/*",
                    "arn:aws:s3:::AWS_BUCKET_NAME"
                ]
            }
        ]
      }
  6. Atribua um nome à função e crie a função.

  7. Depois de criado, veja os detalhes do papel para recuperar o Nome do Recurso da Amazon (ARN, na sigla em inglês). Anote esse valor, ele tem o formato arn:aws:iam::AWS_ACCOUNT:role/ROLE_NAME.

A forma como você transmite o ARN para o Serviço de transferência do Cloud Storage depende da interface usada para iniciar a transferência.

console do Cloud

Insira o ARN diretamente no formulário de criação do job de transferência.

Consulte Criar transferências para começar.

CLI da gcloud

Crie um arquivo JSON com o seguinte conteúdo:

{
  "roleArn": "ARN"
}

Transmita o local do arquivo para o comando gcloud transfer jobs create usando a sinalização source-creds-file:

gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
  --source-creds-file=PATH/TO/ARNFILE.JSON

API REST

Seu objeto transferSpec precisa conter as informações de ARN como parte do objeto awsS3DataSource:

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "roleArn": "ARN"
  },
  "gcsDataSink": {
    "bucketName": "GCS_SINK_NAME"
  }
}

Bibliotecas de cliente

Veja os exemplos na página Criar transferências.

Restrições de IP

Se o projeto da AWS usar restrições de IP para acessar o armazenamento, será necessário adicionar os intervalos de IP usados pelos workers do Serviço de transferência do Cloud Storage à lista de IPs permitidos.

Como esses intervalos de IP podem mudar, publicamos os valores atuais como um arquivo JSON em um endereço permanente:

https://www.gstatic.com/storage-transfer-service/ipranges.json

Quando um novo intervalo é adicionado ao arquivo, aguardamos pelo menos sete dias antes de usá-lo para solicitações do Storage Transfer Service.

Recomendamos que você extraia os dados deste documento pelo menos uma vez por semana para manter a configuração de segurança atualizada. Para uma amostra de script Python que busque intervalos de IP de um arquivo JSON, consulte este artigo da documentação da nuvem privada virtual.

Para adicionar esses intervalos como IPs permitidos, use o campo Condition em uma política de bucket, conforme descrito na documentação do AWS S3: Como gerenciar o acesso com base em endereços IP específicos.