Subindo aplicação Go na AWS
Tags: aws, go, backend, devops
Published: 2023-11-01 22:53:44

Olá dev, ja faz temo que não nos falamos, não é mesmo?

Hoje a nossa conversa vai ser sobre hospedagem para aplicação em linguagem Go. Tentei algumas alternativas que não deram certo, como por exemplo:

- Kinghost: Não aceitam hospedagem em Go.
- Heroku: Consegui hospedar, porem não consegui usar devido ao Heroku não deixar eu configurar o .env, e não, não devemos comitar o .env.

Dando uma pesquisada e trocando ideia com algumas pessoas, cheguei a AWS, aqui da de usar, não sei como fica ao certo quanto a custos, mas acredito que não vamos ultrapassar o limite do plano gratuito. É desejável que você tenha um pouco de experiencia na AWS para compreender bem esse post.

Primeiramente acesse o serviço de EC2 da AWS, no menu lateral selecione a opção **instances**.

![instances](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ercmh82qlp80qxv5rqyc.png)

Na tela que se abrir, clique no botão superior direito em amarelo escrito **Launch instances**, é aqui que vamos criar nossa instância na AWS para rodar nossa aplicação em Go.

Inicialmente, vamos definir um nome, selecionar a opção **Amazon Linux**, escolher a AMI **Amazon Linux 2 AMI** e por fim a arquitetura 64 bits.

![initial config](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mrhhp4lbzauw8qrbo1i6.png)

Em tipo de instância, recomendo escolher a t2.micro, e em **key pair** clique em **create new key pair**, é aqui que vamos gerar o certificado para conexão via SSH.

![key pair](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rmz9lvllr7vj4pyjcopx.png)

Defina um nome, e o resto deixe nas opções padrão, ao criar, salve o arquivo em um local seguro e não perca, vamos precisar dele para acessar o SSH.

Em **network settings**, clique em **Edit** 

![network edit](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4hhscp0al3x9iv45n8p1.png)

Clique em **Add security group rule** e defina a porta que sua aplicação Go vai usar, se for a 8000 por exemplo, vai ficar mais ou menos assim:

![security group](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0l3w5ptwf1vn5x3zyma6.png)

Agora é só clicar em **launch instance** e aguardar um pouco.

Agora com a instância criada e iniciada, acesse seu terminal, vá até a pasta que você salvou o certificado mencionado anteriormente, lembra? aquele que eu pedi para salvar e não perder. 

O endereço para acessar sua instancia vai ser algo parecido com isso: ec2-XX-XXX-XX-XX.XX-XX-X.compute.amazonaws.com, onde os X's são equivalentes ao DNS da sua máquina.

para pegar o endereço correto, basta ir até os detalhes da sua instância na AWS e pegar o endereço contido no campo **Public IPv4 DNS**. Dica, esse endereço não é estático, ou seja, fica mudando.

O comando para acessar via SSH pelo terminal, o comando vai ser o seguinte:

```
sudo ssh -i chave.pem ec2-user@ec2-XX-XXX-XX-XX.XX-XX-X.compute.amazonaws.com
```
Com isso, você já deve ver a tela inicial da sua maquina. Agora vamos a parte legal, configurar o Go.

Use os seguintes comandos: 
```
sudo yum update -y
sudo yum install -y golang
```
Para garantir que ficou certo, rode:

```
go version
```
Você deve ter algo parecido com isso:

![Go version](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yoeed5hd9x7xq40w98wt.png)

Caso precise atualizar o Go para uma versão mais recente, como eu por exemplo, precisava da 1.21, rode esses comandos:

```
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
tar -xvf go1.21.0.linux-amd64.tar.gz
mv go /usr/local
```

Configure as variáveis de ambiente do Go com os seguintes comandos:

```
export GOROOT=/usr/local/go
export GOPATH=$HOME/Apps/app1
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
```
Com isso rode novamente o go version para ver se ficou conforme desejado.

Agora já temos tudo pronto para rodar a aplicação, basta clonar seu repo para a AWS via git clone no SSH, criar seu .env caso necessário, rodar o **go mod tidy** para atualizar as dependências do seu projeto e por fim rodar o **go run main.go** no diretório do seu main.

Caso tenha problemas de permissão, rode os comandos com o sudo.

para testar, basta usar a url, seguido pa porta, como por exemplo:

http://ec2-XX-XXX-XX-XXX.XX-XXX-X.compute.amazonaws.com:8080/mainPage

E por hoje é só pessoal, até a próxima ;)