Статьи

Интеграция Spring Boot и EC2 с использованием Cloudformation

В предыдущем блоге мы интегрировали приложение весенней загрузки с эластичным бобовым стеблем. Приложение было сервлет-приложением, отвечающим на запросы.

В этом уроке мы собираемся развернуть приложение весенней загрузки, которое выполняет некоторые запланированные задачи на экземпляре ec2 . Приложение будет в значительной степени таким же приложением, взятым из официального весеннего руководства, с небольшими отличиями в пакетах.

Название нашего приложения будет ec2-развертывание

1
rootProject.name = 'ec2-deployment'

Затем мы наметим задачу для нашего весеннего загрузочного приложения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
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.

1
2
gradle build
aws s3 cp build/libs/ec2-deployment-1.0-SNAPSHOT.jar s3://{your bucket name}/ec2-deployment-1.0-SNAPSHOT.jar

Далее следует скрипт начальной загрузки, чтобы запустить наше приложение после запуска сервера.

1
2
3
4
5
6
#!/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, а затем запускаем приложение (этот сценарий служит нам в качестве примера, безусловно, существует множество способов настроить ваше Java-приложение, работающее на Linux).

Следующим шагом будет переход к нашему скрипту облачной информации. Поскольку мы будем загружать наше приложение из s3, важно иметь политику IAM, которая позволит нам загружать элементы из корзины s3, которую мы использовали ранее. Поэтому мы создадим роль с необходимой политикой

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"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 будет запущен и запущен, он выполнит команды оболочки, указанные ранее.

Последний шаг — создать наш профиль экземпляра и указать экземпляр ec2, который будет запущен.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
"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.

Так что мы готовы пойти и создать наш стек облачной информации. Вы должны добавить флаг CAPABILITY_IAM.

1
2
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

Вот и все. Теперь у вас есть весеннее приложение, запущенное поверх экземпляра ec2.
Вы можете скачать исходный код с GitHub .