AWS Backup policy for org


Điều kiện: trên các account thuộc cái OU ốp vào target sẽ phải có cái vault tên như backup policy, chẳng hạn backup-data-vault và cái role tên là test-s3-backup, cái role này thì phải được gắn policy cho phép backup S3, đồng thời các account thực hiện backup, và account management cũng phải bật s3 backup ở phần setting. Các tag gắn vào resource assignment thì không đc khác, dù là dấu space

{
    "plans": {
        "yentrinh-backup-policy-plan": {
            "regions": {
                "@@assign": [
                    "ap-southeast-1"
                ]
            },
            "rules": {
                "rule2": {
                    "schedule_expression": {
                        "@@assign": "cron(40 3/1 ? * * *)"
                    },
                    "start_backup_window_minutes": {
                        "@@assign": "60"
                    },
                    "complete_backup_window_minutes": {
                        "@@assign": "120"
                    },
                    "target_backup_vault_name": {
                        "@@assign": "backup-data-vault"
                    },
                    "copy_actions": {
                        "arn:aws:backup:ap-southeast-1:111122223333:backup-vault:vault-destination": {
                            "target_backup_vault_arn": {
                                "@@assign": "arn:aws:backup:ap-southeast-1:111122223333:backup-vault:vault-destination"
                            },
                            "lifecycle": {}
                        }
                    }
                },
                "backup_rule": {
                    "schedule_expression": {
                        "@@assign": "cron(30 3 ? * * *)"
                    },
                    "start_backup_window_minutes": {
                        "@@assign": "60"
                    },
                    "complete_backup_window_minutes": {
                        "@@assign": "120"
                    },
                    "lifecycle": {
                        "delete_after_days": {
                            "@@assign": "35"
                        }
                    },
                    "target_backup_vault_name": {
                        "@@assign": "backup-data-vault"
                    },
                    "copy_actions": {
                        "arn:aws:backup:ap-southeast-1:111122223333:backup-vault:vault-destination": {
                            "target_backup_vault_arn": {
                                "@@assign": "arn:aws:backup:ap-southeast-1:111122223333:backup-vault:vault-destination"
                            },
                            "lifecycle": {}
                        }
                    },
                    "enable_continuous_backup": {
                        "@@assign": true
                    }
                }
            },
            "backup_plan_tags": {
                "backup_plan": {
                    "tag_key": {
                        "@@assign": "backup_plan"
                    },
                    "tag_value": {
                        "@@assign": "yes"
                    }
                }
            },
            "selections": {
                "tags": {
                    "backup_rs_assignment": {
                        "iam_role_arn": {
                            "@@assign": "arn:aws:iam::$account:role/test-s3-backup"
                        },
                        "tag_key": {
                            "@@assign": "backup"
                        },
                        "tag_value": {
                            "@@assign": [
                                "yes"
                            ]
                        }
                    },
                    "rs-assignment": {
                        "iam_role_arn": {
                            "@@assign": "arn:aws:iam::$account:role/test-s3-backup"
                        },
                        "tag_key": {
                            "@@assign": "data_type"
                        },
                        "tag_value": {
                            "@@assign": [
                                "prod"
                            ]
                        }
                    }
                }
            }
        }
    }
}

Lưu ý: Thời điểm hiện tại S3 backup chưa hỗ trợ việc đưa vào cold storage, nếu trong hành động copy mà có chuyển vào cold storage thì sẽ không chạy backup job.

Tại tài khoản management:

https://docs.aws.amazon.com/aws-backup/latest/devguide/manage-cross-account.html

Tài khoản delegate sẽ có thể thấy được job ở tài khoản khác

Có thể đặt event để trigger lambda restore, với event pattern như sau:

{
  "source": ["aws.backup"],
  "detail-type": ["Backup Job State Change"],
  "detail": {
    "state": ["COMPLETED"]
  }
}

https://github.com/aws-samples/aws-backup-alarms

https://d1.awsstatic.com/events/Summits/awsreinforce2023/DAP341_Automate-your-AWS-Backup-strategy-.pdf

https://aws.amazon.com/blogs/storage/amazon-cloudwatch-events-and-metrics-for-aws-backup/

Hướng dẫn restore EC2 của aws:

https://aws.amazon.com/blogs/storage/automate-data-recovery-validation-with-aws-backup/

Hiện tại code và hướng dẫn liên quan đến S3 restore khá thiếu rõ ràng, nên mình sẽ post đoạn code restore như sau:

Quyền lambda restore:

arn:aws:iam::aws:policy/AWSBackupOperatorAccess

arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores

arn:aws:iam::aws:policy/AWSBackupServiceRolePolicyForS3Restore

arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole

#Set values for restore metadata
print('Setting restore metadata values')

restore_metadata = metadata['RestoreMetadata']
restore_metadata["DestinationBucketName"] = destination_bucket_name
restore_metadata["NewBucket"] = create_new_bucket
restore_metadata["Encrypted"] = encrypt_restore_objects
restore_metadata["CreationToken"] = creation_token # Required param, even value = ""

# API call to start the restore job
restore_request = backup.start_restore_job(
      RecoveryPointArn=arn,
      IamRoleArn=restore_iam_role,
      Metadata=metadata['RestoreMetadata']
      ResourceType='S3'
)

Lưu ý rằng: Nếu copy EBS, thì sẽ phải mã hóa EBS bằng custom key, và sửa key policy để cho phép account đích sử dụng!