一千萬個為什麽

搜索

使用CLI列出加密的RDS快照



我已經在區域內自動完成了RDS快照復制,但加密的快照無法復制。 我想出了一種使用復制加密快照的方法

$  aws rds copy-db-snapshot   --source-db-snapshot-identifier arn:aws:rds:eu-west-1:XXXX:snapshot:XXX-2017-01-31-04-30      --target-db-snapshot-identifier mydbsnapshotcopy   --kms-key-id XXX --region eu-central-1 --source-region eu-west-1

我想過濾/測試快照是否加密,如果它們是加密的,我將執行上述定義的操作。 我試過這不起作用。

$ aws rds describe-db-snapshots  --filter "Name=encrypted,Values=true"

如何列出/過濾所有加密的快照並將其移至文件?

轉載註明原文: 使用CLI列出加密的RDS快照

一共有 2 個回答:

使用 - query 屬性

aws rds describe-db-snapshots --query "DBSnapshots[?Encrypted].DBSnapshotIdentifier"

如果 [?Encrypted] 不起作用,請嘗試使用 [?Encrypted =='true'] 作為第一個來自JMESPath改進的過濾器。在某些情況下,引號可能需要反引號。這完全取決於。

第二種方式:

aws rds describe-db-snapshots --output json | jq '.DBSnapshots | map(select(has("Encrypted"))) | .[].DBSnapshotIndetifier'

其中之一應該工作。由於我沒有輸出來調整 jq 命令,因此可能需要稍微調整一下。隨意編輯並修復答案。

您需要一個腳本才能與 AWS cli 進行交互,以實現您的目標。

To list encrypted drives I use the following query when describing the DB snapshots --query 'DBSnapshots[*].[DBSnapshotArn,Encrypted]'

我將以下腳本放在一起查找所有加密的DBS快照,然後將其全部復制到其他區域。還可以修改它以將未加密的快照復制到其他區域,然後對其進行加密。

我已經在評論中解釋了腳本。它很臟 ...   所以請隨時改進

#!/usr/bin/env bash
#
# Copy encrypted or unencrypted DBSnapshots to an encrypted DBSnapshot in a different region
#

aws_profile="" 
aws_source_region="" 
aws_dest_region="" 
aws_kms_key_id="" #destination kms key ID 
num=1

aws --profile "${aws_profile}" --region "${aws_source_region}" rds describe-db-snapshots \
  --query 'DBSnapshots[*].[DBSnapshotArn,Encrypted]' \  
  --output text > rds-snapshots-list.txt

echo "Encrypted snapshots" 
awk '{IGNORECASE=1}{if ($2 == "True") print}' rds-snapshots-list.txt #Show list of encrypted snapshots 
echo "Unencrypted snapshots" 
awk '{IGNORECASE=1}{if ($2 == "False") print}' rds-snapshots-list.txt #Show list of unencrypted snapshots

IFS=$'\n' read -d '' -r -a rds_list_lines < rds-snapshots-list.txt #Move txt file content into an array

echo "Copying encrypted snapshots from ${aws_source_region} to ${aws_dest_region}" 
for i in "${rds_list_lines[@]}"; do #Loop through array   
if [[ "${i}" == *"True"* ]]; then #Check for encrypted rds snapshot & if true copy snapshot
    source_snapshot_ident="$( echo "${i}" | sed 's/[[:blank:]]True.*//')" #Remove all spaces tabs and the word true
    target_snapshot_ident="$( echo "$source_snapshot_ident" | sed 's/.*:snapshot:rds:.//')snapshotcopy$num" #Name of target snapshot with incrementing number
    ((num++))

    aws --profile "${aws_profile}" --region "${aws_dest_region}" rds copy-db-snapshot \
      --source-db-snapshot-identifier "${source_snapshot_ident}" \
      --target-db-snapshot-identifier "${target_snapshot_ident}" \
      --source-region "${aws_source_region}" \
      --kms-key-id "${aws_kms_key_id}"   
fi 
done