Este projeto é um exemplo simples de integração do BattleSnake usando AWS Lambda com Java e API Gateway.
Ele foi escrito para rodar na AWS sem necessidade de servidor próprio, usando Maven para gerenciamento de dependências.
-
Java JDK (versão 11 ou superior)
Download do JDK ou use o OpenJDK. -
Maven CLI
Download Maven
Instalação:# Windows (chocolatey) choco install maven # Mac (homebrew) brew install maven # Linux (apt) sudo apt install maven
Documentação Para Windows Oficial Video Tutorial Para Windows
-
Conhecimento básico sobre API Gateway e Lambda
-
Conhecimento básico sobre Java
-
Conhecimento básico sobre API
-
Disposicão, Competitividade e Força de Vontade!
O projeto segue a estrutura Maven Standard Directory Layout:
.
├── pom.xml # Arquivo de dependências Maven
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── mauadev
│ │ │ └── code
│ │ │ └── Handler.java # Código principal!!!
│ │ └── resources
│ │ └── (se necessário, arquivos de configuração)
│ └── test
│ └── java (testes unitários)
O pom.xml
, nosso arquivo de dependencias, padrão para rodar este projeto:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mauadev</groupId>
<artifactId>battlesnake-lambda</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.10.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>3.13.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
-
Vá até o repositório Setup, acesse a aba Issues e abra uma nova issue.
-
Após abrir a issue, o repositório será criado automaticamente dentro da organização.
> ⏳ Aguarde cerca de 1 minuto e depois verifique em Repositórios da organização. -
Clone o repositório criado na sua máquina:
# Na pasta em que deseja trabalhar, execute: git clone https://www.github.com/Maua-Dev/Nome_Do_Seu_Repositorio # Acesse a pasta do projeto cd Nome_Do_Seu_Repositorio # Instale as dependências mvn clean install
-
Agora é só começar a programar sua cobra 🐍!
Quando quiser testar ou salvar o progresso:
# para testar o projeto com os testes padrões já criados rode:
mvn test
# esses testes serão automaticamente executados no GitHub # actions, então fique atento pois caso falhem o seu código não irá
# gerar o link da api!!!!!!
# para enviar o código para o GitHub basta executar:
git add ./
git commit -m "sua mensagem de commit"
# caso seja o primeiro commit:
git push origin dev
# caso contrário:
git push
Depois disso, acesse o repositório do seu projeto no GitHub para obter o link da API gerada automaticamente.
O processo de deploy deste projeto já está automatizado via Terraform.
Não é necessário modificar nada no código ou no Terraform para implantar na AWS.
Assim que o Terraform concluir o deploy, será criada automaticamente uma URL pública do API Gateway.
- Acesse sua conta no BattleSnake
- Vá até My Battlesnakes → New Battlesnake
- Escolha um nome e uma cor para sua cobra
- No campo URL, insira a URL gerada pelo Terraform (exemplo:
https://<ID>.execute-api.<REGIÃO>.amazonaws.com/
)
- Salve as configurações
- Agora você pode testar a cobra nos jogos e desafios!
O Handler.java
implementa a interface do AWS Lambda RequestHandler, recebendo eventos do API Gateway e respondendo com JSON.
-
handleRequest()
→ ponto de entrada da Lambda- Lê o path da requisição
- Direciona para o método correto (
handleInfo
,handleStart
,handleMove
,handleEnd
) - Retorna resposta JSON ou erro 404
-
handleInfo()
→ informações da cobra (cor, cabeça, cauda, autor, versão da API) -
handleStart()
→ chamado no início do jogo (log inicial) -
handleMove()
→ lógica da jogada (neste exemplo, sempre "up") -
handleEnd()
→ chamado no final do jogo (log final) -
Usa Gson para converter objetos Java para JSON
-
Usa APIGatewayProxyRequestEvent e APIGatewayProxyResponseEvent para receber/enviar dados
-
Documentação oficial do battlesnake!!!!! → https://docs.battlesnake.com/api
Você pode simular requisições HTTP com curl
:
curl -X GET https://<SEU_API_GATEWAY_URL>/
curl -X POST https://<SEU_API_GATEWAY_URL>/start -d '{}'
curl -X POST https://<SEU_API_GATEWAY_URL>/move -d '{}'
curl -X POST https://<SEU_API_GATEWAY_URL>/end -d '{}'
Ou testar com os tests já criados:
mvn test
- O método
handleMove()
deve conter a inteligência do jogo. - O uso do maven-shade-plugin é obrigatório para empacotar todas as dependências no JAR final.
- EVITE adicionar mais dependencias, pois o shade plugin empacota todas as dependencias em um JAR, tornando-o talvez muito pesado para o deploy!!!