複数リージョンの全AWS BackupボールトにAWS CLIでボールトロックを一括設定してみた
はじめに
複数リージョンに存在するすべてのAWS Backupボールトに対して、AWS CLIを使用してボールトロックを一括作成する機会がありましたので、その方法をご紹介します。
この作業が必要になった背景は、組織全体のデータ保護とコンプライアンス強化の一環として、すべてのバックアップボールトに一貫したロックポリシーを適用する必要が生じたためです。
AWS CLI
以下のコマンドをAWS CloudShellで実行することで、ボールトロックを一括作成できます。
- 対象リージョン:東京リージョン(ap-northeast-1)とバージニア北部リージョン(us-east-1)の全ボールト
- 最小保持期間:30日
- 最大保持期間:365日
- ロックモード:ガバナンスモード(注:
--changeable-for-days 3
オプションを追加するとコンプライアンスモードになります)
$ for region in us-east-1 ap-northeast-1; do
aws backup list-backup-vaults --region $region --query 'BackupVaultList[].BackupVaultName' --output text | tr '\t' '\n' | while read -r vault; do
echo "Attempting to create vault lock for $vault in $region"
aws backup put-backup-vault-lock-configuration \
--backup-vault-name "$vault" \
--region $region \
--min-retention-days 30 \
--max-retention-days 365
done
done
// 出力結果
Attempting to create vault lock for Default in us-east-1
Attempting to create vault lock for Default in ap-northeast-1
Attempting to create vault lock for aws/efs/automatic-backup-vault in ap-northeast-1
Attempting to create vault lock for test in ap-northeast-1
Attempting to create vault lock for test-vault in ap-northeast-1
東京リージョン
バージニア北部リージョン
対象リージョンや保持期間は、組織の要件に応じて適宜変更してください。
対象リージョンのすべてのボールトロックを削除するコマンドは以下の通りです。
$ for region in us-east-1 ap-northeast-1; do
aws backup list-backup-vaults --region $region --query 'BackupVaultList[].BackupVaultName' --output text | tr '\t' '\n' | while read -r vault; do
echo "Attempting to delete vault lock for $vault in $region"
aws backup delete-backup-vault-lock-configuration \
--backup-vault-name "$vault" \
--region $region
done
done
// 出力結果
Attempting to delete vault lock for Default in us-east-1
Attempting to delete vault lock for Default in ap-northeast-1
Attempting to delete vault lock for aws/efs/automatic-backup-vault in ap-northeast-1
Attempting to delete vault lock for test in ap-northeast-1
Attempting to delete vault lock for test-vault in ap-northeast-1
特定のボールト名をスキップ
特定のボールト名をスキップしてボールトロックを作成したい場合、以下のコマンドで実現できます。
- 対象リージョン:東京リージョン(ap-northeast-1)とバージニア北部リージョン(us-east-1)のボールト
- 最小保持期間:30日
- 最大保持期間:365日
- ロックモード:ガバナンスモード(注:
--changeable-for-days 3
オプションを追加するとコンプライアンスモードになります) - スキップ対象:
automatic-backup-vault
を含むボールト名
$ for region in us-east-1 ap-northeast-1; do
aws backup list-backup-vaults --region $region --query 'BackupVaultList[].BackupVaultName' --output text | tr '\t' '\n' | while read -r vault; do
if [[ "$vault" != *"automatic-backup-vault"* ]]; then
echo "Attempting to create vault lock for $vault in $region"
aws backup put-backup-vault-lock-configuration \
--backup-vault-name "$vault" \
--region $region \
--min-retention-days 30 \
--max-retention-days 365
else
echo "Skipping $vault in $region"
fi
done
done
// 出力結果
Attempting to create vault lock for Default in us-east-1
Attempting to create vault lock for Default in ap-northeast-1
Skipping aws/efs/automatic-backup-vault in ap-northeast-1
Attempting to create vault lock for test in ap-northeast-1
Attempting to create vault lock for test-vault in ap-northeast-1
出力結果から、aws/efs/automatic-backup-vault
に対してはボールトロックの作成をスキップしていることがわかります。
対象リージョンのautomatic-backup-vault
を含むボールト名を除き、ボールトロックをすべて削除するコマンドは以下の通りです。
$ for region in us-east-1 ap-northeast-1; do
aws backup list-backup-vaults --region $region --query 'BackupVaultList[].BackupVaultName' --output text | tr '\t' '\n' | while read -r vault; do
if [[ "$vault" != *"automatic-backup-vault"* ]]; then
echo "Attempting to delete vault lock for $vault in $region"
aws backup delete-backup-vault-lock-configuration \
--backup-vault-name "$vault" \
--region $region
else
echo "Skipping $vault in $region"
fi
done
done
// 出力結果
Attempting to create vault lock for Default in us-east-1
Attempting to create vault lock for Default in ap-northeast-1
Skipping aws/efs/automatic-backup-vault in ap-northeast-1
Attempting to create vault lock for test in ap-northeast-1
Attempting to create vault lock for test-vault in ap-northeast-1
aws/efs/automatic-backup-vault
はボールトロックの作成をスキップしているため、削除時にもスキップする必要はないかもしれません。
しかし、特定のボールトにはボールトロックを作成したくない場合もあると考え、スキップを含めたコマンドを紹介しました。
ボールトロック作成や削除できない場合
ボールトロックの作成や削除ができない場合は、実行ユーザーの権限およびボールト側のアクセスポリシーを確認する必要があります。
$ for region in us-east-1 ap-northeast-1; do
aws backup list-backup-vaults --region $region --query 'BackupVaultList[].BackupVaultName' --output text | tr '\t' '\n' | while read -r vault; do
echo "Attempting to delete vault lock for $vault in $region"
aws backup delete-backup-vault-lock-configuration \
--backup-vault-name "$vault" \
--region $region
done
done
//出力結果
Attempting to delete vault lock for Default in us-east-1
Attempting to delete vault lock for Default in ap-northeast-1
Attempting to delete vault lock for aws/efs/automatic-backup-vault in ap-northeast-1
An error occurred (AccessDeniedException) when calling the DeleteBackupVaultLockConfiguration operation: User: arn:aws:sts::012345678901:assumed-role/test-user/test-user is not authorized to perform: backup:DeleteBackupVaultLockConfiguration on resource: arn:aws:backup:ap-northeast-1:012345678901:backup-vault:aws/efs/automatic-backup-vault with an explicit deny in a resource-based policy
Attempting to delete vault lock for test in ap-northeast-1
Attempting to delete vault lock for test-vault in ap-northeast-1
アクセスポリシーを確認したところ、backup:DeleteBackupVaultLockConfiguration
アクションが明示的にDeny(拒否)設定されていることがわかりました。
このDeny設定を解除することで、ボールトロックの削除が可能になります。
参考