我有一个脚本可以跨区域复制未加密和加密的快照。 使用未加密的快照副本,脚本工作正常但由于某种原因,加密副本失败并出现错误: -
An error occurred (InvalidParameterValue) when calling the CopyDBSnapshot operation: PreSignedUrl could not be authenticated.
以下是我用来复制加密快照的代码
aws rds copy-db-snapshot
--source-db-snapshot-identifier $source_identifier \
--target-db-snapshot-identifier ${target_identifier} \
--kms-key-id $Enc_Key_ID\
--region $target_region
--source-region $source_region \
--tags Key="owner",Value="RDS Copy Job"
此处传递的所有变量(加密密钥除外)与跨区域的未加密副本一起正常工作。
我想知道出了什么问题。任何帮助和建议对我来说都是一个很大的帮助。 (更新)
aws rds copy-db-snapshot \
--source-db-snapshot-identifier arn:aws:rds:us-west-1:717934610271:snapshot:rds:rds-snapshot-name-dev-2017-12-22-08-08 \
--target-db-snapshot-identifier test-rds-snapshotname \
--kms-key-id XXXXXX-XXXXXX-XXXXXX-XXXXXX \
--region us-east-1\
--source-region us-west-1 \
--tags Key="owner",Value="RDS Copy Job"
上面是用于复制的完整命令。我正在使用ARN来复制
答案 0 :(得分:3)
指定在目标区域中有效的KMS密钥。
您可以复制使用AWS KMS加密的快照 加密密钥。如果您复制加密的快照,则复制 快照也必须加密。如果您复制加密的快照 在同一AWS区域内,您可以使用相同的KMS加密副本 加密密钥作为原始快照,或者您可以指定一个 不同的KMS加密密钥。 如果您复制加密的快照 区域,您不能使用相同的KMS加密密钥作为副本 用于源快照,因为KMS密钥是特定于区域的。 相反,您必须在目标AWS中指定有效的KMS密钥 区域。
答案 1 :(得分:0)
我发现复制加密的快照时必须提供--source-region
参数。这是有效的CLI命令-
AWS_DEFAULT_REGION=ap-south-1
source_snapshot_arn="arn:aws:rds:ap-southeast-1:3621xxxx334:snapshot:v2db-snapshot-1"
dest_snapshot_id="v2db-snapshot-1"
aws rds copy-db-snapshot \
--kms-key-id db-prod-kms \
--source-region ap-southeast-1 \
--source-db-snapshot-identifier $source_snapshot_arn \
--target-db-snapshot-identifier $dest_snapshot_id
有效的KMS密钥政策-
{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Allow backup to use key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::3621xxxx8334:user/backup"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey",
"kms:CreateGrant",
"kms:Create*",
"kms:Describe*",
"kms:List*",
"kms:Get*",
"kms:ImportKeyMaterial",
"kms:TagResource",
"kms:UntagResource"
],
"Resource": "*"
}
]
}
答案 2 :(得分:0)
下面的脚本对我有用,其思想是,如果未在目标AWS区域中创建KMS默认密钥,而不是使用kms ID alias/aws/rds
,则它将创建新的KMS ID。
#!/bin/bash
if [[ -z $1 ]]; then
echo "please input source region from which copy"
exit
fi
if [[ -z $2 ]]; then
echo "please input destination region"
exit
fi
REGION_SOURCE=$1
REGION_DESTINATION=$2
RDS_DBSnapshotIdentifier=`/usr/bin/aws rds describe-db-snapshots --region $REGION_SOURCE --query="reverse(sort_by(DBSnapshots, &SnapshotCreateTime))[0]" | /usr/bin/jq -r '.DBSnapshotArn'`
echo "Copying RDS from $REGION_SOURCE to $REGION_DESTINATION"
TODAY_DATE=`/bin/date +"%Y-%m-%d-%H-%M-%S"`
KMS_KEY_ID=`/usr/bin/aws kms list-aliases --region $REGION_DESTINATION| /usr/bin/jq -r '.[]' | /usr/bin/jq -r '.[] | select( .AliasName == "alias/aws/rds")' | /usr/bin/jq -r '.TargetKeyId'`
if [[ $KMS_KEY_ID == null ]]; then
KMS_KEY_ID="alias/aws/rds"
fi
/usr/bin/aws rds copy-db-snapshot --kms-key-id $KMS_KEY_ID --source-db-snapshot-identifier $RDS_DBSnapshotIdentifier --target-db-snapshot-identifier "RDS-COPY-${TODAY_DATE}-from-${REGION_SOURCE}-to-${REGION_DESTINATION}" --region $REGION_DESTINATION --source-region $REGION_SOURCE