Integrate Spring boot and Elastic Beanstalk using Cloudformation
AWS beanstalk is an amazon web service that does most of the configuration for you and creates an infrastructure suitable for a horizontally scalable application. Instead of Beanstalk the other approach would be to configure load balancers and auto scalling groups, which requires a bit of AWS expertise and time.
On this tutorial we are going to upload a spring boot jar application using amazon elastic beanstalk and a cloud formation bundle.
Less is more therefore we are going to use pretty much the same spring boot application taken from the official Spring guide as a template.
The only change would be to alter the rootProject.name to beanstalk-deployment and some changes on the package structure. Downloading the project from github is sufficient.
Then we can build and run the project
gradlew build java -jar build/libs/beanstalk-deployment-1.0-SNAPSHOT.jar
Next step is to upload the application to s3.
aws s3 cp build/libs/beanstalk-deployment-1.0-SNAPSHOT.jar s3://{you bucket name}/beanstalk-deployment-1.0-SNAPSHOT.jar
You need to install the elastic beanstalk client since it helps a lot with most beanstalk operations.
Since we will use Java 8 I would get a list with elastic beanstalk environments in order to retrieve the correct SolutionStackName.
aws elasticbeanstalk list-available-solution-stacks |grep Java
Based on the results I will use the “64bit Amazon Linux 2016.09 v2.3.0 running Java 8” stackname.
Now we are ready to proceed to our cloudformation script.
We will specify a parameter and this will be the bucket containing the application code
"Parameters" : { "SourceCodeBucket" : { "Type" : "String" } }
Then we will specify the name of the application
"SpringBootApplication": { "Type": "AWS::ElasticBeanstalk::Application", "Properties": { "Description":"Spring boot and elastic beanstalk" } }
Next step will be to specify the application version
"SpringBootApplicationVersion": { "Type": "AWS::ElasticBeanstalk::ApplicationVersion", "Properties": { "ApplicationName":{"Ref":"SpringBootApplication"}, "SourceBundle": { "S3Bucket": {"Ref":"SourceCodeBucket"}, "S3Key": "beanstalk-deployment-1.0-SNAPSHOT.jar" } } }
And then we specify our configuration template.
"SpringBootBeanStalkConfigurationTemplate": { "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate", "Properties": { "ApplicationName": {"Ref":"SpringBootApplication"}, "Description":"A display of speed boot application", "OptionSettings": [ { "Namespace": "aws:autoscaling:asg", "OptionName": "MinSize", "Value": "2" }, { "Namespace": "aws:autoscaling:asg", "OptionName": "MaxSize", "Value": "2" }, { "Namespace": "aws:elasticbeanstalk:environment", "OptionName": "EnvironmentType", "Value": "LoadBalanced" } ], "SolutionStackName": "64bit Amazon Linux 2016.09 v2.3.0 running Java 8" } }
The last step would be to glue the above properties by defining an environment
"SpringBootBeanstalkEnvironment": { "Type": "AWS::ElasticBeanstalk::Environment", "Properties": { "ApplicationName": {"Ref":"SpringBootApplication"}, "EnvironmentName":"JavaBeanstalkEnvironment", "TemplateName": {"Ref":"SpringBootBeanStalkConfigurationTemplate"}, "VersionLabel": {"Ref": "SpringBootApplicationVersion"} } }
Now you are ready to upload your cloudformation template and deploy your beanstalk application
aws s3 cp beanstalkspring.template s3://{bucket with templates}/beanstalkspring.template aws cloudformation create-stack --stack-name SpringBeanStalk --parameters ParameterKey=SourceCodeBucket,ParameterValue={bucket with code} --template-url https://s3.amazonaws.com/{bucket with templates}/beanstalkspring.template
You can download the full sourcecode and the cloudformation template from Github.
Reference: | Integrate Spring boot and Elastic Beanstalk using Cloudformation from our JCG partner Emmanouil Gkatziouras at the gkatzioura blog. |