簡體   English   中英

如何在AWS自動伸縮組的一台計算機上執行bash腳本任務?

[英]How to execute a bash script task in a single machine of an AWS autoscaling group?

最近,我遇到一種情況,我需要確保自動縮放組中只有一台計算機以bash腳本執行給定任務,而bash腳本經常由所有這些計算機運行。

簡而言之,我需要某種形式的領導人選舉,以避免兩台機器執行相同的任務以適應新機器的啟動和停止。

我最終實現了可以做兩件事的事情:

  • 使用AWS CLI( http://aws.amazon.com/cli/ )查找屬於自動伸縮組的所有計算機,然后選擇ID最小的計算機;
  • 使用EC2實例元數據( http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval )獲取當前實例ID;
  • 比較兩者以找出是否運行任務。

     #!/bin/bash AUTOSCALING_GROUP="mygroup" die() { status=$1; shift; echo "FATAL: $*"; exit $status; } THIS_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \\"wget instance-id has failed: $?\\"`" LEADER_INSTANCE_ID="`aws --region us-east-1 ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=$AUTOSCALING_GROUP" "Name=instance-state-name,Values=running" | grep -o '\\"i-[0-9a-f]\\\\+\\"' | grep -o '[^\\"]\\\\+' | sort | head -n 1 || die \\"could not list autoscaling group instances: $?\\"`" if [ "$THIS_INSTANCE_ID" == "$LEADER_INSTANCE_ID" ] then echo "I'm it!" else echo "I'm not it!" fi 

這非常簡單,並且僅能正常工作,因為該腳本在cron上定期運行,並且錯過了幾次執行或最終多次執行該任務不是災難性的(只會產生不必要的成本)。 如果您確實需要進行同步以確保只有一台機器同時執行任務,那么您將需要比這更復雜的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM