在之前的博客中,我们将Spring Boot应用程序与Elastic beantalk集成在一起。 该应用程序是一个基于Servlet的应用程序,可以响应请求。
在本教程中,我们将部署一个Spring Boot应用程序,该应用程序在ec2实例上执行一些计划的任务。 该应用程序与官方Spring指南中的应用程序几乎相同,只是包装上有一些细微差别。
我们的应用程序名称为ec2-deployment
rootProject.name = 'ec2-deployment'
然后,我们将计划任务到我们的Spring Boot应用程序。
package com.gkatzioura.deployment.task;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** Created by gkatzioura on 12/16/16.*/
@Component
public class SimpleTask {private static final Logger LOGGER = LoggerFactory.getLogger(SimpleTask.class);@Scheduled(fixedRate = 5000)public void reportCurrentTime() {LOGGER.info("This is a simple task on ec2");}}
下一步是构建应用程序并将其部署到我们的s3存储桶中。
gradle build
aws s3 cp build/libs/ec2-deployment-1.0-SNAPSHOT.jar s3://{your bucket name}/ec2-deployment-1.0-SNAPSHOT.jar
接下来是引导脚本,以便在服务器启动并运行后运行我们的应用程序。
#!/usr/bin/env bash
aws s3 cp s3://{bucket with code}/ec2-deployment-1.0-SNAPSHOT.jar /home/ec2-user/ec2-deployment-1.0-SNAPSHOT.jar
sudo yum -y install java-1.8.0
sudo yum -y remove java-1.7.0-openjdk
cd /home/ec2-user/
sudo nohup java -jar ec2-deployment-1.0-SNAPSHOT.jar > ec2dep.log
该脚本几乎可以自我解释。 我们从先前上传的存储桶中下载该应用程序,安装所需的Java版本,然后运行该应用程序(此脚本用于示例目的,当然,有许多方法可以设置在Linux上运行的Java应用程序)。
下一步将继续进行我们的cloudformation脚本。 由于我们将从s3下载应用程序,因此必须有一个IAM策略,该策略允许我们从以前使用的s3存储桶中下载项目。 因此,我们将根据所需政策创建角色
"RootRole": {"Type": "AWS::IAM::Role","Properties": {"AssumeRolePolicyDocument": {"Version" : "2012-10-17","Statement": [ {"Effect": "Allow","Principal": {"Service": [ "ec2.amazonaws.com" ]},"Action": [ "sts:AssumeRole" ]} ]},"Path": "/","Policies": [ {"PolicyName": "root","PolicyDocument": {"Version" : "2012-10-17","Statement": [ {"Effect": "Allow","Action": ["s3:Get*","s3:List*"],"Resource": {"Fn::Join" : [ "", [ "arn:aws:s3:::", {"Ref":"SourceCodeBucket"},"/*"] ] }} ]}} ]}}
下一步是将引导脚本编码为Base64,以便能够将其作为用户数据传递。 一旦ec2实例启动并运行,它将运行先前指定的shell命令。
最后一步是创建我们的实例配置文件并指定要启动的ec2实例
"RootInstanceProfile": {"Type": "AWS::IAM::InstanceProfile","Properties": {"Path": "/","Roles": [ {"Ref": "RootRole"} ]}},"Ec2Instance":{"Type":"AWS::EC2::Instance","Properties":{"ImageId":"ami-9398d3e0","InstanceType":"t2.nano","KeyName":"TestKey","IamInstanceProfile": {"Ref":"RootInstanceProfile"},
"UserData":"IyEvdXNyL2Jpbi9lbnYgYmFzaA0KYXdzIHMzIGNwIHMzOi8ve2J1Y2tldCB3aXRoIGNvZGV9L2VjMi1kZXBsb3ltZW50LTEuMC1TTkFQU0hPVC5qYXIgL2hvbWUvZWMyLXVzZXIvZWMyLWRlcGxveW1lbnQtMS4wLVNOQVBTSE9ULmphcg0Kc3VkbyB5dW0gLXkgaW5zdGFsbCBqYXZhLTEuOC4wDQpzdWRvIHl1bSAteSByZW1vdmUgamF2YS0xLjcuMC1vcGVuamRrDQpjZCAvaG9tZS9lYzItdXNlci8NCnN1ZG8gbm9odXAgamF2YSAtamFyIGVjMi1kZXBsb3ltZW50LTEuMC1TTkFQU0hPVC5qYXIgPiBlYzJkZXAubG9n"}}
KeyName代表ssh密钥名称,以防您要登录ec2实例。
因此,我们很高兴去创建我们的cloudformation堆栈。 您必须添加CAPABILITY_IAM标志。
aws s3 cp ec2spring.template s3://{bucket with templates}/ec2spring.template
aws cloudformation create-stack --stack-name SpringEc2 --parameters ParameterKey=SourceCodeBucket,ParameterValue={bucket with code} --template-url https://s3.amazonaws.com/{bucket with templates}/ec2spring.template --capabilities CAPABILITY_IAM
而已。 现在,您已经启动了Spring应用程序并在ec2实例上运行。
您可以从GitHub下载源代码。
翻译自: https://www.javacodegeeks.com/2016/12/integrate-spring-boot-ec2-using-cloudformation.html