Seu primeiro serviço Go na Google Cloud App Engine.
Tags: go, gcp, beginners
Published: 2020-02-18 21:33:45

Você já pensou em subir um serviço na **Google Cloud** (GCP) mas não sabe por onde começar?
Então acompanhe essa publicação onde mostrarei como subir um serviço simples utilizando a **GCP App Engine**. É mais fácil o que parece! :)
Ah, sabe aquelas playlists de LoFi Hip Hop (tem no Youtube, Spotify, etc.)? É uma boa pedida para acompanhar a leitura. ;D

## Primeiros passos

Antes de mais nada, e necessário criar uma conta na [Google Cloud](https://cloud.google.com/).
Você irá receber um valor de bônus para testar a plataforma. Não precisa se preocupar, esse exemplo não chega nem perto de causar algum gasto para você. Mas é importante **SEMPRE** que for parar de realizar testes, parar os serviços para evitar surpresas no futuro. 

Feita a conta, agora vamos acessar o [console](https://console.cloud.google.com/) da plataforma.
No canto direito, é possível ir em preferências e escolher o idioma que você prefere, seja português, inglês ou outro.

![Preferências](https://dev-to-uploads.s3.amazonaws.com/i/t6m84y0yj7u86jkqtgvp.png)

Beleza, agora no canto esquerdo, é possível selecionar um projeto ou criar um novo. Clique ali nessa opção, pois iremos criar um projeto novo! :D

![Selecionar projeto](https://dev-to-uploads.s3.amazonaws.com/i/sb07wz8u04qhu3h93hhb.png)

Nesta nova tela, clique em **novo projeto**.

![Novo projeto](https://dev-to-uploads.s3.amazonaws.com/i/5pv94whq9w08z7vbytbr.png)

A tela a seguir é bastante intuitiva, como podemos ver abaixo. Eu coloquei no nome do projeto como sendo *primeiro-servico-gcp*.

![Meu primeiro serviço GCP](https://dev-to-uploads.s3.amazonaws.com/i/cp22ryuzgx6dngjjw0aa.png)

Pronto! Agora que já temos um projeto criado na GCP, podemos seguir para os próximos passos. \^\^

## Criando o primeiro serviço

Vamos abrir o **Menu de navegação** no canto esquerdo superior. Basta acessar o menu e em seguida **App Engine -> Painel**.
Se tudo der certo, provavelmente você verá a tela abaixo.

![Criar aplicativo](https://dev-to-uploads.s3.amazonaws.com/i/jfwf3qtj7zm1bhdyclt5.png)

Basta clicar em **Criar aplicativo**. No próximo passo você deve escolher a partir de qual região você quer que seu código fique rodando. Pode manter como **US Central**. Cada região tem uma tabela de preços e também uma gama diferente de serviços disponíveis, mas para nosso exemplo isso não faz diferença, então não precisa se preocupar com isso.

Após selecionar a região, chegou o momento de escolher qual linguagem vamos utilizar. Para esse exemplo a linguagem escolhida foi Go :heart:.
Para o campo **Environment**, pode deixar **Padrão**.

![Aplicativo em Go](https://dev-to-uploads.s3.amazonaws.com/i/0euzvxk71q60f2mjdoy0.png)

Mais uma etapa concluída! Agora falta pouco.

## Utilizando Cloud Shell

Uma das formas de criar a aplicação e realizar o deploy, é criando o código com seu editor favorito (Atom, VS Code, Sublime, etc.), baixando a **SDK** da GCP e realizando o deploy pelo seu terminal.
Outra forma, é utilizar o próprio terminal, chamado de **Cloud Shell** que a GCP nos oferece. Essa é a forma que vamos utilizar hoje. 
Caso você já queira baixar a SDK para utilizar no futuro, basta acessar o [Quickstart](https://cloud.google.com/sdk/docs/quickstarts/?hl=pt_BR) e selecionar de acordo com o seu sistema operacional. Se vocês quiserem, posso escrever uma publicação falando sobre isso! :D

Bom, vamos voltar ao assunto de hoje!
No canto superior direito, conseguimos acessar o Cloud Shell que utilizaremos. Pense no Cloud Shell como sendo um terminal rodando na plataforma da Google Cloud, que já tem a SDK deles instalada e mais algumas outras coisinhas, como o [Vim](https://www.vim.org/) e [nano](https://www.nano-editor.org/).

![Menu Cloud Shell](https://dev-to-uploads.s3.amazonaws.com/i/s8cq00rv6mmljcf8oqhw.png)

Clicando nesse botão acima, você irá acessar o Cloud Shell, que aparecerá na parte inferior da tela. Se for da sua preferência, você pode expandir o Cloud Shell para cima, de forma que ocupe praticamente o browser inteiro. Eu gosto de utilizar o terminal assim, então fica assim a tela:

![Cloud Shell aberto](https://dev-to-uploads.s3.amazonaws.com/i/7bezjmb9v1u7ijiq4c85.png)

Se você quiser, pode rodar o comando `go version`, que verá a versão atual instalada no seu ambiente.

## Quero código! Cadê?

Lá vamos nós! Código!!!
Primeiro vamos acessar o diretório `gopath`.
`cd gopath`
Em seguida, vamos criar o diretório do nosso serviço. Você pode, por exemplo, executar o comando abaixo.
`mkdir meu_primeiro_servico && cd $_`
Esse comando cria o diretório **meu_primeiro_servico** e logo em seguida usa o comando `$_` para entrar no diretório recém criado.

A primeira coisa que vamos criar, é um arquivo de configuração, necessário para rodar o serviço. Vamos utilizar o editor **nano** para codificar, ou se você preferir o **Vim**, também pode ser utilizado. 
Execute o comando abaixo para criar o arquivo `app.yaml`.
`nano app.yaml`
Agora com o editor aberto no arquivo, basta adicionar a linha: `runtime: go113`. Como na imagem abaixo.

![app.yaml](https://dev-to-uploads.s3.amazonaws.com/i/wigh9fsygt1opekn79w4.png)

Agora basta pressionar <kbd>Ctrl</kbd>+<kbd>o</kbd> e em seguida <kbd>Enter</kbd> para salvar o arquivo. Para sair do nano, pressione <kbd>Ctrl</kbd>+<kbd>x</kbd>.

E finalmente, vamos o código Go. É possível criar um projeto modularizado, mas para esta publicação, vou seguir o caminho mais simples. Crie o arquivo com o comando abaixo.
`nano main.go`

Dentro do arquivo, vamos iniciar informando que é o pacote main. Em seguida adicionamos os imports necessários:
```go
import (
	"fmt"
	"log"
	"net/http"
	"os"
)

```

Vamos também criar a função **main**, conforme abaixo.

```go
func main() {
	http.HandleFunc("/", imprimirOlaMundo)
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Utilizando porta padrão %s", port)
	}

	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}

}
```

Esta função está utilizando o client HTTP nativo da linguagem Go. Nele estamos monitorando chamadas para o caminho raiz `/`. Também tem uma condição, para caso não tenha sido setada uma porta no ambiente, seja utilizada a porta `8080`. Mas você não precisa se preocupar com isso agora.
Também foram adicionados alguns logs, apenas para informar qual porta está sendo utilizada.

Repare que no mapeamento do caminho `/`, estamos chamando a função **imprimirOlaMundo**. Bora lá implementar essa função!

```go
func imprimirOlaMundo(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Olá mundo! Eu consegui!!! :D")
}
```
Essa função recebe por parâmetro o `http.ResponseWriter` e o ponteiro `*http.Request`. É o padrão do client HTTP que mencionei acima.
Dentro da função basta imprimir a mensagem desejada, que no nosso caso é um Olá mundo.

Seu arquivo deve estar parecido como o da imagem abaixo.

![main.go](https://dev-to-uploads.s3.amazonaws.com/i/lqfsuersvi834wfuq5tc.png)

Para salvar o arquivo, novamente utilize <kbd>Ctrl</kbd>+<kbd>o</kbd> e em seguida <kbd>Enter</kbd>. Para sair pressione <kbd>Ctrl</kbd>+<kbd>x</kbd>.

## Chegou a hora do deploy!

Agora que temos os arquivos `app.yaml` e `main.go` criados, vamos realizar o deploy do serviço. É muito simples! Basta executar o comando abaixo.
`gcloud app deploy`
Ele vai pedir para continuar, basta responder com `y`.
Pronto! Seu serviço já está disponível na nuvem!!! \o/
Provavelmente no seu Cloud Shell, você deve estar vendo algo similar ao que existe na imagem abaixo.

![Deploy](https://dev-to-uploads.s3.amazonaws.com/i/7whck0dr571sj3mjd6eb.png)

Note que os logs inclusive nos informam o endereço onde o serviço está disponível. Basta copiar o endereço e abrir em uma nova aba do seu browser para testar o seu serviço.

![Olá mundo](https://dev-to-uploads.s3.amazonaws.com/i/f2voahk2a630opbb557y.png)

Meus parabéns!!! Você acabou de disponibilizar seu primeiro serviço utilizando App Engine da GCP!

Ah, agora você já pode fechar o Cloud Shell. O botão de fechar fica na parte superior do Cloud Shell, no canto direito.

## E agora?

Se você quiser ver dados sobre suas chamadas do serviço, pode ir no **Menu de navegação** no canto superior esquerdo, **App Engine -> Painel**. Nessa tela existem dados como quantas chamadas foram realizadas e até mesmo o custo.

Como eu mencionei no início da publicação, após realizarmos nossos testes, é sempre bom desligar os serviços, apenas para evitar ficar no esquecimento e daqui um ano receber uma conta indesejada. Acredite, já vi isso acontecer mais de uma vez com colegas de trabalho.
Para desligar o serviço, vamos acessar o **Menu de navegação** no canto superior esquerdo e ir em **IAM e Admin -> Configurações**.

![Menu IAM e Admin](https://dev-to-uploads.s3.amazonaws.com/i/kjn0ynpl0ozdesn04xvi.png)

Em seguida, com o projeto que acabos de criar selecionado, basta clicar em encerrar e na tela que for abrir, para permitir o encerramento do projeto, preencher o campo com o nome do projeto e confirmar.

![Encerrar projeto](https://dev-to-uploads.s3.amazonaws.com/i/9a5ejwqkc3shxkrmow22.png)

Prontinho! Agora não precisa se preocupar em receber uma conta por causa de algum serviço que ficou de pé. 

## Curtiu?

E aí, curtiu a experiência de criar um serviço na nuvem utilizando GCP? Achou complicado, achou fácil? Deixe seu comentário abaixo. :)