Neste tutorial, você aprenderá a configurar e implantar uma API de amostra e o Extensible Service Proxy (ESP) em um cluster do Google Kubernetes Engine (GKE).
A API REST do código de amostra é descrita com a especificação OpenAPI. Além disso, você também aprende a criar uma chave de API e usá-la ao enviar solicitações para a API.
Neste tutorial, são usadas imagens de contêiner predefinidas do código de amostra e do ESP, que são armazenadas no Container Registry.
Para uma visão geral do Cloud Endpoints, consulte Sobre o Endpoints e Arquitetura do Endpoints.
Objetivos
Ao seguir o tutorial, use a lista geral de tarefas abaixo. Para enviar solicitações à API, é necessário concluir todas as tarefas da Parte 1.
Parte 1
- Configure um projeto do Google Cloud. Consulte Antes de começar.
- Crie um cluster de contêiner no GKE. Consulte o Como criar um cluster de contêiner.
- Instale e configure o software usado no tutorial. Consulte Como instalar e configurar o software necessário.
- Faça o download do código de exemplo. Consulte Como conseguir o código de amostra.
- Configure o arquivo
openapi.yaml
, que é usado para configurar o Cloud Endpoints. Consulte Como configurar o Endpoints. - Implante a configuração do Endpoints para criar um serviço do Endpoints. Consulte Como implantar a configuração do Endpoints.
- Implante a API e o ESP no cluster. Consulte Como implantar o back-end da API.
- Consiga o endereço IP do cluster. Consulte Como conseguir o endereço IP externo do cluster.
- Envie uma solicitação para a API usando um endereço IP. Consulte Como enviar uma solicitação usando um endereço IP.
- Rastreie a atividade da API. Consulte Como rastrear a atividade da API.
Parte 2
- Configurar um registro DNS para a API. Consulte Como configurar o DNS para o Endpoints.
- Envie uma solicitação à API usando o nome de domínio totalmente qualificado. Consulte Como enviar uma solicitação usando o FQDN.
Limpar
Quando terminar, consulte Limpeza para evitar cobranças recorrentes na conta do Google Cloud.
Custos
Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.
Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.
Antes de começar
-
Faça login na sua conta do Google.
Se você ainda não tiver uma, inscreva-se.
-
No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.
- Anote o ID do projeto do Google Cloud, pois ele será necessário mais tarde.
Criar um cluster de contêiner
Você precisa criar um cluster de contêiner no GKE para que o código de backend da API de amostra seja executado.
Para criar um cluster de contêiner da API de amostra:
No Console do Google Cloud, acesse a página de clusters do GKE.
Clique em Criar cluster.
Aceite os padrões e clique em Criar. Esse processo leva alguns minutos para ser concluído.
Anote o nome e a zona do cluster. Essas informações serão necessárias para autenticar o
kubectl
no cluster de contêiner.
Como instalar e configurar o software necessário
Neste tutorial, instale o SDK do Cloud para que você possa usar a interface de linha de comando gcloud
para gerenciar seu projeto.
Use kubectl
para executar comandos em clusters do GKE. Também precisará testar sua API.
No procedimento a seguir, se você já tem o software necessário instalado, siga para a próxima etapa.
Siga estas etapas para instalar e configurar o software necessário:
-
Você precisará que um aplicativo envie solicitações à API de amostra.
- Usuários de Linux e macOS: este tutorial fornece um exemplo de uso de
curl
, que normalmente vem pré-instalado em seu sistema operacional. Caso não tenhacurl
, faça o download na página Versões e downloads (em inglês) docurl
. - Usuários do Windows: neste tutorial, há um exemplo que usa
Invoke-WebRequest
(em inglês), que é compatível com o PowerShell 3.0 e versões posteriores.
- Usuários de Linux e macOS: este tutorial fornece um exemplo de uso de
- Instale e inicie o SDK do Cloud.
- Atualize o Cloud SDK e instale os componentes do Endpoints.
gcloud components update
- Certifique-se de que o Cloud SDK (
gcloud
) esteja autorizado a acessar seus dados e serviços no Google Cloud:gcloud auth login
Na nova guia aberta no navegador, selecione uma conta. -
Defina o projeto padrão como o ID do projeto:
gcloud config set project YOUR_PROJECT_ID
Substitua YOUR_PROJECT_ID pela ID do seu projeto. Se você tiver outros projetos do Google Cloud e quiser usar
gcloud
para gerenciá-los, consulte Como gerenciar configurações do Cloud SDK. - Instale
kubectl
:gcloud components install kubectl
-
Consiga novas credenciais de usuário a serem usadas para o Application Default Credentials.
As credenciais de usuário são necessárias para autorizar
kubectl
.gcloud auth application-default login
Na nova guia aberta no navegador, selecione uma conta.
Como fazer o download do código de amostra
Para ajudá-lo agilizar a entrada em operação, o código de exemplo é fornecido em vários idiomas.
Veja como fazer o download do código de amostra para a máquina local em:
Para clonar ou fazer o download da API de amostra:
- Clone o repositório do aplicativo de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/java-docs-samples
Como alternativa, faça o download da amostra (em inglês) como um arquivo zip e o descompacte.
- Acesse o diretório que contém o código de amostra:
cd java-docs-samples/endpoints/getting-started
Para clonar ou fazer o download da API de amostra:
- Clone o repositório do aplicativo de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
Como alternativa, faça o download da amostra (em inglês) como um arquivo zip e o descompacte.
- Acesse o diretório que contém o código de amostra:
cd python-docs-samples/endpoints/getting-started
Para clonar ou fazer o download da API de amostra:
- Verifique se a variável de ambiente
GOPATH
(em inglês) está configurada. - Clone o repositório do app de amostra na máquina local:
go get -u -d github.com/GoogleCloudPlatform/golang-samples/endpoints/getting-started
- Acesse o diretório que contém o código de amostra:
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/endpoints/getting-started
Para clonar ou fazer o download da API de amostra:
- Clone o repositório do aplicativo de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/php-docs-samples
Como alternativa, faça o download da amostra (em inglês) como um arquivo zip e o descompacte.
- Acesse o diretório que contém o código de amostra:
cd php-docs-samples/endpoints/getting-started
Para clonar ou fazer o download da API de amostra:
- Clone o repositório do aplicativo de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
Como alternativa, faça o download da amostra (em inglês) como um arquivo zip e o descompacte.
- Acesse o diretório que contém o código de amostra:
cd ruby-docs-samples/endpoints/getting-started
Para clonar ou fazer o download da API de amostra:
- Clone o repositório do aplicativo de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
Como alternativa, faça o download da amostra (em inglês) como um arquivo zip e o descompacte.
- Acesse o diretório que contém o código de amostra:
cd nodejs-docs-samples/endpoints/getting-started
Como configurar o Endpoints
O código de exemplo inclui o arquivo de configuração OpenAPI, openapi.yaml
, que é baseado na especificação OpenAPI v2.0.
Para configurar o Endpoints:
- No diretório de código de amostra, abra o arquivo de configuração
openapi.yaml
.Java Python Go PHP Ruby NodeJS Observações:
- A amostra de configuração exibe as linhas próximas ao campo
host
, que precisa ser modificado. Para implantar o arquivoopenapi.yaml
no Endpoints, é necessário o documento completo da OpenAPI. - O arquivo de exemplo
openapi.yaml
contém uma seção para configurar a autenticação que não é necessária para este tutorial. Não é necessário configurar as linhas com YOUR-SERVICE-ACCOUNT-EMAIL e YOUR-CLIENT-ID. - A OpenAPI é uma especificação agnóstica de linguagem. Por conveniência, o mesmo arquivo
openapi.yaml
está na amostragetting-started
no repositório do GitHub de cada linguagem.
- A amostra de configuração exibe as linhas próximas ao campo
- No campo
host
, substitua o texto pelo nome do serviço do Endpoints, que precisa estar no seguinte formato:host: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog"
Substitua o YOUR_PROJECT_ID pelo ID do projeto do Google Cloud. Exemplo:
host: "echo-api.endpoints.example-project-12345.cloud.goog"
Observe que echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog
é o nome do serviço do Endpoints. e não o nome de domínio totalmente qualificado (FQDN, na sigla em inglês) usado para enviar solicitações à API.
Para mais informações sobre os campos no documento da OpenAPI exigido pelo Endpoints, consulte Como configurar o Endpoints.
Depois de concluir todas as etapas de configuração a seguir e enviar solicitações à API de amostra usando um endereço IP, consulte Como configurar o DNS do Endpoints para informações sobre como configurar echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog
para ser o FQDN.
Como implantar a configuração do Endpoints
Para implantar a configuração do Endpoints, use o comando gcloud endpoints
services deploy
. Ele utiliza o Service Management para criar um serviço gerenciado.
Para implantar a configuração do Endpoints:
- Verifique se você está no diretório
endpoints/getting-started
. - Faça upload da configuração e crie um serviço gerenciado:
gcloud endpoints services deploy openapi.yaml
Em seguida, o comando gcloud
chama a API Service Management para criar um serviço gerenciado com o nome especificado no campo host
do arquivo openapi.yaml
.
O Service Management configura o serviço de acordo com as configurações no arquivo openapi.yaml
. Ao fazer alterações em openapi.yaml
, é necessário reimplantar o arquivo para atualizar o serviço do Endpoints.
Durante a criação e a configuração do serviço, a Service Management envia informações ao terminal. Ignore os avisos sobre os caminhos no arquivo openapi.yaml
que não exigem uma chave de API.
Quando a configuração do serviço é concluída, o Service Management mostra uma mensagem com o código de configuração e o nome do serviço:
Service Configuration [2017-02-13r0] uploaded for service [echo-api.endpoints.example-project-12345.cloud.goog]
No exemplo anterior, 2017-02-13r0
é o ID de configuração do serviço e echo-api.endpoints.example-project-12345.cloud.goog
é o serviço do Endpoints. O código de configuração do serviço consiste em um carimbo de data e um número de revisão. Se você implantar o arquivo openapi.yaml
novamente no mesmo dia, o número de revisão será incrementado no ID de configuração do serviço. Você pode ver a configuração do serviço do Endpoints na página Endpoints > Serviços no Console do Cloud.
Se você receber uma mensagem de erro, consulte Como solucionar problemas de implantação na configuração do Endpoints.
Como verificar os serviços obrigatórios
No mínimo, o Endpoints e o ESP exigem a ativação dos seguintes serviços do Google:Nome | Título |
---|---|
servicemanagement.googleapis.com |
API Service Management |
servicecontrol.googleapis.com |
API Service Control |
endpoints.googleapis.com |
Google Cloud Endpoints |
Na maioria dos casos, o comando gcloud endpoints services deploy
ativa os serviços necessários. No entanto, o comando gcloud
é concluído com êxito, mas não ativa os serviços necessários nas seguintes circunstâncias:
Você usou um aplicativo de terceiros, como o Terraform, e não incluiu esses serviços.
Você implantou a configuração do Endpoints em um projeto do Google Cloud existente, em que esses serviços foram desativados explicitamente.
Use o seguinte comando para confirmar se os serviços necessários estão ativados:
gcloud services list
Se você não encontrar os serviços necessários listados, ative-os:
gcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
gcloud services enable endpoints.googleapis.com
Ative também seu serviço do Endpoints:
gcloud services enable ENDPOINTS_SERVICE_NAME
Para determinar o ENDPOINTS_SERVICE_NAME, é possível:
Após implantar a configuração do Endpoints, acesse a página Pontos de extremidade no Console do Cloud. A lista de ENDPOINTS_SERVICE_NAME possíveis é mostrada na coluna Nome do serviço.
Para a OpenAPI, o ENDPOINTS_SERVICE_NAME é o que você especificou no campo
host
da especificação do OpenAPI. Para gRPC, o ENDPOINTS_SERVICE_NAME é o que você especificou no camponame
da configuração do gRPC Endpoints.
Para mais informações sobre os comandos gcloud
, consulte serviços gcloud
.
Implantar o back-end da API
Até agora, você implantou o documento do OpenAPI no Service Management, mas não o código que exibe o back-end da API. Veja nesta seção como implantar contêineres predefinidos para as amostras de API e ESP no cluster.
Como verificar as permissões necessárias
Siga esta recomendação de permissão para escolher uma conta de serviço de nó adequada como identidade para se comunicar com os serviços do Google. O ESP e o ESPv2 precisam se comunicar com o Google ServiceController e com o Stackdriver. Também são necessários papéis de IAM adicionais para a conta de serviço do nó que executa o ESP e o ESPv2.
Se a conta de serviço do nó não for a do Compute Engine, siga a próxima etapa para adicionar os papéis necessários do IAM:
Adicione os papéis necessários do IAM:
Os papéis do IAM a seguir são necessários para a conta de serviço usada para ESP e ESPv2.
Para adicionar os papéis de IAM do controlador de serviço e do Cloud Trace à conta de serviço:
Console
- No Console do Cloud, selecione o projeto em que sua conta de serviço foi criada.
- Abrir a página IAM/Iam. . A página deve listar todos os membros do IAM, incluindo todas as contas de serviço.
- Selecione sua conta de serviço e clique em Editar PIN à direita.
- Você verá um painel permissão para edição.
- Clique em Adicionar outro papel.
- Clique em Selecionar um papel e selecione Gerenciamento de serviços > Controlador de serviços.
- Clique em + Adicionar outro papel.
- Clique em Selecionar um papel e selecione Cloud Trace > Agente do Cloud Trace.
- Clique em Save.
- Agora você verá os papéis Controlador de serviços e Agente do Cloud Trace na coluna papel da conta de serviço na página do IAM.
gcloud
Adicione o papel de Controlador de serviço:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/servicemanagement.serviceController
Adicione o papel de Agente do Cloud Trace para ativar o Cloud Trace:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtrace.agent
Para mais informações, consulte O que são funções e permissões?
Identidade da carga de trabalho
Se a Identidade da carga de trabalho for usada, uma conta de serviço separada diferente da conta de serviço do nó poderá ser usada para falar com os serviços do Google. É possível criar uma conta de serviço do Kubernetes para o pod executar o ESP e o ESPv2. Além disso, você pode criar uma conta de serviço do Google e associá-la à do Kubernetes.
Siga estas etapas para associar uma conta de serviço do Kubernetes a uma conta de serviço do Google.
A conta de serviço do Google precisa ter os papéis do IAM exigidos acima. Caso contrário, siga a etapa adicionar papéis obrigatórios do IAM para adicioná-los.
Implantar os contêineres no cluster
Os contêineres oferecem um mecanismo de empacotamento lógico em que é possível simplificar os aplicativos no ambiente em que são executados. Siga o procedimento a seguir para implantar a amostra de API e ESP no cluster.
Para implantar os contêineres no cluster:
- Receba as credenciais para o cluster e disponibilize-as para
kubectl
:gcloud container clusters get-credentials NAME
Substitua NAME pelo nome do cluster e ZONE pela zona do cluster.
--zone ZONE - Implante um serviço do Kubernetes no cluster do GKE. O serviço Kubernetes implementa a API. Edite o arquivo de configuração do Kubernetes
/endpoints/getting-started/deployment.yaml
e substitua SERVICE_NAME nas opções de inicialização do ESP pelo nome do serviço.Java Python Go PHP Ruby NodeJS Exemplo:
args: [ "--http_port=8081", "--backend=127.0.0.1:8080", "--service=echo-api.endpoints.example-project-12345.cloud.goog ", "--rollout_strategy=managed", ]
A opção
--rollout_strategy=managed
configura o ESP para usar a implantação mais recente da configuração do serviço. Quando você especifica essa opção, até 5 minutos depois de implantar uma nova configuração de serviço, o ESP detecta a alteração e começa a usá-la automaticamente. Recomendamos especificar essa opção em vez de um ID de configuração específico para uso do ESP. Para saber mais sobre as opções de ESP usadas, consulte Opções de inicialização do ESP. - Inicie o serviço do Kubernetes usando o comando
kubectl apply
:kubectl apply -f deployment.yaml
Se você receber uma mensagem de erro, consulte Como solucionar problemas do Endpoints no GKE.
Para mais informações, consulte Como implantar o back-end da API.
Como buscar o endereço IP externo do cluster
Para enviar solicitações para a API, é preciso o IP externo do serviço. Após o início do serviço no contêiner, pode levar alguns minutos para o endereço IP externo ficar pronto.
Veja o endereço IP externo:
kubectl get service
Anote o valor de
EXTERNAL-IP
. Use esse endereço IP ao enviar uma solicitação à API de amostra.
Como enviar uma solicitação usando um endereço IP
Agora que o serviço está sendo executado no cluster de contêiner e você tem o endereço IP externo, é possível enviar solicitações para a API.
Criar uma chave de API e definir uma variável de ambiente
O código de amostra requer uma chave de API. Para simplificar a solicitação, defina uma variável de ambiente para a chave da API.
No mesmo projeto do Google Cloud usado para a API, crie uma chave de API na página de credenciais da API. Se você quer criar uma chave de API em um projeto diferente do Google Cloud, consulte Como ativar uma API no projeto do Google Cloud.
- Clique em Criar credenciais e, em seguida, selecione Chave de API.
- Copie a chave para a área de transferência.
- Clique em Fechar.
- No computador local, cole a chave da API para atribuí-la a uma variável de ambiente:
- No Linux ou no macOS:
export ENDPOINTS_KEY=AIza...
- No Windows PowerShell:
$Env:ENDPOINTS_KEY="AIza..."
- No Linux ou no macOS:
Enviar a solicitação
Linux ou mac OS
Utilize curl
para enviar uma solicitação HTTP usando a variável de ambiente ENDPOINTS_KEY definida anteriormente. Substitua IP_ADDRESS pelo endereço IP externo da instância.
curl --request POST \ --header "content-type:application/json" \ --data '{"message":"hello world"}' \ "http://IP_ADDRESS:80/echo?key=${ENDPOINTS_KEY}"
No curl
anterior:
- A opção
--data
especifica os dados a serem enviados para a API. - A opção
--header
especifica que os dados estão no formato JSON.
PowerShell
Utilize Invoke-WebRequest
para enviar uma solicitação HTTP usando a variável de ambiente ENDPOINTS_KEY
definida anteriormente. Substitua IP_ADDRESS pelo endereço IP externo da instância.
(Invoke-WebRequest -Method POST -Body '{"message": "hello world"}' ` -Headers @{"content-type"="application/json"} ` -URI "http://IP_ADDRESS:80/echo?key=$Env:ENDPOINTS_KEY").Content
No exemplo acima, as duas primeiras linhas terminam em um acento grave. Quando você colar o exemplo no PowerShell, verifique se não há espaço após os acentos graves. Para informações sobre as opções usadas na solicitação de exemplo, consulte Invoke-WebRequest (em inglês) na documentação da Microsoft.
Aplicativo de terceiros
É possível usar um aplicativo de terceiros, como o Postman, uma extensão do navegador Chrome, para enviar a solicitação:
- Selecione
POST
como o verbo HTTP. - Para o cabeçalho, selecione a chave
content-type
e o valorapplication/json
. - Para o corpo, digite isto:
{"message":"hello world"}
-
No URL, use a chave de API real em vez da variável de ambiente.
Por exemplo:
http://192.0.2.0:80/echo?key=AIza...
A mensagem enviada é retornada pela API com a seguinte resposta:
{
"message": "hello world"
}
Se não receber uma resposta bem-sucedida, consulte Como solucionar problemas em erros de resposta.
Você acaba de implantar e testar uma API no Endpoints.
Como rastrear a atividade da API
Para rastrear a atividade da API:
Veja os gráficos de atividade da API na página Endpoints > Serviços.
Ir para a página Serviços do Endpoints
Pode levar alguns instantes até a solicitação aparecer nos gráficos.Verifique os registros de solicitações da API na página "Visualizador de registros".
Como configurar o DNS para o Endpoints
Como o nome do serviço do Endpoints para a API está no domínio .endpoints.YOUR_PROJECT_ID.cloud.goog
, é possível usá-lo como o nome de domínio totalmente qualificado (FQDN, na sigla em inglês). Basta fazer uma pequena alteração na configuração do arquivo openapi.yaml
. Dessa forma, é possível enviar solicitações para a API de amostra usando echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog
em vez do endereço IP.
Para configurar o DNS para o Endpoints:
- Abra o arquivo de configuração da OpenAPI,
openapi.yaml
, e adicione a propriedadex-google-endpoints
no nível superior do arquivo (não recuado ou aninhado), como mostrado no snippet a seguir:host: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" x-google-endpoints: - name: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" target: "IP_ADDRESS"
- Na propriedade
name
, substitua YOUR_PROJECT_ID pelo ID do projeto. - Na propriedade
target
, substitua IP_ADDRESS pelo endereço IP usado ao enviar uma solicitação para a API de amostra. - Implante o arquivo de configuração da OpenAPI atualizado na Service Management usando o seguinte comando:
gcloud endpoints services deploy openapi.yaml
Por exemplo, suponha que o arquivo openapi.yaml
esteja configurado desta forma:
host: "echo-api.endpoints.example-project-12345.cloud.goog" x-google-endpoints: - name: "echo-api.endpoints.example-project-12345.cloud.goog" target: "192.0.2.1"
Ao implantar o arquivo openapi.yaml
usando o comando gcloud
anterior, o Service Management cria um registro A DNS, echo-api.endpoints.my-project-id.cloud.goog
, que é resolvido para o endereço IP de destino, 192.0.2.1
. Pode levar alguns minutos para a nova configuração do DNS se propagar.
Como configurar a SSL
Para mais detalhes sobre como configurar o DNS e a SSL, consulte Como ativar a SSL para o Endpoints.
Como enviar uma solicitação usando o FQDN
Agora que você tem o registro DNS configurado para a API de amostra, envie uma solicitação usando o FQDN (substitua YOUR_PROJECT_ID pelo ID do projeto) e a variável de ambiente ENDPOINTS_KEY definida anteriormente:- No Linux ou no mac OS:
curl --request POST \ --header "content-type:application/json" \ --data '{"message":"hello world"}' \ "http://echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog:80/echo?key=${ENDPOINTS_KEY}"
- No Windows PowerShell:
(Invoke-WebRequest -Method POST -Body '{"message": "hello world"}' -Headers @{"content-type"="application/json"} -URI "http://echo-api.endpoints.[YOUR_PROJECT_ID].cloud.goog:80/echo?key=$Env:ENDPOINTS_KEY").Content
Como criar um portal do desenvolvedor para a API
É possível usar o Portal do Cloud Endpoints para criar um portal do desenvolvedor, um site para interagir com a API de amostra. Para saber mais, consulte a Visão geral do Portal do Cloud Endpoints.
Limpeza
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.
Consulte Como excluir uma API e as instâncias relacionadas para saber como interromper os serviços usados neste tutorial.