在之前的博客中,我们将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