AWS CLI中跨区域的加密RDS复制失败

时间:2017-12-25 00:35:34

标签: amazon-web-services encryption amazon-rds boto3 aws-cli

我有一个脚本可以跨区域复制未加密和加密的快照。 使用未加密的快照副本,脚本工作正常但由于某种原因,加密副本失败并出现错误: -

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来复制

3 个答案:

答案 0 :(得分:3)

指定在目标区域中有效的KMS密钥。

  

您可以复制使用AWS KMS加密的快照   加密密钥。如果您复制加密的快照,则复制   快照也必须加密。如果您复制加密的快照   在同一AWS区域内,您可以使用相同的KMS加密副本   加密密钥作为原始快照,或者您可以指定一个   不同的KMS加密密钥。 如果您复制加密的快照   区域,您不能使用相同的KMS加密密钥作为副本   用于源快照,因为KMS密钥是特定于区域的。   相反,您必须在目标AWS中指定有效的KMS密钥   区域。

Handling Encryption

答案 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