[LINUX] Exécutez une application Java qui réside sur AWS EC2 en tant que démon

J'ai eu du mal à exécuter une application Java résidente (et un langage fonctionnant sur une JVM telle que Scala) en tant que démon sur AWS EC2 (mais pas spécifiquement limité à EC2), je vais donc le laisser ici.

Mis à part "EC2 ??" ...

Exigences

Implémentation d'application Java

Script de service rc

Créez un script rc pour lancer une application Java en tant que service Linux.

Il existe différents styles de scripts rc, mais je pense qu'au moins c'est très bien. (Init.d and Start Scripts for Scala / Java Server Apps Je l'ai un peu personnalisé en fonction du contenu introduit)

/etc/init.d/example


#!/bin/bash

### BEGIN INIT INFO
# Provides:          example
# chkconfig:         2345 99 99
# Required-Start:    $local_fs $network $named networking
# Required-Stop:     $local_fs $network $named networking
# Short-Description: example
# Description:       example
### END INIT INFO

DAEMON_NAME=example
DAEMON_DIR=/home/ec2-user/example
MODULE_NAME=example-server

START_SCRIPT="java -Duser.timezone=UTC -jar $DAEMON_DIR/$MODULE_NAME.jar"
#Le fichier d'ID de processus est/var/Créer en cours d'exécution
PID_FILE=/var/run/$DAEMON_NAME.pid
#Verrouiller le fichier/var/lock/Créer sous sous-systèmes
#Si vous ne créez pas de fichier de verrouillage, le service ne sera pas arrêté lorsque vous arrêterez la machine.
LOCK_FILE=/var/lock/subsys/$DAEMON_NAME

# ***********************************************
# ***********************************************

ARGS="" # optional start script arguments
DAEMON=$START_SCRIPT

# colors
red='\e[0;31m'
green='\e[0;32m'
yellow='\e[0;33m'
reset='\e[0m'

echoRed() { echo -e "${red}$1${reset}"; }
echoGreen() { echo -e "${green}$1${reset}"; }
echoYellow() { echo -e "${yellow}$1${reset}"; }

start() {
  # $!Enregistrez l'ID de processus du processus démarré dans (écrivez-le ultérieurement dans le fichier d'ID de processus)
  PID=`$DAEMON $ARGS > /dev/null 2>&1 & echo $!`
}

case "$1" in
start)
    if [ -f $PID_FILE ]; then
        PID=`cat $PID_FILE`
        echo $PID
        if [ -z "`ps axf | grep -w ${PID} | grep -v grep`" ]; then
            start
        else
            echoYellow "Already running [$PID]"
            exit 0
        fi
    else
        start
    fi

    if [ -z $PID ]; then
        echoRed "Failed starting"
        exit 3
    else
        #Si le service peut être démarré normalement, créez un fichier d'ID de processus et un fichier de verrouillage.
        echo $PID > $PID_FILE
        touch $LOCK_FILE
        echoGreen "Started [$PID]"
        exit 0
    fi
;;

status)
    if [ -f $PID_FILE ]; then
        PID=`cat $PID_FILE`
        if [ -z "`ps axf | grep -w ${PID} | grep -v grep`" ]; then
            echoRed "Not running (process dead but pidfile exists)"
            exit 1
        else
            echoGreen "Running [$PID]"
            exit 0
        fi
    else
        echoRed "Not running"
        exit 3
    fi
;;

stop)
    if [ -f $PID_FILE ]; then
        PID=`cat $PID_FILE`
        if [ -z "`ps axf | grep -w ${PID} | grep -v grep`" ]; then
            echoRed "Not running (process dead but pidfile exists)"
            exit 1
        else
            PID=`cat $PID_FILE`
            #Lors de l'arrêt du processus-Ne tuez pas à 9 ans
            #Si vous forcez l'arrêt, le hook d'arrêt ne sera pas exécuté et le traitement en cours se terminera au milieu.
            kill -HUP $PID
            echoGreen "Stopped [$PID]"
            #Si le service peut être arrêté normalement, supprimez le fichier ID de processus et verrouillez le fichier
            rm -f $PID_FILE
            rm -f $LOCK_FILE
            exit 0
        fi
    else
        echoRed "Not running (pid not found)"
        exit 3
    fi
;;

restart)
    $0 stop
    $0 start
;;

*)
    echo "Usage: $0 {status|start|stop|restart}"
    exit 1
esac

S'inscrire en tant que service

Déployez le module d'application implémenté et le script rc sur l'instance EC2.

Voici un exemple de modèle pour la création d'EC2 avec Cloud Formation.

EC2AutoScalingConfig:
  Type: AWS::AutoScaling::LaunchConfiguration
  Metadata:
    # CloudFormation:Paramètres pour Init pour obtenir des ressources de S3
    AWS::CloudFormation::Authentication:
      S3AccessCreds:
        type: S3
        roleName:
          Ref: EC2Role
        buckets:
          -Nom du compartiment S3 où les modules, etc. sont stockés

    #Processus d'initialisation de l'instance EC2. Récupérez le module depuis S3 et déployez-le.
    AWS::CloudFormation::Init:
      configSets:
        Setup:
          - PreDeploy
          - DeployExampleServer
          - PostDeploy
          - StartApplication
      #Prétraitement. Installation des packages requis, etc. Il vaut mieux le garder dans AMI.
      PreDeploy:
        packages:
          yum:
            java-1.8.0-openjdk-devel: []
            awslogs: []
        files:
          /home/ec2-user/awslogs-agent-setup.py:
            source: https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
            mode: "000755"
          /home/ec2-user/awslogs.conf:
            content: |+
              [general]
              state_file = /var/lib/awslogs/agent-state

              [/var/log/messages]
              log_group_name = /example/ec2
              log_stream_name = {instance_id}-sysmsg
              file = /var/log/messages
              datetime_format = %b %d %H:%M:%S
              buffer_duration = 5000
              initial_position = start_of_file
        commands:
          SetDefaultJVM:
            command: alternatives --set java /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java
      #Déployer l'application
      DeployExampleServer:
        files:
          #Obtenir le module de S3
          /home/ec2-user/example/example-server.jar:
            source:
              Fn::Sub: https://s3-${AWS::Region}.amazonaws.com/Nom du compartiment S3 où les modules, etc. sont stockés/example-server-1.0.0.jar
            owner: ec2-user
            group: ec2-user
          #Obtenir le script rc de S3
          /home/ec2-user/example/example:
            source:
              Fn::Sub: https://s3-${AWS::Region}.amazonaws.com/Nom du compartiment S3 où les modules, etc. sont stockés/example
            owner: ec2-user
            group: ec2-user
            mode: "000755"
          #Transférer les journaux de sortie de l'application vers CloudWatch avec awslogs
          /home/ec2-user/example/conf/awslogs.conf:
            content: |+

              [example]
              log_group_name = /example/example-server
              log_stream_name = {instance_id}-{{name}}
              file = /root/logs/example.log
              encoding = utf_8
              datetime_format = %Y/%m/%d %H:%M:%S.%f
              time_zone = UTC
              buffer_duration = 5000
              initial_position = start_of_file
              multi_line_start_pattern =  {datetime_format}
            owner: ec2-user
            group: ec2-user
          #Planification de Cron pour redémarrer automatiquement lorsque le processus JVM de l'application s'arrête
          /home/ec2-user/example/conf/cron.conf:
            content: |+
              */5 * * * * /sbin/service example start > /dev/null 2>&1
            owner: ec2-user
            group: ec2-user
        #Notez que si vous écrivez plusieurs commandes dans les commandes, elles seront exécutées par ordre alphabétique.
        commands:
          #Placer le script rc (/etc/init.d Ci-dessous le lien symbolique)
          A_RegisterService:
            command: ln -s /home/ec2-user/example /etc/init.d/example
          #Ajoutez avec chkconfig et configurez l'application pour qu'elle démarre / s'arrête automatiquement lorsque l'instance EC2 démarre / s'arrête
          B_AddChkconfig:
            command: chkconfig --add example && chkconfig example on
          C_AppendAwsLogsConf:
            command: cat /home/ec2-user/example/conf/awslogs.conf >> /home/ec2-user/awslogs.conf
          D_AppendCrontab:
            command: cat /home/ec2-user/example/conf/cron.conf >> /home/ec2-user/cron.conf

      PostDeploy:
        commands:
          A_PipUpgrade:
            command:
              pip install --upgrade pip
          B_ConfigureAwsLogs:
            command:
              Fn::Sub: python /home/ec2-user/awslogs-agent-setup.py -n -r ${AWS::Region} -c /home/ec2-user/awslogs.conf
          C_ConfigureCron:
            command: crontab /home/ec2-user/cron.conf
        services:
          sysvinit:
            awslogs:
              enabled: true
              ensureRunning: true
            crond:
              enabled: true
              ensureRunning: true

      StartApplication:
        commands:
          A_ManagedContentsSynchronizer:
            command: service example start
  Properties:
    :
    UserData:
      Fn::Base64:
        Fn::Sub: |+
          #!/bin/bash
          #Donnez à l'instance EC2 lancée un nom descriptif
          INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
          START_TIME=`date '+%Y%m%d%H%M'`
          aws ec2 create-tags --region ${AWS::Region} --resources ${!INSTANCE_ID} --tags Key=\"Name\",Value=example-${!START_TIME}

          # ---- Run cfn-init
          yum -y update
          yum update -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --region ${AWS::Region} --stack ${AWS::StackName} --resource EC2AutoScalingConfig --configsets Setup

c'est tout.

Recommended Posts

Exécutez une application Java qui réside sur AWS EC2 en tant que démon
Exécutez TensorFlow sur une instance GPU sur AWS
Attaques suspectes survenues dès que j'ai lancé un blog sur EC2
Exécutez régulièrement des programmes Python sur AWS Lambda
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
Exécutez la version GPU tensorflow sur une instance ponctuelle d'AWS EC2
Exécutez YOLO v3 sur AWS v2
Exécutez YOLO v3 sur AWS
# 3 Créez un environnement Python (Django) avec une instance EC2 (ubuntu18.04) d'AWS part2
Création d'un environnement de développement avec Maven sur Google App Engine [Java]
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
Préparation à l'exécution de Flask sur EC2
Exécutez un serveur Linux avec GCP
Exécutez Python selon la planification sur AWS Lambda
Implémenter l'application Django sur Hy
Exécutez Matplotlib sur un conteneur Docker
Exécutez headless-chrome sur une image basée sur Debian
Exécutez TensorFlow2 sur le serveur VPS
Enregistrez le package avec PyPI
Comment configurer un notebook Jupyter à la destination SSH (AWS EC2)
Le module ne peut pas être importé en Python sur EC2 exécuté à partir d'AWS Lambda
Exécuter un lot de Python 2.7 avec nohup sur Amazon Linux AMI sur EC2
Points sur lesquels je suis souvent accro à l'écriture en tant que débutant MySQL