Configura el acceso a una fuente: Amazon S3

Puedes configurar el acceso a un bucket de Amazon S3 mediante uno de estos dos métodos:

Regiones admitidas

El Servicio de transferencia de almacenamiento puede transferir datos de las siguientes regiones de 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, ap-northeast-1/, ap-northeast-1/, ap-northeast-1, ap-northeast-1/.eu-west-3me-central-1me-south-1sa-east-1us-east-1us-east-2us-west-1us-west-2

Permisos necesarios

A fin de usar el Servicio de transferencia de almacenamiento para mover datos desde un bucket de Amazon S3, tu cuenta de usuario o función de identidad federada debe tener los permisos adecuados para el bucket:

Permiso Descripción Use
s3:ListBucket Permite que Servicio de transferencia de almacenamiento enumere objetos en el bucket. Uso obligatorio.
s3:GetObject Permite que Servicio de transferencia de almacenamiento lea objetos en el bucket. Es obligatorio si transfieres la versión actual de todos los objetos. Si el manifiesto especifica una versión de objeto, usa s3:GetObjectVersion en su lugar.
s3:GetObjectVersion Permite que Servicio de transferencia de almacenamiento lea versiones específicas de objetos en el bucket. Obligatorio si tu manifiesto especifica una versión de objeto. De lo contrario, usa s3:GetObject.
s3:DeleteObject Permite que Servicio de transferencia de almacenamiento borre objetos en el bucket. Se requiere si establece deleteObjectsFromSourceAfterTransfer en true.

Autentica con credenciales de acceso

Sigue estos pasos para usar un ID de clave de acceso y una clave secreta a fin de autenticar en AWS:

  1. Crea un usuario de administración de identidades y accesos de AWS (IAM de AWS) con un nombre que puedas reconocer fácilmente, como transfer-user.

  2. En el tipo de acceso de AWS, selecciona Clave de acceso: acceso programático.

  3. Otorga al usuario uno de los siguientes roles:

    • AmazonS3ReadOnlyAccess para proporcionar acceso de solo lectura a la fuente. Esto permite transferencias, pero no la eliminación de objetos en el origen una vez que se completa la transferencia.
    • AmazonS3FullAccess si la transferencia está configurada para borrar objetos en la fuente.
    • Una función personalizada con los permisos adecuados de la tabla Permisos necesarios anterior El JSON para los permisos mínimos se parece al siguiente ejemplo:

      {
        "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. Ten en cuenta el ID de clave de acceso y la clave de acceso secreta cuando el usuario se cree correctamente.

La forma en que pasas el ID de la clave de acceso y la clave de acceso secreta al Servicio de transferencia de almacenamiento depende de la interfaz que usas para iniciar la transferencia.

consola de Cloud

Ingresa los valores directamente en el formulario de creación del trabajo de transferencia.

Consulta Cómo crear transferencias para comenzar.

gcloud CLI

Crea un archivo JSON con el siguiente formato:

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

Pasa la ubicación del archivo al comando gcloud transfer jobs create con la marca source-creds-file:

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

API de REST

Tu objeto transferSpec debe contener la información de clave como parte del 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 cliente

Consulta los ejemplos en la página Crea transferencias.

Guarda tus credenciales de acceso en Secret Manager

Secret Manager es un servicio seguro que almacena y administra datos sensibles, como las contraseñas. Usa encriptación sólida, control de acceso basado en funciones y registro de auditoría para proteger tus secretos.

El Servicio de transferencia de almacenamiento puede aprovechar Secret Manager para proteger tus credenciales de acceso de AWS. Carga las credenciales en Secret Manager y, luego, pasa el nombre del recurso del secreto al Servicio de transferencia de almacenamiento.

Habilitar la API

Habilita la API de Secret Manager.

Habilita la API

Configura permisos adicionales

Permisos de usuario

El usuario que crea el secreto requiere el siguiente rol:

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

Aprende a otorgar un rol.

Permisos del agente de servicio

El agente de servicio del Servicio de transferencia de almacenamiento requiere el siguiente rol de IAM:

  • Descriptor de acceso a secretos de Secret Manager (roles/secretmanager.secretAccessor)

Para otorgar el rol a tu agente de servicio, sigue estos pasos:

consola de Cloud

  1. Sigue las instrucciones para recuperar el correo electrónico del agente de servicio.

  2. Ve a la página de IAM en la consola de Google Cloud.

    Ir a IAM

  3. Haz clic en Grant access.

  4. En el cuadro de texto Principales nuevas, ingresa el correo electrónico del agente de servicio.

  5. En el menú desplegable Selecciona un rol, busca y selecciona Secret Manager Secret Accessor.

  6. Haz clic en Guardar.

gcloud

Usa el comando gcloud projects add-iam-policy-binding para agregar la función de IAM a tu agente de servicio.

  1. Sigue las instrucciones para recuperar el correo electrónico del agente de servicio.

  2. En la línea de comandos, ingresa el siguiente comando:

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

Crea un secreto

Crea un secreto con Secret Manager:

consola de Cloud

  1. Ve a la página Secret Manager en la consola de Google Cloud.

    Ir a Secret Manager

  2. Haz clic en Crear secreto.

  3. Ingresa un nombre.

  4. En el cuadro de texto Valor del secreto, ingresa tus credenciales en el siguiente formato:

    {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
    
  5. Haz clic en Crear secreto.

  6. Una vez que se haya creado el Secret, toma nota del nombre completo del recurso:

    1. Selecciona la pestaña Descripción general.

    2. Copia el valor de ID del recurso. Usa el siguiente formato:

      projects/1234567890/secrets/SECRET_NAME

gcloud

Para crear un secreto nuevo con la herramienta de línea de comandos de gcloud, pasa las credenciales con formato JSON al comando gcloud secrets create:

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

Recupera el nombre completo del recurso del Secret:

gcloud secrets describe SECRET_NAME

Anota el valor de name en la respuesta. Usa el siguiente formato:

projects/1234567890/secrets/SECRET_NAME

Para obtener más información sobre cómo crear y administrar secretos, consulta la documentación de Secret Manager.

Pasa tu secreto al comando de creación de trabajos

El uso de Secret Manager con el Servicio de transferencia de almacenamiento requiere el uso de la API de REST para crear un trabajo de transferencia.

Pasa el nombre del recurso de Secret Manager como el valor del 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"
      }
  }
}

Autentica con una identidad federada

Si quieres usar la identidad federada para autenticarte en AWS, sigue estos pasos:

  1. Crea un nuevo rol de IAM en AWS.

  2. Selecciona Política de confianza personalizada como el tipo de entidad de confianza.

  3. Copia y pega la siguiente política de confianza:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "SUBJECT_ID"
            }
          }
        }
      ]
    }
    
  4. Reemplaza SUBJECT_ID por el subjectID de la cuenta de servicio administrada por Google que se crea automáticamente cuando comienzas a usar el Servicio de transferencia de almacenamiento. Para recuperar el subjectID, haz lo siguiente:

    1. Ve a la página de referencia de googleServiceAccounts.get.

      Se abrirá un panel interactivo con el título Prueba este método.

    2. En el panel, en Parámetros de solicitud, ingresa el ID del proyecto. El proyecto que especifiques aquí debe ser el que usas para administrar el Servicio de transferencia de almacenamiento.

    3. Haz clic en Ejecutar. El subjectId se incluye en la respuesta.

  5. Otorga una de las siguientes políticas de permisos al rol:

    • AmazonS3ReadOnlyAccess proporciona acceso de solo lectura a la fuente. Esto permite transferencias, pero no la eliminación de objetos en el origen una vez que se completa la transferencia.
    • AmazonS3FullAccess si la transferencia está configurada para borrar objetos en la fuente.
    • Una función personalizada con los permisos adecuados de la tabla Permisos necesarios anterior El JSON para los permisos mínimos se parece al siguiente ejemplo:

      {
        "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. Asígnale un nombre al rol y créalo.

  7. Una vez creada, consulta los detalles de la función para recuperar el nombre de recurso de Amazon (ARN). Observa este valor; tiene el formato arn:aws:iam::AWS_ACCOUNT:role/ROLE_NAME.

La forma de pasar el ARN al Servicio de transferencia de almacenamiento depende de la interfaz que usas para iniciar la transferencia.

consola de Cloud

Ingresa el ARN directamente en el formulario de creación del trabajo de transferencia.

Consulta Cómo crear transferencias para comenzar.

gcloud CLI

Crea un archivo JSON con el siguiente formato:

{
  "roleArn": "ARN"
}

Pasa la ubicación del archivo al comando gcloud transfer jobs create con la marca source-creds-file:

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

API de REST

Tu objeto transferSpec debe contener la información de ARN como parte del objeto awsS3DataSource:

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

Bibliotecas cliente

Consulta los ejemplos en la página Crea transferencias.

Restricciones de IP

Si tu proyecto de AWS usa restricciones de IP para acceder al almacenamiento, debes agregar los rangos de IP que usan los trabajadores del Servicio de transferencia de almacenamiento a tu lista de IP permitidas.

Debido a que estos rangos de IP pueden cambiar, publicamos los valores actuales como un archivo JSON en una dirección permanente:

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

Cuando se agrega un rango nuevo al archivo, esperaremos al menos 7 días antes de usarlo para solicitudes del Servicio de transferencia de almacenamiento.

Te recomendamos que extraigas datos de este documento al menos una vez por semana para mantener actualizada la configuración de seguridad. Para ver una secuencia de comandos de Python de muestra que recupera rangos de IP desde un archivo JSON, consulta este artículo de la documentación de la nube privada virtual.

Para agregar estos rangos como IP permitidas, usa el campo Condition en una política de bucket, como se describe en la documentación de AWS S3: Administra el acceso según direcciones IP específicas.