In this blog we are going to explore how to deploy a Java Spring Boot Application in AWS Elastic BeanStalk using AWS CloudFormation Scripts.
To start, we need a s3 bucket with the jar file.
Step 1 : Create a s3 bucket called “catalog_springboot” using AWS S3 console or using CloudFormation scripts from my previous blog.
Step 2 : Download catalog-springboot project from GitHub. catalog-spring-boot-0.0.1-SNAPSHOT.jar is found under /src/main/resources/jar.
Step 3 : Upload catalog-spring-boot-0.0.1-SNAPSHOT.jar to “catalog_springboot” s3 bucket. [ This can be done via AWS Console or AWS CLI as below]
aws s3 cp /Users/home/catalog-spring-boot-0.0.1-SNAPSHOT.jar s3://catalog_springboot/catalog-spring-boot-0.0.1-SNAPSHOT.jar
Step 4 : We will be creating beanstalk-catalog-springboot-application.json. It has details regarding beanstalk environment and SolutionStackName which is “64bit Amazon Linux 2017.09 V2.6.8 running Java 8” . It also specifies autoscaling and load-balancing details.
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "S3BucketName": { "Description": "S3 BucketName", "Type": "String" }, "S3FileName": { "Description": "Name of the jar/war file", "Type": "String" } }, "Resources": { "sampleApplication": { "Type": "AWS::ElasticBeanstalk::Application", "Properties": { "Description": "AWS Elastic Beanstalk Sample Java SpringBoot Application" } }, "sampleApplicationVersion": { "Type": "AWS::ElasticBeanstalk::ApplicationVersion", "Properties": { "ApplicationName": { "Ref": "sampleApplication" }, "Description": "AWS ElasticBeanstalk Sample Java SpringBoot Application Version", "SourceBundle": { "S3Bucket": { "Ref" : "S3BucketName"}, "S3Key": {"Ref" : "S3FileName"} } } }, "sampleConfigurationTemplate": { "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate", "Properties": { "ApplicationName": { "Ref": "sampleApplication" }, "Description": "AWS ElasticBeanstalk Sample Java SpringBoot Configuration Template", "OptionSettings": [ { "Namespace": "aws:autoscaling:asg", "OptionName": "MinSize", "Value": "2" }, { "Namespace": "aws:autoscaling:asg", "OptionName": "MaxSize", "Value": "6" }, { "Namespace": "aws:elasticbeanstalk:environment", "OptionName": "EnvironmentType", "Value": "LoadBalanced" } ], "SolutionStackName": "64bit Amazon Linux 2017.09 v2.6.8 running Java 8" } }, "sampleEnvironment": { "Type": "AWS::ElasticBeanstalk::Environment", "Properties": { "ApplicationName": { "Ref": "sampleApplication" }, "Description": "AWS ElasticBeanstalk Sample Java SpringBoot Environment", "TemplateName": { "Ref": "sampleConfigurationTemplate" }, "VersionLabel": { "Ref": "sampleApplicationVersion" } } } }, "Outputs": { "DevURL": { "Description": "The URL of the DEV Elastic Beanstalk environment", "Value": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "sampleEnvironment", "EndpointURL" ] } ] ] }, "Export": { "Name": { "Fn::Sub": "${AWS::StackName}-EndpointURL" } } } } }
Step 5 : Create beanstalk-catalog-parameters.json which has details of s3 bucket and jar file name.
[ { "ParameterKey": "S3BucketName", "ParameterValue": "catalog-springboot" }, { "ParameterKey": "S3FileName", "ParameterValue": "catalog-spring-boot-0.0.1-SNAPSHOT.jar" } ]
Step 6 : Create beanstalk_creation_tags.json. It is a best practice to tag AWS resources for billing purposes.
[ { "Key": "owner", "Value": "xxxxx" }, { "Key": "contact-email", "Value": "xxx.yyy@zzz.com" } ]
Step 7 : Now, run the command from AWS CLI
aws cloudformation create-stack –stack-name catalog-beanstalk –template-body file://beanstalk-catalog-springboot-application.json –parameters file://beanstalk-catalog-parameters.json –tags file://beanstalk_creation_tags.json
AWS CloudFormation console is as follows.
We can see Elastic BeanStalk creation as follows:
Step 8 : When complete, it will show the URL to access the application
Step 9 : Hit the health check url [ URL/api/catalog/health ] from any browser.
Step 10 : Hit the catalog url [ URL/api/catalog ] to get results stored in H2 in-memory database.
Step 11 : To terminate beanstalk, run the below command from AWS CLI
aws cloudformation delete-stack –stack-name catalog-beanstalk