feat: support ECS RAM role backups
This commit is contained in:
@@ -74,7 +74,11 @@ source "$offsite_config_file"
|
||||
offsite_enabled=${OFFSITE_BACKUP_ENABLED:-false}
|
||||
bucket=${OFFSITE_OSS_BUCKET:-}
|
||||
prefix=${OFFSITE_OSS_PREFIX:-data-terminal-cloud}
|
||||
auth_mode=${OFFSITE_OSS_AUTH_MODE:-config}
|
||||
oss_region=${OFFSITE_OSS_REGION:-}
|
||||
oss_endpoint=${OFFSITE_OSS_ENDPOINT:-}
|
||||
oss_config=${OFFSITE_OSS_CONFIG_FILE:-/etc/data-terminal-cloud/ossutilconfig}
|
||||
ecs_metadata_base=${ECS_METADATA_BASE_URL:-http://100.100.100.200/latest}
|
||||
|
||||
if [[ "$offsite_enabled" != true ]]; then
|
||||
write_status disabled not_enabled
|
||||
@@ -84,7 +88,35 @@ fi
|
||||
[[ "$bucket" =~ ^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$ ]] || fail_sync invalid_bucket 2
|
||||
[[ "$prefix" =~ ^[A-Za-z0-9._/-]+$ && "$prefix" != /* && "$prefix" != *..* ]] || fail_sync invalid_prefix 2
|
||||
[[ -x "$ossutil_bin" ]] || fail_sync ossutil_missing 3
|
||||
[[ -r "$oss_config" ]] || fail_sync oss_config_missing 4
|
||||
|
||||
checkpoint_dir="$state_dir/checkpoints"
|
||||
common=(-f --job 1 --parallel 1 --checkpoint-dir "$checkpoint_dir" --output-format json)
|
||||
case "$auth_mode" in
|
||||
config)
|
||||
[[ -r "$oss_config" ]] || fail_sync oss_config_missing 4
|
||||
common+=(-c "$oss_config")
|
||||
;;
|
||||
ecs_ram_role)
|
||||
command -v curl >/dev/null 2>&1 || fail_sync curl_missing 3
|
||||
[[ "$oss_region" =~ ^[a-z0-9][a-z0-9-]{1,62}$ ]] || fail_sync invalid_oss_region 2
|
||||
if [[ -z "$oss_endpoint" ]]; then
|
||||
oss_endpoint="oss-$oss_region.aliyuncs.com"
|
||||
fi
|
||||
[[ "$oss_endpoint" =~ ^[a-z0-9][a-z0-9.-]{1,251}[a-z0-9]$ && "$oss_endpoint" != *..* ]] || fail_sync invalid_oss_endpoint 2
|
||||
metadata_token=$(curl --silent --show-error --fail --max-time 3 -X PUT \
|
||||
-H 'X-aliyun-ecs-metadata-token-ttl-seconds: 60' "$ecs_metadata_base/api/token" || true)
|
||||
[[ -n "$metadata_token" ]] || fail_sync ecs_metadata_v2_unavailable 4
|
||||
role_response="$transfer_dir/ecs-role-name"
|
||||
role_code=$(curl --silent --show-error --max-time 3 --output "$role_response" --write-out '%{http_code}' \
|
||||
-H "X-aliyun-ecs-metadata-token: $metadata_token" "$ecs_metadata_base/meta-data/ram/security-credentials/" || true)
|
||||
role_name=$(tr -d '\r\n' <"$role_response")
|
||||
[[ "$role_code" == 200 && "$role_name" =~ ^[A-Za-z0-9@._-]{1,64}$ ]] || fail_sync ecs_ram_role_missing 4
|
||||
common+=(--mode EcsRamRole --region "$oss_region" --endpoint "$oss_endpoint")
|
||||
;;
|
||||
*)
|
||||
fail_sync invalid_auth_mode 2
|
||||
;;
|
||||
esac
|
||||
|
||||
latest_backup=$(find "$backup_root" -maxdepth 1 -type f -name 'platform-*.tar.gz.enc' -printf '%T@ %p\n' 2>/dev/null | sort -nr | head -n1 | cut -d' ' -f2- || true)
|
||||
[[ -n "$latest_backup" && -f "$latest_backup" ]] || fail_sync local_backup_missing 5
|
||||
@@ -99,10 +131,8 @@ source_size=$(stat -c %s "$latest_backup")
|
||||
prefix=${prefix%/}
|
||||
remote_archive="oss://$bucket/$prefix/$source_name"
|
||||
remote_checksum="$remote_archive.sha256"
|
||||
checkpoint_dir="$state_dir/checkpoints"
|
||||
mkdir -p "$checkpoint_dir"
|
||||
|
||||
common=(-f -c "$oss_config" --job 1 --parallel 1 --checkpoint-dir "$checkpoint_dir" --output-format json)
|
||||
if ! "$ossutil_bin" cp "$latest_backup" "$remote_archive" "${common[@]}" --metadata "sha256=$source_sha" >/dev/null; then
|
||||
fail_sync archive_upload_failed 6
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user