如何让aws s3 sync、cp --recursive在S3源对象不存在时抛出错误
AWS S3 sync/cp --recursive 命令源路径不存在时抛出错误的解决方案
AWS CLI 的 aws s3 sync 和 aws s3 cp --recursive 命令默认将S3源路径作为前缀匹配规则处理,若指定前缀无匹配对象,命令会默认返回0退出码(执行成功),同时生成空的本地目标目录,属于官方设计的默认行为。
要实现源路径不存在时主动抛出错误,可以采用以下两种方案:
方案1:前置校验S3源路径有效性(兼容所有AWS CLI版本)
先通过aws s3 ls命令校验源路径是否存在可访问的对象,再决定是否执行同步/复制操作,适配shell脚本场景的示例如下:
# 定义源路径和目标路径变量 S3_SRC="s3://your-bucket/target/source/path/" LOCAL_DEST="./localpath" # 校验源路径是否存在且可访问 if aws s3 ls "${S3_SRC}" > /dev/null 2>&1; then # 校验通过,执行同步 aws s3 sync "${S3_SRC}" "${LOCAL_DEST}" else echo "Error: S3源路径 ${S3_SRC} 不存在或无访问权限" exit 1 fi
如果需要区分「源路径不存在」和「源路径存在但为空目录」的场景,可以去掉> /dev/null的输出重定向,统计返回的对象数量做进一步判断。
方案2:使用AWS CLI V2专属参数
如果你使用的是AWS CLI V2版本,可以直接在sync命令中添加--fail-on-no-transfer参数,当命令没有传输任何文件时会主动返回非0退出码,同时不会创建空的本地目录:aws s3 sync s3://path/to/non/exist/path localpath --fail-on-no-transfer
注意:该参数仅适配AWS CLI V2版本,V1版本不支持该配置。
内容的提问来源于stack exchange,提问作者Vikash Balasubramanian
相关产品推荐
相关产品推荐

