2017-10-27 11 views
4

私は最近、here(アプローチ2)のように、スワップルートボリュームアプローチを使用して永続的なスポットインスタンスを作成しています。通常、私のSpot Instanceが完了し、スワップが完了するまでに2〜5分かかります。しかし、ある日、プロセスは終了しません(または、少なくとも私は20分から1時間待ってしまったのですが、せっかちです)。AWSコンソールを使用してEC2のルートValume Swapを実行

インスタンスは作成されますが、スワップは起こりません。サーバーにsshできるが、永続的なファイルは存在しません。私も自分のAWSコンソールに行くと、「スポッター」(私の永続ストレージは)何の添付ファイルの情報を持っていないことに注目することで、これを見ることができます:

enter image description here

私が使用しているスワップスクリプトは私にすべてのエラーを与えたことがないと何が失敗しているのか分かりにくいです。だから、スクリーンショットに基づいて、AWS EC2管理コンソールを使って「手動で」スワップを実行できるのかどうか、もしそうなら、私はこれをどのように達成するのだろうかと思います。

そして、それは@Vorsprung、

を助け場合、私は次のスクリプトを実行してプロセスを開始:

my.confがある
# The config file was created in ondemand_to_spot.sh 
export config_file=my.conf 
cd "$(dirname ${BASH_SOURCE[0]})" 

. ../$config_file || exit -1 

export request_id=`../ec2spotter-launch $config_file` 
echo Spot request ID: $request_id 

echo Waiting for spot request to be fulfilled... 
aws ec2 wait spot-instance-request-fulfilled --spot-instance-request-ids $request_id 

export instance_id=`aws ec2 describe-spot-instance-requests --spot-instance-request-ids $request_id --query="SpotInstanceRequests[*].InstanceId" --output="text"` 

echo Waiting for spot instance to start up... 
aws ec2 wait instance-running --instance-ids $instance_id 

echo Spot instance ID: $instance_id 

echo 'Please allow the root volume swap script a few minutes to finish.' 
if [ "x$ec2spotter_elastic_ip" = "x" ] 
then 
     # Non elastic IP 
     export ip=`aws ec2 describe-instances --instance-ids $instance_id --filter Name=instance-state-name,Values=running --query "Reservations[*].Instances[*].PublicIpAddress" --output=text` 
else 
     # Elastic IP 
     export ip=`aws ec2 describe-addresses --allocation-ids $ec2spotter_elastic_ip --output text --query 'Addresses[0].PublicIp'` 
fi 

export name=fast-ai 
if [ "$ec2spotter_key_name" = "aws-key-$name" ] 
then function aws-ssh-spot { 
     ssh -i ~/.ssh/aws-key-$name.pem [email protected]$ip 
     } 
     function aws-terminate-spot { 
     aws ec2 terminate-instances --instance-ids $instance_id 
     } 
     echo Jupyter Notebook -- $ip:8888 
fi 

# Name of root volume. 
ec2spotter_volume_name=spotter 
# Location (zone) of root volume. If not the same as ec2spotter_launch_zone, 
# a copy will be created in ec2spotter_launch_zone. 
# Can be left blank, if the same as ec2spotter_launch_zone 
ec2spotter_volume_zone=us-west-2b 

ec2spotter_launch_zone=us-west-2b 
ec2spotter_key_name=aws-key-fast-ai 
ec2spotter_instance_type=p2.xlarge 
# Some instance types require a subnet to be specified: 
ec2spotter_subnet=subnet-c9cba8af 

ec2spotter_bid_price=0.55 

# uncomment and update the value if you want an Elastic IP 
# ec2spotter_elastic_ip=eipalloc-64d5890a 

# Security group 
ec2spotter_security_group=sg-2be79356 

# The AMI to be used as the pre-boot environment. This is NOT your target system installation. 
# Do Not Modify this unless you have a need for a different Kernel version from what's supplied. 
# ami-6edd3078 is ubuntu-xenial-16.04-amd64-server-20170113 
ec2spotter_preboot_image_id=ami-bc508adc 

とec2spotter-起動スクリプト:

#!/bin/bash 

    # "Phase 1" this is the user-facing script for launching a new spot istance 

    if [ "$1" = "" ]; then echo "USER ERROR: please specify a configuration file"; exit -1; fi 

    cd $(dirname $0) 

    . $1 || exit -1 

    # New instance: 
    # Desired launch zone 
    LAUNCH_ZONE=$ec2spotter_launch_zone 
    # Region is LAUNCH_ZONE minus the last character 
    LAUNCH_REGION=$(echo $LAUNCH_ZONE | sed -e 's/.$//') 
    PUB_KEY=$ec2spotter_key_name 

    # Existing Volume: 
    # If no volume zone 
    if [ "$ec2spotter_volume_zone" = "" ] 
    then # Use instance zone 
      ec2spotter_volume_zone=$LAUNCH_ZONE 
    fi 

    # Name of volume (find it by name later) 
    ROOT_VOL_NAME=$ec2spotter_volume_name 
    # zone of volume (needed if different than instance zone) 
    ROOT_ZONE=$ec2spotter_volume_zone 
    # Region is Zone minus the last character 
    ROOT_REGION=$(echo $ROOT_ZONE | sed -e 's/.$//') 


    #echo "ROOT_VOL_NAME=${ROOT_VOL_NAME}; ROOT_ZONE=${ROOT_ZONE}; ROOT_REGION=${ROOT_REGION}; " 
    #echo "LAUNCH_ZONE=${LAUNCH_ZONE}; LAUNCH_REGION=${LAUNCH_REGION}; PUB_KEY=${PUB_KEY}" 

    AWS_ACCESS_KEY=`aws configure get aws_access_key_id` 
    AWS_SECRET_KEY=`aws configure get aws_secret_access_key` 

    aws ec2 describe-volumes \ 
      --filters Name=tag-key,Values="Name" Name=tag-value,Values="$ROOT_VOL_NAME" \ 
      --region ${ROOT_REGION} --output=json > volumes.tmp || exit -1 

    ROOT_VOL=$(jq -r '.Volumes[0].VolumeId' volumes.tmp) 
    ROOT_TYPE=$(jq -r '.Volumes[0].VolumeType' volumes.tmp) 

    #echo "ROOT_TYPE=$ROOT_TYPE; ROOT_VOL=$ROOT_VOL"; 
    if [ "$ROOT_VOL_NAME" = "" ] 
then 
    echo "root volume lacks a Name tag"; 
    exit -1; 
fi 

cat >user-data.tmp <<EOF 
#!/bin/sh 
echo AWSAccessKeyId=$AWS_ACCESS_KEY > /root/.aws.creds 
echo AWSSecretKey=$AWS_SECRET_KEY >> /root/.aws.creds 

apt-get update 
apt-get install -y jq 
apt-get install -y python-pip python-setuptools 
apt-get install -y git 

pip install awscli 

cd /root 
git clone --depth=1 https://github.com/slavivanov/ec2-spotter.git 
echo Got spotter scripts from github. 

cd ec2-spotter 

echo Swapping root volume 
./ec2spotter-remount-root --force 1 --vol_name ${ROOT_VOL_NAME} --vol_region ${ROOT_REGION} --elastic_ip $ec2spotter_elastic_ip 
EOF 

userData=$(base64 user-data.tmp | tr -d '\n'); 

cat >specs.tmp <<EOF 
{ 
    "ImageId" : "$ec2spotter_preboot_image_id", 
    "InstanceType": "$ec2spotter_instance_type", 
    "KeyName" : "$PUB_KEY", 
    "EbsOptimized": true, 
    "Placement": { 
    "AvailabilityZone": "$LAUNCH_ZONE" 
    }, 
    "BlockDeviceMappings": [ 
    { 
     "DeviceName": "/dev/sda1", 
     "Ebs": { 
     "DeleteOnTermination": true, 
     "VolumeType": "gp2", 
     "VolumeSize": 128 
     } 
    } 
    ], 
    "NetworkInterfaces": [ 
     { 
     "DeviceIndex": 0, 
     "SubnetId": "${ec2spotter_subnet}", 
     "Groups": [ "${ec2spotter_security_group}" ], 
     "AssociatePublicIpAddress": true 
     } 
    ], 
    "UserData" : "${userData}" 
} 
EOF 

SPOT_REQUEST_ID=$(aws ec2 request-spot-instances --launch-specification file://specs.tmp --spot-price $ec2spotter_bid_price --output="text" --query="SpotInstanceRequests[*].SpotInstanceRequestId" --region ${LAUNCH_REGION}) 
echo $SPOT_REQUEST_ID 
# Clean up 
rm user-data.tmp 
rm specs.tmp 
rm volumes.tmp 
+1

私はあなたがスポットインスタンスでもうこれを行う必要はないと思います。あなたはこの新しい機能を見たことがありますか? https://aws.amazon.com/blogs/aws/new-stop-resume-workloads-on-ec2-spot-instances/ –

+0

この機能は、「容量が使用できなくなったときにのみ使用できるようです。あなたの入札価格 "は私のユースケースではありません。 – Eric

+1

あなたが言及したリンク先のページに行きました。あなたはこの質問をもう一度尋ねる必要がありますが、失敗しているスクリプトの詳細(私はそれが "start_spot.sh"だと思います)を持ってください。なぜ誰かがスクリプトの中から診断を取得して、それがうまくいかない理由を理解したり、何とか修正したりする方法を試すことができると確信しています。別のルートボリュームを手動で接続するには、インスタンスを停止し、現在のルートボリュームを切り離し、同じパラメータ(通常はマウントポイントと/ dev/sda1)を使用して、使用したいボリュームを接続します。 – Vorsprung

答えて

1

これは正確な答えではありませんが、問題をデバッグする方法を見つけるのに役立ちます。私が理解したよう 、これはあなたのセットアップの一部であるボリュームのスワップの責任ec2spotter-launchスクリプトである:

... 
cat >specs.tmp <<EOF 
{ 
    "ImageId" : "$ec2spotter_preboot_image_id", 
    ... 
    "UserData" : "${userData}" 
} 
EOF 

SPOT_REQUEST_ID=$(aws ec2 request-spot-instances --launch-specification file://specs.tmp --spot-price $ec2spotter_bid_price --output="text" --query="SpotInstanceRequests[*].SpotInstanceRequestId" --region ${LAUNCH_REGION}) 

specs.tmpは、インスタンスの起動の仕様として使用されている:--launc-specification file:://specs.tmp。発射仕様内部

そして「UserDataの」はまた、es2spotter-launchで生成されたスクリプトである。

cat >user-data.tmp <<EOF 
#!/bin/sh 
echo AWSAccessKeyId=$AWS_ACCESS_KEY > /root/.aws.creds 
echo AWSSecretKey=$AWS_SECRET_KEY >> /root/.aws.creds 

apt-get update 
... 

cd /root 
git clone --depth=1 https://github.com/slavivanov/ec2-spotter.git 
echo Got spotter scripts from github. 

cd ec2-spotter 

echo Swapping root volume 
./ec2spotter-remount-root --force 1 --vol_name ${ROOT_VOL_NAME} --vol_region ${ROOT_REGION} --elastic_ip $ec2spotter_elastic_ip 
EOF 

ルートボリュームを交換する実際の作業をdownloaded from githubあるec2spotter-remount-rootスクリプトによって実行されます。

このスクリプトにはechoという文がたくさんあるので、出力がどこにあるのか分かっていれば、何が間違っていたのか理解できます。 問題が発生したら、インスタンスにsshしてログファイルを確認します。 質問は、どのファイルを調べるか(そしてスクリプト出力があるファイルに記録されているかどうか)です。インスタンスは(クラウドのinitを起動したときに発生する/var/log

  1. チェック標準のログ:ここ

    は私がしようとすることを提案するものです。自分でログを有効にしてくださいec2spotter-remount-root出力

  2. を見つけることができるかどうかを確認するため)など、Syslogのログ、類似した何かがhere

を議論している私はes2spotter-launchにこの方法をuser-data.tmp一部を変更しようとするだろう:

#!/bin/bash 
set -x 
exec > >(tee /var/log/user-data.log|logger -t user-data) 2>&1 
echo AWSAccessKeyId=$AWS_ACCESS_KEY > /root/.aws.creds 
... 
echo Swapping root volume 
./ec2spotter-remount-root --force 1 --vol_name ${ROOT_VOL_NAME} --vol_region ${ROOT_REGION} --elastic_ip $ec2spotter_elastic_ip 
EOF 

ここで私が変更した最初の3行は/var/log/user-data.logへのログインを有効にします。

  1. 1と2がうまくいかない場合は、スクリプト作成者にgithubを尋ねます。スクリプトに多くのechoがあるので、作成者はその出力をどこで探すべきかを知るべきです。

希望すれば、これを試してみるのを待つ必要はなく、代わりに成功した実行でスクリプトの出力を探すこともできます。 または、テスト実行をほとんど実行できない場合は、それを行い、スクリプト出力でログを見つけることができることを確認してください。

+0

これは完全な答えではありませんが、提供された情報は私が問題を解決できるトラックに確実に設定されます。 – Eric

関連する問題