on
AWS - Deploying Your First Spring Boot App
This article is about getting a Spring Boot application into production on AWS. So to achieve this goal, we will need to have Docker installed, and created accounts at hub.docker.com and aws.amazon.com/console.
At first, we’ll create a simple Docker image from a Hello World application. It is based on a simple Spring Boot application that prints Hello Docker World when we visit /hello endpoint. We can get fresh Spring Boot web project from https://start.spring.io/ and paste this code:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/hello")
public String hello() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Next, we will build a Docker image based on Java 11 using this Dockerfile:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
It is very simple, and all we need to run a Spring Boot app with no frills: just Java and a JAR file.
We can build and the image with the following command: docker build -t atech/aws-spring-boot-docker . To check if everything worked out, we can run docker images | grep atech/aws-spring-boot-docker.
Let’s check if the Docker image we just built actually works: docker run -p 8081:8080 atech/aws-spring-boot-docker.
Note that without specifying the port mapping, Docker won’t expose a port on which we can access the application.
Once started, we can open localhost:8081/hello in a browser tab and should see Hello Docker World text.
To deploy a Docker image to AWS, AWS needs to pull the image from the Docker registry. So, let’s publish our image to hub.docker.com which is Docker registry.
We can publish either from the UI or the CLI. For both cases, we need a Docker Hub Account and being logged in. From the CLI, we can login using this command: docker login registry-1.docker.io. Next, we can push the Docker image to the registry by using this command: docker push atech/aws-spring-boot-docker.
For AWS, we will deploy a container via the web based wizard as it is a manual process and cannot be automated. To get started, let’s open the ECS start page and click on the Get started button.
The link shows a page called Getting Started with Amazon Elastic Container Service (Amazon ECS) using Fargate and with four steps:
-
Step 1: Container and Task:
- Container definition section: Click on configure button under the last square called custom and enter these information:
- Container name:
c-aws-spring-boot-docker - Image:
docker.io/atech/aws-spring-boot-docker:latest
- Container name:
- Task definition section: Click on edit and update the name
task-aws-spring-boot-docker - We leave everything in the default setting and next
- Container definition section: Click on configure button under the last square called custom and enter these information:
-
Step 2: Service
- We leave everything in the default setting and next
-
Step 3: Cluster
- Update cluster name and set
aws-spring-boot-docker-cluster - We leave everything in the default setting and next
- Update cluster name and set
-
Step 4: Review
-
Click on create: the wizard shows these information about preparing the services
ECS resource creation Cluster: aws-spring-boot-docker-cluster Task definition: aws-spring-boot-docker:1 Service Additional AWS service integrations Log group: /ecs/aws-spring-boot-docker CloudFormation stack: EC2ContainerService-aws-spring-boot-docker-cluster VPC: vpc- 013e2e84c0bdc79f0 Subnet 1 Subnet 2 Security group
-
When all steps are completed, hit the view service button. The summary page shows a whole bunch of information about the status of the service we have just started.
Go to task tab, and click on the task name to see the details. You’ll see ENI Id link. ENI means Elastic Network Interface and will lead us to the public URL of the container. Scroll to the right where we can see Public IPv4 address. Copy that address and add :8080/hello. If you followed all the steps as described, I am sure you’ll see Hello Docker World! Congrats. We’ve just deployed our first Docker container to AWS!
To avoid billing problems, don’t forget to delete the cluster.