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 ??" ...
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)
, mais il est plus sûr de spécifier explicitement
-Duser.timezone = UTC` car il peut changer de manière inattendue.stop
, ne forcez pas l'arrêt du processus JVM. (Si vous forcez le kill, le hook d'arrêt ne sera pas exécuté)/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
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.
chkconfig
, l'application sera automatiquement démarrée / arrêtée lorsque l'instance EC2 est démarrée / arrêtée. (Référence: Exécuter le shell au démarrage ou terminer avec EC2
)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