aws命令行界面 - aws ec2 wait - 超出最大尝试次数

时间:2015-06-22 10:22:41

标签: amazon-web-services amazon-ec2 aws-cli

我正在研究shell脚本,女巫确实遵循:

  • 创建EBS卷的快照;
  • 根据此快照创建AMI图像。

1)我使用follow命令创建快照:
SNAPSHOT_ID=$(aws ec2 create-snapshot "${DRYRUN}" --volume-id "${ROOT_VOLUME_ID}" --description "${SNAPSHOT_DESCRIPTION}" --query 'SnapshotId')

2)我使用服务员等待完成状态:
aws ec2 wait snapshot-completed --snapshot-ids "${SNAPSHOT_ID}"

当我使用EBS Volume 8 GB测试时,一切顺利 当它是40 GB时,我有一个例外:
Waiter SnapshotCompleted failed: Max attempts exceeded

可能40 GB需要更多时间,然后是8 GB,只需要等待。

AWS文档(http://docs.aws.amazon.com/cli/latest/reference/ec2/wait/snapshot-completed.html)没有任何超时或尝试数量选项。

你可能有些人遇到过同样的问题吗?

4 个答案:

答案 0 :(得分:9)

所以,最后,我使用了以下方式来解决它:

  1. 创建快照
  2. 使用循环检查命令aws ec2 wait snapshot-completed
  3. 的退出状态
  4. 如果退出状态不是0,则再打印当前状态,进度并再次运行服务员。
  5. # Create snapshot
    SNAPSHOT_DESCRIPTION="Snapshot of Primary frontend instance $(date +%Y-%m-%d)"
    SNAPSHOT_ID=$(aws ec2 create-snapshot "${DRYRUN}" --volume-id "${ROOT_VOLUME_ID}" --description "${SNAPSHOT_DESCRIPTION}" --query 'SnapshotId')
    
    while [ "${exit_status}" != "0" ]
    do
        SNAPSHOT_STATE="$(aws ec2 describe-snapshots --filters Name=snapshot-id,Values=${SNAPSHOT_ID} --query 'Snapshots[0].State')"
        SNAPSHOT_PROGRESS="$(aws ec2 describe-snapshots --filters Name=snapshot-id,Values=${SNAPSHOT_ID} --query 'Snapshots[0].Progress')"
        echo "### Snapshot id ${SNAPSHOT_ID} creation: state is ${SNAPSHOT_STATE}, ${SNAPSHOT_PROGRESS}%..."
    
        aws ec2 wait snapshot-completed --snapshot-ids "${SNAPSHOT_ID}"
        exit_status="$?"
    
    done
    

    如果您有可以改善它的内容,请与我们分享。

答案 1 :(得分:3)

aws ec2 wait snapshot-completed需要一段时间才能超时。此代码段使用aws ec2 describe-snapshots来获取进度。如果是100%,则会调用snapshot-completed

# create snapshot
SNAPSHOTID=$(aws ec2 create-snapshot --volume-id $VOLUMEID --output text --query "SnapshotId")
echo "Waiting for Snapshot ID: $SNAPSHOTID"

SNAPSHOTPROGRESS=$(aws ec2 describe-snapshots --snapshot-ids $SNAPSHOTID --query "Snapshots[*].Progress" --output text)

while [ $SNAPSHOTPROGRESS != "100%" ]
do
  sleep 15
  echo "Snapshot ID: $SNAPSHOTID $SNAPSHOTPROGRESS"
  SNAPSHOTPROGRESS=$(aws ec2 describe-snapshots --snapshot-ids $SNAPSHOTID --query "Snapshots[*].Progress" --output text)
done

aws ec2 wait snapshot-completed --snapshot-ids "$SNAPSHOTID"

这与上面基本相同,但每15秒打印一次进度消息。完成的快照会立即返回100%

答案 2 :(得分:1)

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-retries.html

您可以设置一个变量或使用配置文件来增加超时时间。

AWS_MAX_ATTEMPTS=100

~/.aws/config
[default]
retry_mode = standard
max_attempts = 6

答案 3 :(得分:0)

您可能应该在bash中使用until,看起来更干净一些,而不必重复。

echo "waiting for snapshot $snapshot"
until aws ec2 wait snapshot-completed --snapshot-ids $snapshot 2>/dev/null
do
    do printf "\rsnapshot progress: %s" $progress;
    sleep 10
    progress=$(aws ec2 describe-snapshots --snapshot-ids $snapshot --query "Snapshots[*].Progress" --output text)
done