我正在编写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)没有任何超时或尝试数量选项。
可能你们中的一些人也面临过同样的问题?
所以,最后,我使用以下方法来解决它:
- 创建快照
- 使用循环检查命令
aws ec2 wait snapshot-completed
的退出状态 - 如果退出状态不是
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
这解决了的问题
如果你有更多的目标组要编辑,只需将目标组输出到一个文件中,并在循环中运行。