Criar um servidor SFTP externo

Neste documento, mostramos como criar um servidor SFTP externo usando o Cloud FTP. Um servidor SFTP externo pode ser acessado pela Internet. Os parceiros que estão fora da sua rede podem usar o servidor para transferir arquivos com segurança de e para o Cloud Storage.

É possível restringir o acesso a um servidor SFTP externo com base nos endereços IP dos usuários.

Para saber como criar um servidor interno, que só pode ser acessado na sua rede de nuvem privada virtual (VPC), consulte Criar um servidor SFTP interno. Não é possível mudar se um servidor é externo ou interno depois que ele é criado.

Antes de começar

Console

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud FTP API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. Se você quiser restringir o acesso ao servidor com base nos endereços IP dos usuários, colete uma lista de blocos CIDR que têm permissão para acessar o servidor.

gcloud

  1. Instale a CLI do Google Cloud.

  2. Configure a CLI gcloud para usar sua identidade federada.

    Para mais informações, consulte Fazer login na CLI gcloud com sua identidade federada.

  3. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  4. Crie ou selecione um projeto do Google Cloud .

    Papéis necessários para selecionar ou criar um projeto

    • Selecionar um projeto: para selecionar um projeto, não é necessário ter um papel do IAM específico. É possível selecionar qualquer projeto em que você tenha um papel.
    • Criar um projeto: para criar um projeto, é preciso ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

  5. Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.

  6. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  7. Ative a API Cloud FTP, se ainda não estiver ativada:

    Funções necessárias para ativar APIs

    Para ativar APIs, você precisa da permissão serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão pelo papel de proprietário (roles/owner). Caso contrário, é possível conseguir essa permissão pelo papel de administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.

    gcloud services enable ftp.googleapis.com
  8. Se você quiser restringir o acesso ao servidor com base nos endereços IP dos usuários, colete uma lista de blocos CIDR que têm permissão para acessar o servidor.

Funções exigidas

Para receber as permissões necessárias para criar um servidor SFTP, peça ao administrador para conceder a você o papel do IAM de Administrador do Cloud FTP (roles/ftp.admin) no projeto. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém as permissões necessárias para criar um servidor SFTP. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As seguintes permissões são necessárias para criar um servidor SFTP:

  • ftp.servers.create
  • Se você estiver usando o console do Google Cloud para realizar essa tarefa:
    • ftp.servers.list
    • ftp.locations.list

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Criar um servidor externo

Console

  1. No console do Google Cloud , acesse a página do Cloud FTP.

    Acessar o Cloud FTP

  2. Clique em Criar servidor.

  3. Na guia Configuração do servidor, insira os detalhes básicos do servidor:

    1. No campo ID do servidor, insira um ID exclusivo para o servidor.

    2. Na lista Região, selecione o localGoogle Cloud para o servidor.

      Para as velocidades de transferência de dados mais rápidas, crie o servidor no mesmo local que o bucket do Cloud Storage que armazena seus dados. Se o local do bucket não for compatível com o Cloud FTP, selecione o local disponível mais próximo.

    3. (Opcional) Digite um nome de exibição para o servidor.

    4. Clique em Continuar.

  4. Na guia Rede e segurança, configure a conectividade do servidor:

    1. Selecione Externo (IP público).

    2. No campo Intervalos de IP permitidos, forneça um bloco CIDR que tenha permissão para acessar o servidor e pressione Enter. Por exemplo, 192.0.2.0/24. É preciso fornecer pelo menos um valor, e é possível fornecer no máximo 500 blocos CIDR. Para permitir conexões de todos os endereços IP, use 0.0.0.0/0.

  5. Clique em Criar.

    Leva cerca de 10 minutos para o servidor ser criado.

gcloud

Para criar um servidor externo, execute o comando gcloud alpha storage ftp servers create e forneça a flag --access-type=EXTERNAL.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • SERVER_ID: um ID exclusivo para o servidor. Precisa começar com uma letra minúscula e terminar com uma letra minúscula ou um número. Pode conter letras minúsculas, números e hifens. Não pode começar com o prefixo goog nem conter a string google, incluindo erros de ortografia semelhantes, como g00gle. O tamanho máximo é de 30 caracteres.
  • LOCATION_ID: o Google Cloud local do servidor, como us-west1.

    Para as velocidades de transferência de dados mais rápidas, crie o servidor no mesmo local que o bucket do Cloud Storage que armazena seus dados. Se o local do bucket não for compatível com o Cloud FTP, selecione o local disponível mais próximo.

  • CIDR_BLOCK: um bloco CIDR que tem permissão para acessar o servidor. Por exemplo, 192.0.2.0/24. É necessário fornecer pelo menos um valor, e é possível fornecer no máximo 500 blocos CIDR em uma lista separada por vírgulas. Para permitir conexões de todos os endereços IP, use 0.0.0.0/0.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud alpha storage ftp servers create SERVER_ID --access-type=EXTERNAL \
    --location=LOCATION_ID --allowed-cidr-blocks=CIDR_BLOCK

Windows (PowerShell)

gcloud alpha storage ftp servers create SERVER_ID --access-type=EXTERNAL `
    --location=LOCATION_ID --allowed-cidr-blocks=CIDR_BLOCK

Windows (cmd.exe)

gcloud alpha storage ftp servers create SERVER_ID --access-type=EXTERNAL ^
    --location=LOCATION_ID --allowed-cidr-blocks=CIDR_BLOCK

Leva cerca de 10 minutos para o servidor ser criado.

REST

Para criar um servidor externo, use o método servers.create e forneça uma configuração de acesso externalConfig.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto do Google Cloud do servidor.
  • LOCATION_ID: o Google Cloud local do servidor, como us-west1.

    Para as velocidades de transferência de dados mais rápidas, crie o servidor no mesmo local que o bucket do Cloud Storage que armazena seus dados. Se o local do bucket não for compatível com o Cloud FTP, selecione o local disponível mais próximo.

  • SERVER_ID: um ID exclusivo para o servidor. Precisa começar com uma letra minúscula e terminar com uma letra minúscula ou um número. Pode conter letras minúsculas, números e hifens. Não pode começar com o prefixo goog nem conter a string google, incluindo erros de ortografia semelhantes, como g00gle. O tamanho máximo é de 30 caracteres.
  • CIDR_BLOCK: um bloco CIDR que tem permissão para acessar o servidor. Por exemplo, 192.0.2.0/24. É preciso fornecer pelo menos um valor, e é possível fornecer no máximo 500 blocos CIDR . Para permitir conexões de todos os endereços IP, use 0.0.0.0/0.

Método HTTP e URL:

POST https://ftp.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/servers?serverId=SERVER_ID

Corpo JSON da solicitação:

{
  "accessType": "EXTERNAL",
  "externalConfig": {
    "allowedCidrBlocks": [
      "CIDR_BLOCK"
      ]
  }
}

Para enviar a solicitação, expanda uma destas opções:

A resposta identifica uma operação de longa duração.

Leva cerca de 10 minutos para o servidor ser criado.

Bibliotecas de cliente

Para criar um servidor externo, defina o tipo de acesso como externo e forneça uma configuração de acesso externo.

C#

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP C#.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

using Google.Cloud.Ftp.V1;
using Google.LongRunning;
using System.Threading.Tasks;

public sealed partial class GeneratedCloudFtpClientSnippets
{
    /// <summary>Snippet for CreateServerAsync</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public async Task CreateServerAsync()
    {
        // Create client
        CloudFtpClient cloudFtpClient = await CloudFtpClient.CreateAsync();
        // Initialize request argument(s)
        string parent = "projects/[PROJECT]/locations/[LOCATION]";
        Server server = new Server();
        string serverId = "";
        // Make the request
        Operation<Server, OperationMetadata> response = await cloudFtpClient.CreateServerAsync(parent, server, serverId);

        // Poll until the returned long-running operation is complete
        Operation<Server, OperationMetadata> completedResponse = await response.PollUntilCompletedAsync();
        // Retrieve the operation result
        Server result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<Server, OperationMetadata> retrievedResponse = await cloudFtpClient.PollOnceCreateServerAsync(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            Server retrievedResult = retrievedResponse.Result;
        }
    }
}

Go

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP Go.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


//go:build examples

package main

import (
	"context"

	ftp "cloud.google.com/go/ftp/apiv1"
	ftppb "cloud.google.com/go/ftp/apiv1/ftppb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := ftp.NewCloudFtpRESTClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &ftppb.CreateServerRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/ftp/apiv1/ftppb#CreateServerRequest.
	}
	op, err := c.CreateServer(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

Java

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP Java.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

import com.google.api.core.ApiFuture;
import com.google.cloud.ftp.v1.CloudFtpClient;
import com.google.cloud.ftp.v1.CreateServerRequest;
import com.google.cloud.ftp.v1.LocationName;
import com.google.cloud.ftp.v1.Server;
import com.google.longrunning.Operation;

public class AsyncCreateServer {

  public static void main(String[] args) throws Exception {
    asyncCreateServer();
  }

  public static void asyncCreateServer() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (CloudFtpClient cloudFtpClient = CloudFtpClient.create()) {
      CreateServerRequest request =
          CreateServerRequest.newBuilder()
              .setParent(LocationName.of("[PROJECT]", "[LOCATION]").toString())
              .setServerId("serverId1379103678")
              .setServer(Server.newBuilder().build())
              .setRequestId("requestId693933066")
              .build();
      ApiFuture<Operation> future = cloudFtpClient.createServerCallable().futureCall(request);
      // Do something.
      Operation response = future.get();
    }
  }
}

Node.js

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP Node.js.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  Required. Value for parent.
 */
// const parent = 'abc123'
/**
 *  Required. A unique ID for the server. Must start with a lowercase letter,
 *  and end with a lowercase letter or number. Can contain lowercase letters,
 *  numbers, and hyphens. Maximum length is 30 characters.
 */
// const serverId = 'abc123'
/**
 *  Required. The resource being created
 */
// const server = {}
/**
 *  Optional. An optional request ID to identify requests. Specify a unique
 *  request ID so that if you must retry your request, the server will know to
 *  ignore the request if it has already been completed. The server will
 *  guarantee that for at least 60 minutes since the first request.
 *  For example, consider a situation where you make an initial request and the
 *  request times out. If you make the request again with the same request
 *  ID, the server can check if original operation with the same request ID
 *  was received, and if so, will ignore the second request. This prevents
 *  clients from accidentally creating duplicate commitments.
 *  The request ID must be a valid UUID with the exception that zero UUID is
 *  not supported (00000000-0000-0000-0000-000000000000).
 */
// const requestId = 'abc123'

// Imports the Ftp library
const {CloudFtpClient} = require('@google-cloud/ftp').v1;

// Instantiates a client
const ftpClient = new CloudFtpClient();

async function callCreateServer() {
  // Construct request
  const request = {
    parent,
    serverId,
    server,
  };

  // Run request
  const [operation] = await ftpClient.createServer(request);
  const [response] = await operation.promise();
  console.log(response);
}

callCreateServer();

PHP

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP PHP.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

use Google\ApiCore\ApiException;
use Google\ApiCore\OperationResponse;
use Google\Cloud\Ftp\V1\Client\CloudFtpClient;
use Google\Cloud\Ftp\V1\CreateServerRequest;
use Google\Cloud\Ftp\V1\Server;
use Google\Cloud\Ftp\V1\Server\AccessType;
use Google\Rpc\Status;

/**
 * Creates a new Server in a given project and location.
 *
 * @param string $formattedParent  Value for parent. Please see
 *                                 {@see CloudFtpClient::locationName()} for help formatting this field.
 * @param string $serverId         A unique ID for the server. Must start with a lowercase letter,
 *                                 and end with a lowercase letter or number. Can contain lowercase letters,
 *                                 numbers, and hyphens. Maximum length is 30 characters.
 * @param int    $serverAccessType The access type of the Server.
 */
function create_server_sample(
    string $formattedParent,
    string $serverId,
    int $serverAccessType
): void {
    // Create a client.
    $cloudFtpClient = new CloudFtpClient();

    // Prepare the request message.
    $server = (new Server())
        ->setAccessType($serverAccessType);
    $request = (new CreateServerRequest())
        ->setParent($formattedParent)
        ->setServerId($serverId)
        ->setServer($server);

    // Call the API and handle any network failures.
    try {
        /** @var OperationResponse $response */
        $response = $cloudFtpClient->createServer($request);
        $response->pollUntilComplete();

        if ($response->operationSucceeded()) {
            /** @var Server $result */
            $result = $response->getResult();
            printf('Operation successful with response data: %s' . PHP_EOL, $result->serializeToJsonString());
        } else {
            /** @var Status $error */
            $error = $response->getError();
            printf('Operation failed with error data: %s' . PHP_EOL, $error->serializeToJsonString());
        }
    } catch (ApiException $ex) {
        printf('Call failed with message: %s' . PHP_EOL, $ex->getMessage());
    }
}

/**
 * Helper to execute the sample.
 *
 * This sample has been automatically generated and should be regarded as a code
 * template only. It will require modifications to work:
 *  - It may require correct/in-range values for request initialization.
 *  - It may require specifying regional endpoints when creating the service client,
 *    please see the apiEndpoint client configuration option for more details.
 */
function callSample(): void
{
    $formattedParent = CloudFtpClient::locationName('[PROJECT]', '[LOCATION]');
    $serverId = '[SERVER_ID]';
    $serverAccessType = AccessType::ACCESS_TYPE_UNSPECIFIED;

    create_server_sample($formattedParent, $serverId, $serverAccessType);
}

Python

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP Python.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

# This snippet has been automatically generated and should be regarded as a
# code template only.
# It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
#   client as shown in:
#   https://googleapis.dev/python/google-api-core/latest/client_options.html
from google.cloud import ftp_v1


def sample_create_server():
    # Create a client
    client = ftp_v1.CloudFtpClient()

    # Initialize request argument(s)
    server = ftp_v1.Server()
    server.access_type = "INTERNAL"

    request = ftp_v1.CreateServerRequest(
        parent="parent_value",
        server_id="server_id_value",
        server=server,
    )

    # Make the request
    operation = client.create_server(request=request)

    print("Waiting for operation to complete...")

    response = operation.result()

    # Handle the response
    print(response)

Ruby

Para saber como instalar e usar a biblioteca de cliente do Cloud FTP, consulte Bibliotecas de cliente do Cloud FTP. Para mais informações, consulte a documentação de referência da API Cloud FTP Ruby.

Para se autenticar no Cloud FTP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

require "google/cloud/ftp/v1"

##
# Snippet for the create_server call in the CloudFtp service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::Ftp::V1::CloudFtp::Rest::Client#create_server.
#
def create_server
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::Ftp::V1::CloudFtp::Rest::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::Ftp::V1::CreateServerRequest.new

  # Call the create_server method.
  result = client.create_server request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

A seguir