亚马逊网络服务-aws命令行接口-aws ec2等待-超过最大尝试次数



我正在编写shell脚本,切换如下:

  • 创建EBS卷的快照
  • 基于此快照创建AMI映像

1) 我使用以下命令创建快照:
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)没有任何超时或尝试数量选项。

可能你们中的一些人也面临过同样的问题?

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

  1. 创建快照
  2. 使用循环检查命令aws ec2 wait snapshot-completed的退出状态
  3. 如果退出状态不是0,则打印当前状态,继续并再次运行服务员

# 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

如果您有什么可以改进的地方,请与我们分享。

您可能应该在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

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%

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

ISSUE:在ci/cd中,我们有命令等待ecs服务稳定,并得到了这个错误

aws ecs wait services-stable 
    --cluster MyCluster 
    --services MyService

错误消息:Waiter ServicesStable failed: Max attempts exceeded

修复

为了解决这个问题,我们遵循了这个文档->https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/load-balancer-healthcheck.html

aws elbv2 modify-target-group --target-group-arn <arn of target group> --healthy-threshold-count 2 --health-check-interval-seconds 5 --health-check-timeout-seconds 4 

->https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/load-balancer-connection-draining.html

aws elbv2 modify-target-group-attributes --target-group-arn <arn of target group> --attributes Key=deregistration_delay.timeout_seconds,Value=10

这解决了的问题

如果你有更多的目标组要编辑,只需将目标组输出到一个文件中,并在循环中运行。

相关内容

  • 没有找到相关文章

最新更新