Ver3.5 ๐ก๏ธ AWS Backup์ผ๋ก ๋ฐ์ดํฐ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ ์๋ํํ๊ธฐ

๐ก๏ธ AWS Backup์ผ๋ก ๋ฐ์ดํฐ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ ์๋ํํ๊ธฐ
ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ ๊ฑด ์ง์ง ์
๋ชฝ์ด์์์ ๐ฑ
AWS Backup์ ์ ๋๋ก ์จ์ ์๋ํ๋ ๋ฐฑ์
ยท๋ณต๊ตฌ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํด๋ด์!
์ด ๊ธ ๋ค ์ฝ์ผ๋ฉด ์ฌ๋ฌ๋ถ๋ ๋ฐฑ์
๊ณ ์ ๋ฉ๋๋ค ใ
ใ
๐ค AWS Backup์ด ๋ญ๋ฐ์? ๊ทธ๋ฅ ์ค๋ ์ท์ด๋ ๋ค๋ฅธ ๊ฑฐ์์?
ใ
ใ
์ด ์ง๋ฌธ ์ง์ง ๋ง์ด ๋ฐ์์. ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด AWS Backup์ ์ฌ๋ฌ AWS ์๋น์ค์ ๋ฐฑ์
์ ํ ๊ณณ์์ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌํ๋ ์์ ๊ด๋ฆฌํ ์๋น์ค์์.
์์ ์๋ ์ด๋ ๋๋ฉด์ โ EC2 ์ค๋
์ท์ EC2 ์ฝ์์์, RDS ๋ฐฑ์
์ RDS ์ฝ์์์, DynamoDB ๋ฐฑ์
์ ๋ ๊ฑฐ๊ธฐ์... ์ด๋ ๊ฒ ๊ฐ๊ฐ ๋ฐ๋ก๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํ๊ฑฐ๋ ์ ๐ฉ
๊ทธ๊ฒ ์ผ๋ง๋ ๊ท์ฐฎ์ ์ผ์ธ์ง ์ด์ํด๋ณธ ์ฌ๋์ ์์ฃ . ๋ฐฑ์
์ ์ฑ
์ด ์๋น์ค๋ง๋ค ๋ค๋ฅด๊ณ , ๋ชจ๋ํฐ๋ง๋ ๋ฐ๋ก ํด์ผ ํ๊ณ , ๊ฐ์ฌ(Audit) ๋ฆฌํฌํธ๋ ๋ฝ๊ธฐ ํ๋ค๊ณ ...
AWS Backup์ ์ด ๋ชจ๋ ๊ฑธ ํ๋์ ์ฝ์, ํ๋์ API, ํ๋์ ์ ์ฑ
์ผ๋ก ํตํฉํด์ค์. 2019๋
์ ์ถ์๋๊ณ ์ง๊ธ์ ์ง์ ์๋น์ค๊ฐ ์์ฒญ ๋ง์์ก์ด์.
๐ AWS Backup vs ๊ฐ๋ณ ์๋น์ค ๋ฐฑ์ ๋น๊ต
| ๊ตฌ๋ถ | ๊ฐ๋ณ ์๋น์ค ๋ฐฑ์ | AWS Backup |
|---|---|---|
| ๊ด๋ฆฌ ์์น | ๊ฐ ์๋น์ค ์ฝ์ ๋ฐ๋ก๋ฐ๋ก | AWS Backup ์ฝ์ ํ๋๋ก ํตํฉ |
| ์ ์ฑ ๊ด๋ฆฌ | ์๋น์ค๋ง๋ค ๋ค๋ฅธ ๋ฐฉ์ | Backup Plan์ผ๋ก ์ผ๊ด๋ ์ ์ฑ |
| ํฌ๋ก์ค ๋ฆฌ์ ๋ณต์ฌ | ์ผ๋ถ ์๋น์ค๋ง ์ง์ | ํตํฉ ์ง์ |
| ํฌ๋ก์ค ๊ณ์ ๋ณต์ฌ | ๋ณต์กํ ์ค์ ํ์ | Organizations ์ฐ๋์ผ๋ก ๊ฐํธ |
| ๊ฐ์ฌ/์ปดํ๋ผ์ด์ธ์ค | ๊ฐ์ ๋ฐ๋ก ํ์ธ | AWS Backup Audit Manager ํตํฉ |
| ๋น์ฉ ๊ฐ์์ฑ | ๋ถ์ฐ๋์ด ํ์ ์ด๋ ค์ | ํ๊ทธ ๊ธฐ๋ฐ ๋น์ฉ ์ถ์ ๊ฐ๋ฅ |
๐๏ธ AWS Backup ํต์ฌ ๊ตฌ์ฑ ์์ ํํค์น๊ธฐ
AWS Backup์ ์ ๋๋ก ์ฐ๋ ค๋ฉด ํต์ฌ ๊ฐ๋ 4๊ฐ์ง๋ฅผ ๊ผญ ์์์ผ ํด์. ์ด๊ฑฐ ๋ชจ๋ฅด๋ฉด ์ฝ์ ๋ค์ด๊ฐ๋ ๋ญ๊ฐ ๋ญ์ง ๋ชจ๋ฆ ใ ใ
1๏ธโฃ Backup Plan (๋ฐฑ์ ๊ณํ)
๋ฐฑ์
๊ณํ์ "์ธ์ , ์ผ๋ง๋ ์์ฃผ, ์ผ๋ง๋ ์ค๋ ๋ณด๊ดํ ์ง"๋ฅผ ์ ์ํ๋ ์ค์ ์ด์์.
Backup Plan ์์๋ ํ๋ ์ด์์ Backup Rule์ด ๋ค์ด๊ฐ๊ณ , ๊ฐ Rule์๋ ๋ค์ ๋ด์ฉ์ด ํฌํจ๋ผ์:
โข Schedule: cron ํํ์ ๋๋ ๋น๋ ์ค์ (๋งค์ผ, ๋งค์ฃผ, ๋งค์๊ฐ ๋ฑ)
โข Backup Window: ๋ฐฑ์ ์์ ์๊ฐ ๋ฐ ์๋ฃ ํ์ฉ ์๊ฐ
โข Lifecycle: ์ฝ๋ ์คํ ๋ฆฌ์ง ์ ํ ์์ + ๋ง๋ฃ(์ญ์ ) ์์
โข Backup Vault: ๋ฐฑ์ ์ ์ฅ ์์น
โข Copy to another Region/Account: ํฌ๋ก์ค ๋ฆฌ์ /๊ณ์ ๋ณต์ฌ ์ค์
2๏ธโฃ Backup Vault (๋ฐฑ์ ๋ณผํธ)
๋ฐฑ์
๋ณผํธ๋ ๋ฐฑ์
๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ์ ์ฅ๋๋ ๋
ผ๋ฆฌ์ ์ปจํ
์ด๋์์. S3 ๋ฒํท์ด๋ ๋น์ทํ ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์.
์ค์ํ ํน์ง์ด ์์ด์ โ ๋ณผํธ์๋ ๋ฆฌ์์ค ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ฑ
์ ๋ถ์ผ ์ ์๊ณ , AWS KMS ํค๋ก ์ํธํํ ์ ์์ด์.
๊ทธ๋ฆฌ๊ณ ์ง์ง ํต์ฌ ๊ธฐ๋ฅ์ธ Vault Lock์ด ์๋๋ฐ, ์ด๊ฑด ์๋์์ ์์ธํ ์ค๋ช
ํ ๊ฒ์!
3๏ธโฃ Recovery Point (๋ณต๊ตฌ ์ง์ )
๋ฐฑ์
์ด ์คํ๋ ๋๋ง๋ค ์์ฑ๋๋ ์ค๋
์ท/๋ฐฑ์
๋ฐ์ดํฐ์ ๋จ์์์. ๊ฐ Recovery Point์๋ ๊ณ ์ ARN์ด ๋ถ์ฌ๋๊ณ , ๋ฉํ๋ฐ์ดํฐ(์์ฑ ์๊ฐ, ํฌ๊ธฐ, ์ํ, ์ํธํ ์ฌ๋ถ ๋ฑ)๊ฐ ํจ๊ป ์ ์ฅ๋ผ์.
๋ณต๊ตฌํ ๋๋ ์ด Recovery Point๋ฅผ ์ ํํด์ ์ํ๋ ์์ ์ผ๋ก ๋๋๋ฆด ์ ์์ด์.
4๏ธโฃ Backup Selection (๋ฐฑ์ ๋์ ์ ํ)
์ด๋ค ๋ฆฌ์์ค๋ฅผ ๋ฐฑ์ ํ ์ง ์ง์ ํ๋ ๋ถ๋ถ์ด์์. ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ด์:
| ๋ฐฉ์ | ์ค๋ช | ์ฅ์ |
|---|---|---|
| ๋ฆฌ์์ค ID ์ง์ ์ง์ | ํน์ EC2, RDS ๋ฑ ARN ์ง์ ์ ๋ ฅ | ๋ช ํํ๊ณ ์์ธก ๊ฐ๋ฅ |
| ํ๊ทธ ๊ธฐ๋ฐ ์ ํ | ํน์ ํ๊ทธ๊ฐ ๋ถ์ ๋ฆฌ์์ค ์๋ ํฌํจ | ๋์ ์ผ๋ก ๋ฆฌ์์ค ์ถ๊ฐ/์ ๊ฑฐ ๊ฐ๋ฅ |
Backup=true ํ๊ทธ๋ฅผ ๋ถ์ธ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ๋ฐฑ์
๋์์ ํฌํจ์ํฌ ์ ์์ด์. ์ ๋ฆฌ์์ค ์์ฑํ ๋ ํ๊ทธ๋ง ๋ถ์ด๋ฉด ์๋์ผ๋ก ๋ฐฑ์
์ ์ฑ
์ ์ฉ๋จ ๐
โ๏ธ AWS Backup ์ค์ ์ค์ ํ๊ธฐ (์ฝ์ + CLI)
์ด๋ก ๋ง ์๋ฉด ๋ญํด์ ใ ใ ์ค์ ๋ก ์ด๋ป๊ฒ ์ค์ ํ๋์ง ๋ด๋ด์!
๐ฅ๏ธ ์ฝ์์์ Backup Plan ๋ง๋ค๊ธฐ
๊ฒ์์ฐฝ์ "Backup" ์น๋ฉด ๋ฐ๋ก ๋์์. ๋ฆฌ์ ํ์ธ ํ์! ๋ฐฑ์ ์ ๋ฆฌ์ ๋ณ๋ก ๊ด๋ฆฌ๋ผ์.
์ธ ๊ฐ์ง ์ต์ ์ด ์์ด์: ํ ํ๋ฆฟ ์ฌ์ฉ / ์๋ก ๋ง๋ค๊ธฐ / JSON์ผ๋ก ์ ์. ์ฒ์์ ํ ํ๋ฆฟ ์ถ์ฒ!
Rule name, Backup frequency(๋น๋), Backup window, Lifecycle(๋ณด์กด ๊ธฐ๊ฐ) ์ค์ ํด์.
ํ๊ทธ ๊ธฐ๋ฐ ๋๋ ๋ฆฌ์์ค ID๋ก ๋ฐฑ์ ๋์ ์ง์ ํด์. IAM Role๋ ์ฌ๊ธฐ์ ์ค์ !
์ค์ ํ ์ค์ผ์ค์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ฐฑ์ ์ด ์คํ๋ผ์ ๐
๐ป AWS CLI๋ก Backup Plan ์์ฑํ๊ธฐ
CLI๋ฅผ ๋ ์ ํธํ๋ ๋ถ๋ค์ ์ํด! JSON ํ์ผ๋ก ์ ์ํ๊ณ CLI๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ด์์.
# backup-plan.json ํ์ผ ์์ฑ
{
"BackupPlanName": "my-daily-backup-plan",
"Rules": [
{
"RuleName": "daily-backup-rule",
"TargetBackupVaultName": "my-backup-vault",
"ScheduleExpression": "cron(0 2 * * ? *)",
"StartWindowMinutes": 60,
"CompletionWindowMinutes": 180,
"Lifecycle": {
"MoveToColdStorageAfterDays": 30,
"DeleteAfterDays": 365
},
"CopyActions": [
{
"DestinationBackupVaultArn": "arn:aws:backup:ap-northeast-2:123456789012:backup-vault:dr-vault",
"Lifecycle": {
"DeleteAfterDays": 90
}
}
]
}
]
}
# Backup Plan ์์ฑ
aws backup create-backup-plan \
--backup-plan file://backup-plan.json \
--region ap-northeast-1
# ๋ฆฌ์์ค ํ ๋น (ํ๊ทธ ๊ธฐ๋ฐ)
aws backup create-backup-selection \
--backup-plan-id "plan-id-์ฌ๊ธฐ์" \
--backup-selection '{
"SelectionName": "tagged-resources",
"IamRoleArn": "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole",
"ListOfTags": [
{
"ConditionType": "STRINGEQUALS",
"ConditionKey": "Backup",
"ConditionValue": "true"
}
]
}'
cron(0 17 * * ? *) ์ด๋ ๊ฒ ์ ๋ 17์ UTC๋ก ์ค์ ํด์ผ ํด์. ์ด๊ฑฐ ํท๊ฐ๋ ค์ ๋ฎ์ ๋ฐฑ์
๋๋ฆฌ๋ ์ค์ ๋ง์ด ํจ ใ
ใ
๐ Vault Lock - ๋ฐฑ์ ๋ฐ์ดํฐ ๋ถ๋ณ์ฑ ๋ณด์ฅ
์ด๊ฑฐ ์ง์ง ์ค์ํ ๊ธฐ๋ฅ์ธ๋ฐ ๋ชจ๋ฅด๋ ๋ถ๋ค์ด ๋ง์์. AWS Backup Vault Lock์ ๋ฐฑ์
๋ณผํธ์ WORM(Write Once Read Many) ์ ์ฑ
์ ์ ์ฉํด์ ๋ฐฑ์
๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ฒ ๋ง๋ ๊ธฐ๋ฅ์ด์์.
๋์ฌ์จ์ด ๊ณต๊ฒฉ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด๋ด์ โ ๊ณต๊ฒฉ์๊ฐ ์์คํ
์ ์นจํฌํด์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ณ , ์ฌ์ง์ด ๋ฐฑ์
๊น์ง ์ญ์ ํ๋ ค๊ณ ์๋ํ๋ ๊ฒฝ์ฐ๊ฐ ์ค์ ๋ก ์์ด์. Vault Lock์ด ์์ผ๋ฉด ๋ฐฑ์
๋ ๋ ์๊ฐ ์ ์์ด์ ๐ฑ
Vault Lock์ด ํ์ฑํ๋ ๋ณผํธ๋ ๋ฃจํธ ๊ณ์ ์ ํฌํจํ ์ด๋ค ์ฌ์ฉ์๋ ๋ณด์กด ๊ธฐ๊ฐ ๋ด์ ๋ฐฑ์
์ ์ญ์ ํ ์ ์์ด์.
๐ป Vault Lock CLI ์ค์
# Vault Lock ์ค์ (Governance ๋ชจ๋ - ํ
์คํธ์ฉ)
aws backup put-backup-vault-lock-configuration \
--backup-vault-name "my-backup-vault" \
--min-retention-days 7 \
--max-retention-days 365 \
--changeable-for-days 3
# Vault Lock ์ค์ (Compliance ๋ชจ๋ - ํ๋ก๋์
์ฉ)
# changeable-for-days ์๋ตํ๋ฉด ์ฆ์ Compliance ๋ชจ๋
aws backup put-backup-vault-lock-configuration \
--backup-vault-name "prod-backup-vault" \
--min-retention-days 30 \
--max-retention-days 2555
๐ ํฌ๋ก์ค ๋ฆฌ์ & ํฌ๋ก์ค ๊ณ์ ๋ฐฑ์
์ง์ง ์ํฐํ๋ผ์ด์ฆ๊ธ DR(Disaster Recovery) ๊ตฌ์ฑํ๋ ค๋ฉด ์ด๊ฒ ํ์์์. ์์ธ ๋ฆฌ์ ์ ์ฅ์ ๊ฐ ๋๋ ๋์ฟ๋ ๋ฒ์ง๋์์ ๋ฐฑ์ ์ด ์์ผ๋ฉด ๋ณต๊ตฌ ๊ฐ๋ฅํ์์์!
๐บ๏ธ ํฌ๋ก์ค ๋ฆฌ์ ๋ณต์ฌ
Backup Plan์ Rule์ Copy to another Region ์ต์
์ ์ถ๊ฐํ๋ฉด ๋ผ์. ๋ฐฑ์
์ด ์๋ฃ๋๋ฉด ์๋์ผ๋ก ์ง์ ํ ๋ฆฌ์ ์ ๋ณผํธ๋ก ๋ณต์ฌํด์ค์.
์ฃผ์ํ ์ ์ ๋ณต์ฌ ๋น์ฉ์ด ๋ณ๋๋ก ๋ฐ์ํด์. ๋ฐ์ดํฐ ์ ์ก ๋น์ฉ + ๋ชฉ์ ์ง ๋ฆฌ์ ์ ๋ฐฑ์
์คํ ๋ฆฌ์ง ๋น์ฉ์ด ์ถ๊ฐ๋ผ์.
# ํฌ๋ก์ค ๋ฆฌ์ ๋ณต์ฌ๊ฐ ํฌํจ๋ Backup Rule
{
"RuleName": "daily-with-cross-region",
"TargetBackupVaultName": "primary-vault",
"ScheduleExpression": "cron(0 17 * * ? *)",
"Lifecycle": {
"DeleteAfterDays": 30
},
"CopyActions": [
{
"DestinationBackupVaultArn": "arn:aws:backup:us-east-1:123456789012:backup-vault:dr-vault-us",
"Lifecycle": {
"DeleteAfterDays": 90
}
}
]
}
๐ข ํฌ๋ก์ค ๊ณ์ ๋ฐฑ์ (AWS Organizations ์ฐ๋)
์ด๊ฑด ์ง์ง ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์์. AWS Organizations๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ๊ด๋ฆฌ ๊ณ์ (Management Account)์์ ๋ฉค๋ฒ ๊ณ์ ๋ค์ ๋ฐฑ์
์ ์ฑ
์ ์ค์์์ ๊ด๋ฆฌํ ์ ์์ด์.
์๋ฅผ ๋ค์ด ๊ฐ๋ฐ ๊ณ์ , ์คํ
์ด์ง ๊ณ์ , ํ๋ก๋์
๊ณ์ ์ด ๊ฐ๊ฐ ์์ ๋, ๊ด๋ฆฌ ๊ณ์ ์์ Backup Policy๋ฅผ ๋ง๋ค์ด์ ๋ชจ๋ ๊ณ์ ์ ์ผ๊ด ์ ์ฉํ ์ ์์ด์!
1. Organizations์์ Backup ์ ๋ขฐ ์๋น์ค ํ์ฑํ
2. ๊ฐ ๋ฉค๋ฒ ๊ณ์ ์ Backup Vault ์์ฑ + ํฌ๋ก์ค ๊ณ์ ์ ๊ทผ ์ ์ฑ ์ค์
3. ๊ด๋ฆฌ ๊ณ์ ์์ Organizations Backup Policy ์์ฑ
4. ์ ์ฑ ์ OU(Organizational Unit) ๋๋ ํน์ ๊ณ์ ์ ์ฐ๊ฒฐ
5. ๋ฉค๋ฒ ๊ณ์ ์์ ์๋์ผ๋ก Backup Plan์ด ์ ์ฉ๋จ!
# ๋ฉค๋ฒ ๊ณ์ ๋ณผํธ์ ํฌ๋ก์ค ๊ณ์ ์ ๊ทผ ํ์ฉ ์ ์ฑ
์ถ๊ฐ
aws backup put-backup-vault-access-policy \
--backup-vault-name "member-account-vault" \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::MANAGEMENT-ACCOUNT-ID:root"
},
"Action": [
"backup:CopyIntoBackupVault"
],
"Resource": "*"
}
]
}'
โป๏ธ ๋ณต๊ตฌ(Restore) ์ค์ ๋ก ํด๋ณด๊ธฐ
๋ฐฑ์ ์ ์ ๋๋๋ฐ ๋ณต๊ตฌ๋ฅผ ๋ชป ํ๋ฉด ์๋ฏธ ์์์์ ใ ใ ๋ณต๊ตฌ ๋ฐฉ๋ฒ๋ ์์๋ด์!
๐ฅ๏ธ ์ฝ์์์ ๋ณต๊ตฌํ๊ธฐ
๋ณต๊ตฌํ๊ณ ์ถ์ ๋ฆฌ์์ค๋ฅผ ์ฐพ์์.
์์ฑ ์๊ฐ, ํฌ๊ธฐ, ์ํ๋ฅผ ํ์ธํ๊ณ ๋ณต๊ตฌํ Recovery Point๋ฅผ ์ ํํด์.
๋ณต๊ตฌ ๋์ ๋ฆฌ์ , ์ ๋ฆฌ์์ค ์ด๋ฆ, ์๋ธ๋ท, ๋ณด์ ๊ทธ๋ฃน ๋ฑ ์ค์ ํด์.
์๋ณธ ๋ฆฌ์์ค๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ ์๋๋ผ ์ ๋ฆฌ์์ค๋ก ๋ณต๊ตฌ๋๋ ์ ์ฃผ์!
๋ณต๊ตฌ ์์ ์ด ์์๋๊ณ ์๋ฃ๋๋ฉด ์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋ผ์.
๐ป CLI๋ก ๋ณต๊ตฌํ๊ธฐ
# Recovery Point ARN ์กฐํ
aws backup list-recovery-points-by-resource \
--resource-arn "arn:aws:ec2:ap-northeast-2:123456789012:instance/i-1234567890abcdef0" \
--query 'RecoveryPoints[*].[RecoveryPointArn,CreationDate,Status]' \
--output table
# EBS ๋ณผ๋ฅจ ๋ณต๊ตฌ ์์
aws backup start-restore-job \
--recovery-point-arn "arn:aws:ec2:ap-northeast-2::snapshot/snap-1234567890abcdef0" \
--iam-role-arn "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole" \
--resource-type "EBS" \
--metadata '{
"availabilityZone": "ap-northeast-2a",
"volumeType": "gp3",
"encrypted": "true"
}'
# RDS ๋ณต๊ตฌ ์์
aws backup start-restore-job \
--recovery-point-arn "arn:aws:rds:ap-northeast-2:123456789012:snapshot:awsbackup-rds-mydb-2024-01-15" \
--iam-role-arn "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole" \
--resource-type "RDS" \
--metadata '{
"DBInstanceIdentifier": "mydb-restored",
"DBInstanceClass": "db.t3.medium",
"Engine": "mysql"
}'
โข AWS Backup์ ํญ์ ์ ๋ฆฌ์์ค๋ก ๋ณต๊ตฌํด์. ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ง์ ๋ฎ์ด์ฐ์ง ์์์.
โข ๋ณต๊ตฌ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ฐ๊ฒฐ ์ค์ (์๋ํฌ์ธํธ, ๋ง์ดํธ ํฌ์ธํธ ๋ฑ)์ ์ ๋ฐ์ดํธํด์ผ ํด์.
โข ๋ณต๊ตฌ ํ ์คํธ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ํด์ผ ํด์! ๋ฐฑ์ ๋ง ํ๊ณ ๋ณต๊ตฌ ํ ์คํธ ์ ํ๋ฉด ์ง์ง ํ์ํ ๋ ๋นํฉํจ ใ ใ
๐ฐ AWS Backup ๋น์ฉ ์ต์ ํ ์ ๋ต
๋ฐฑ์ ์ ์ค์ ํ๋๋ฐ ๋น์ฉ ํญํ ๋ง์ผ๋ฉด ์ ๋์์์ ใ ใ ๋น์ฉ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์ต์ ํํด๋ด์!
๐ ๋น์ฉ ๋ฐ์ ์์
| ๋น์ฉ ํญ๋ชฉ | ์ค๋ช | ์ ๊ฐ ๋ฐฉ๋ฒ |
|---|---|---|
| ๋ฐฑ์ ์คํ ๋ฆฌ์ง (์) | ๋ฐฑ์ ๋ฐ์ดํฐ ์ ์ฅ ๋น์ฉ (GB/์) | Lifecycle์ผ๋ก ์ฝ๋ ์ ํ |
| ๋ฐฑ์ ์คํ ๋ฆฌ์ง (์ฝ๋) | ์ฅ๊ธฐ ๋ณด๊ด ๋น์ฉ (์์ ์ฝ 1/5) | ์ฅ๊ธฐ ๋ณด๊ด ๋ฐ์ดํฐ์ ํ์ฉ |
| ํฌ๋ก์ค ๋ฆฌ์ ์ ์ก | ๋ค๋ฅธ ๋ฆฌ์ ์ผ๋ก ๋ณต์ฌ ์ ๋ฐ์ดํฐ ์ ์ก ๋น์ฉ | ๊ผญ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ณต์ฌ |
| ๋ณต๊ตฌ ๋น์ฉ | ์ฝ๋ ์คํ ๋ฆฌ์ง์์ ๋ณต๊ตฌ ์ ์ถ๊ฐ ๋น์ฉ | ์์ฃผ ๋ณต๊ตฌํ๋ ๋ฐ์ดํฐ๋ ์ ์ ์ง |
| AWS Backup Audit Manager | ๊ฐ์ฌ ๋ฆฌํฌํธ ์์ฑ ๋น์ฉ | ํ์ํ ๋ฆฌํฌํธ๋ง ์์ฑ |
๐ฏ Lifecycle ์ ์ฑ ์ผ๋ก ๋น์ฉ ์ต์ ํ
# ๋น์ฉ ์ต์ ํ๋ Lifecycle ์ค์ ์์
{
"Lifecycle": {
"MoveToColdStorageAfterDays": 30, // 30์ผ ํ ์ฝ๋ ์คํ ๋ฆฌ์ง๋ก ์ด๋
"DeleteAfterDays": 365 // 1๋
ํ ์๋ ์ญ์
}
}
# ๊ณ์ธต๋ณ ๋ณด์กด ์ ๋ต ์์
# Rule 1: ๋งค์ผ ๋ฐฑ์
- 7์ผ ๋ณด๊ด (์)
# Rule 2: ๋งค์ฃผ ๋ฐฑ์
- 30์ผ ํ ์ฝ๋ ์ ํ, 90์ผ ๋ณด๊ด
# Rule 3: ๋งค์ ๋ฐฑ์
- 30์ผ ํ ์ฝ๋ ์ ํ, 1๋
๋ณด๊ด
# Rule 4: ๋งค๋
๋ฐฑ์
- 30์ผ ํ ์ฝ๋ ์ ํ, 7๋
๋ณด๊ด (์ปดํ๋ผ์ด์ธ์ค์ฉ)
โข ํ๊ทธ๋ฅผ ํ์ฉํด์ ์ค์๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ณด์กด ์ ์ฑ ์ ์ฉ
โข ๊ฐ๋ฐ/ํ ์คํธ ํ๊ฒฝ์ ์งง์ ๋ณด์กด ๊ธฐ๊ฐ ์ค์ (7์ผ ์ ๋๋ฉด ์ถฉ๋ถ)
โข AWS Cost Explorer์์ "AWS Backup" ์๋น์ค ํํฐ๋ก ๋ฐฑ์ ๋น์ฉ๋ง ๋ฐ๋ก ๋ชจ๋ํฐ๋ง
โข ๋ถํ์ํ ์๋ ๋ฐฑ์ (On-demand backup)์ด ์์ด์ง ์๋๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฆฌ
๐ AWS Backup Audit Manager - ์ปดํ๋ผ์ด์ธ์ค ์๋ํ
๊ธ์ต, ์๋ฃ, ๊ณต๊ณต ๋ถ์ผ์์ ์ผํ๋ ๋ถ๋ค์ ์ด ๊ธฐ๋ฅ์ด ์ง์ง ์ ์ฉํด์. AWS Backup Audit Manager๋ ๋ฐฑ์ ์ ์ฑ ์ค์ ์ฌ๋ถ๋ฅผ ์๋์ผ๋ก ํ๊ฐํ๊ณ ๋ฆฌํฌํธ๋ฅผ ์์ฑํด์ค์.
๐ ์ฃผ์ ๊ธฐ๋ฅ
โข Backup Controls: ๋ฐฑ์ ์ ์ฑ ์ค์ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๊ท์น (์: "๋ชจ๋ RDS๋ 7์ผ ์ด์ ๋ฐฑ์ ๋ณด๊ดํด์ผ ํจ")
โข Backup Frameworks: ์ฌ๋ฌ Control์ ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ๋จ์
โข Backup Reports: ์ผ๋ณ/์ฃผ๋ณ ์ปดํ๋ผ์ด์ธ์ค ๋ฆฌํฌํธ ์๋ ์์ฑ โ S3๋ก ์ ์ก
โข AWS Config ์ฐ๋: ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ด๋ ฅ๊ณผ ์ฐ๊ณํ ๊ฐ์ฌ ์ถ์
๐ป Backup Framework ์์ฑ ์์
# Backup Framework ์์ฑ
aws backup create-framework \
--framework-name "compliance-framework" \
--framework-controls '[
{
"ControlName": "BACKUP_RECOVERY_POINT_MINIMUM_RETENTION_CHECK",
"ControlInputParameters": [
{
"ParameterName": "requiredRetentionDays",
"ParameterValue": "35"
}
]
},
{
"ControlName": "BACKUP_PLAN_MIN_FREQUENCY_AND_MIN_RETENTION_CHECK",
"ControlInputParameters": [
{
"ParameterName": "requiredFrequencyUnit",
"ParameterValue": "days"
},
{
"ParameterName": "requiredFrequencyValue",
"ParameterValue": "1"
},
{
"ParameterName": "requiredRetentionDays",
"ParameterValue": "35"
}
]
}
]'
๐ ๊ธฐ๋ณธ ์ ๊ณต Control ๋ชฉ๋ก
| Control ์ด๋ฆ | ์ฒดํฌ ๋ด์ฉ |
|---|---|
| BACKUP_RECOVERY_POINT_MINIMUM_RETENTION_CHECK | ์ต์ ๋ณด์กด ๊ธฐ๊ฐ ์ค์ ์ฌ๋ถ |
| BACKUP_PLAN_MIN_FREQUENCY_AND_MIN_RETENTION_CHECK | ์ต์ ๋ฐฑ์ ๋น๋ ๋ฐ ๋ณด์กด ๊ธฐ๊ฐ |
| BACKUP_RECOVERY_POINT_ENCRYPTED | ๋ฐฑ์ ์ํธํ ์ฌ๋ถ |
| BACKUP_RESOURCES_PROTECTED_BY_BACKUP_PLAN | ๋ฆฌ์์ค๊ฐ ๋ฐฑ์ ๊ณํ์ ํฌํจ๋์ด ์๋์ง |
| BACKUP_RECOVERY_POINT_MANUAL_DELETION_DISABLED | ์๋ ์ญ์ ๋ฐฉ์ง ์ค์ ์ฌ๋ถ |
๐ค Terraform์ผ๋ก AWS Backup ์ธํ๋ผ ์ฝ๋ํ
DevOps ๊ด์ ์์ ๋ฐฑ์ ์ค์ ๋ IaC(Infrastructure as Code)๋ก ๊ด๋ฆฌํด์ผ ํด์! Terraform์ผ๋ก AWS Backup์ ์ฝ๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ด๋ด์. ์ฌ๋ฅ๋ท์์๋ ์ด๋ฐ DevOps ์๋ํ ๊ด๋ จ ์ฌ๋ฅ์ ๊ฑฐ๋ํ๋ ๋ถ๋ค์ด ๋ง๋๋ผ๊ณ ์ ๐
# main.tf - AWS Backup ์ ์ฒด ๊ตฌ์ฑ
# Backup Vault ์์ฑ
resource "aws_backup_vault" "main" {
name = "production-backup-vault"
kms_key_arn = aws_kms_key.backup.arn
tags = {
Environment = "production"
ManagedBy = "terraform"
}
}
# KMS ํค ์์ฑ (๋ฐฑ์
์ํธํ์ฉ)
resource "aws_kms_key" "backup" {
description = "KMS key for AWS Backup"
deletion_window_in_days = 7
enable_key_rotation = true
}
# Backup Plan ์์ฑ
resource "aws_backup_plan" "main" {
name = "production-backup-plan"
rule {
rule_name = "daily-backup"
target_vault_name = aws_backup_vault.main.name
schedule = "cron(0 17 * * ? *)" # KST 02:00
start_window = 60 # ๋ถ
completion_window = 180 # ๋ถ
lifecycle {
cold_storage_after = 30 # 30์ผ ํ ์ฝ๋ ์คํ ๋ฆฌ์ง
delete_after = 365 # 1๋
ํ ์ญ์
}
copy_action {
destination_vault_arn = "arn:aws:backup:us-east-1:${data.aws_caller_identity.current.account_id}:backup-vault:dr-vault"
lifecycle {
delete_after = 90
}
}
}
rule {
rule_name = "weekly-backup"
target_vault_name = aws_backup_vault.main.name
schedule = "cron(0 17 ? * SUN *)" # ๋งค์ฃผ ์ผ์์ผ KST 02:00
lifecycle {
cold_storage_after = 30
delete_after = 2555 # 7๋
๋ณด๊ด (์ปดํ๋ผ์ด์ธ์ค)
}
}
tags = {
Environment = "production"
}
}
# IAM Role for Backup
resource "aws_iam_role" "backup" {
name = "aws-backup-service-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "backup.amazonaws.com"
}
}
]
})
}
resource "aws_iam_role_policy_attachment" "backup_policy" {
role = aws_iam_role.backup.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup"
}
resource "aws_iam_role_policy_attachment" "restore_policy" {
role = aws_iam_role.backup.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores"
}
# Backup Selection (ํ๊ทธ ๊ธฐ๋ฐ)
resource "aws_backup_selection" "main" {
name = "production-resources"
iam_role_arn = aws_iam_role.backup.arn
plan_id = aws_backup_plan.main.id
selection_tag {
type = "STRINGEQUALS"
key = "Backup"
value = "true"
}
}
# Vault Lock (Governance ๋ชจ๋)
resource "aws_backup_vault_lock_configuration" "main" {
backup_vault_name = aws_backup_vault.main.name
changeable_for_days = 3
max_retention_days = 1200
min_retention_days = 7
}
aws_backup_vault_lock_configuration์์ changeable_for_days๋ฅผ ์๋ตํ๋ฉด ์ฆ์ Compliance ๋ชจ๋๊ฐ ๋ผ์ Terraform์ผ๋ก๋ ์ญ์ /์์ ์ด ๋ถ๊ฐ๋ฅํด์ ธ์. ์ฒ์์ ๋ฐ๋์ Governance ๋ชจ๋๋ก ํ
์คํธํ์ธ์!
๐จ CloudWatch + SNS๋ก ๋ฐฑ์ ๋ชจ๋ํฐ๋ง ์๋ฆผ ์ค์
๋ฐฑ์ ์ด ์คํจํด๋ ๋ชจ๋ฅด๋ฉด ์์ฉ์์์์! ๋ฐฑ์ ์คํจ ์ ์ฆ์ ์๋ฆผ์ ๋ฐ๋๋ก ์ค์ ํด๋ด์.
๐ข EventBridge + SNS ์๋ฆผ ์ค์
# EventBridge Rule - ๋ฐฑ์
์คํจ ๊ฐ์ง
aws events put-rule \
--name "backup-failure-alert" \
--event-pattern '{
"source": ["aws.backup"],
"detail-type": ["Backup Job State Change"],
"detail": {
"state": ["FAILED", "ABORTED", "EXPIRED"]
}
}' \
--state ENABLED
# SNS ํ ํฝ ARN์ ํ๊ฒ์ผ๋ก ์ค์
aws events put-targets \
--rule "backup-failure-alert" \
--targets '[
{
"Id": "backup-sns-target",
"Arn": "arn:aws:sns:ap-northeast-2:123456789012:backup-alerts",
"InputTransformer": {
"InputPathsMap": {
"jobId": "$.detail.backupJobId",
"resourceArn": "$.detail.resourceArn",
"state": "$.detail.state",
"statusMessage": "$.detail.statusMessage"
},
"InputTemplate": "\"๋ฐฑ์
์คํจ ์๋ฆผ! Job ID: <jobId>, ๋ฆฌ์์ค: <resourceArn>, ์ํ: <state>, ๋ฉ์์ง: <statusMessage>\""
}
}
]'
๐ CloudWatch ๋์๋ณด๋๋ก ๋ฐฑ์ ํํฉ ๋ชจ๋ํฐ๋ง
AWS Backup์ ์๋์ผ๋ก CloudWatch ๋ฉํธ๋ฆญ์ ์์ฑํด์. ์ฃผ์ ๋ฉํธ๋ฆญ๋ค์ ์์๋ด์:
| ๋ฉํธ๋ฆญ ์ด๋ฆ | ์ค๋ช | ๊ถ์ฅ ์๋ ์กฐ๊ฑด |
|---|---|---|
| NumberOfBackupJobsCompleted | ์๋ฃ๋ ๋ฐฑ์ ์์ ์ | ์์๋ณด๋ค ๋ฎ์ ๋ |
| NumberOfBackupJobsFailed | ์คํจํ ๋ฐฑ์ ์์ ์ | 1 ์ด์์ผ ๋ |
| NumberOfRestoreJobsCompleted | ์๋ฃ๋ ๋ณต๊ตฌ ์์ ์ | ๋ชจ๋ํฐ๋ง์ฉ |
| NumberOfRestoreJobsFailed | ์คํจํ ๋ณต๊ตฌ ์์ ์ | 1 ์ด์์ผ ๋ |
๐ฏ ์ค๋ฌด์์ ์์ฃผ ํ๋ ์ค์ & ๋ฒ ์คํธ ํ๋ํฐ์ค
์ด๋ก ์ ๋ค ์๊ฒ ๋๋ฐ ์ค๋ฌด์์ ์ฝ์งํ๋ ํฌ์ธํธ๋ค์ด ์์ด์ ใ ใ ๋ฏธ๋ฆฌ ์๊ณ ํผํด๊ฐ๋ด์!
โ ํํ ์ค์๋ค
๋ฐฑ์ ์ ์ด์ฌํ ์ค์ ํด๋๊ณ ๋ณต๊ตฌ ํ ์คํธ๋ฅผ ํ ๋ฒ๋ ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์. ์ค์ ์ฅ์ ์ํฉ์์ ๋ณต๊ตฌ๊ฐ ์ ๋๋ฉด ๊ทธ๋ ๊ฐ์ ๋นํฉํ๊ฒ ๋ผ์. ๋ถ๊ธฐ๋ณ ๋ณต๊ตฌ ๋๋ฆด(Restore Drill)์ ๋ฐ๋์ ์ค์ํ์ธ์!
AWS Backup ์๋น์ค ์ญํ ์ ํ์ํ ๊ถํ์ด ์์ผ๋ฉด ๋ฐฑ์ ์ด ์กฐ์ฉํ ์คํจํด์.
AWSBackupServiceRolePolicyForBackup๊ณผ AWSBackupServiceRolePolicyForRestores ์ ์ฑ
์ ๋ฐ๋์ ๋ถ์ฌ์ผ ํด์.
cron ํํ์์ UTC ๊ธฐ์ค์ด์์! KST๋ก ์๋ฒฝ 2์์ ๋ฐฑ์ ํ๋ ค๋ฉด UTC 17์(์ ๋ )๋ก ์ค์ ํด์ผ ํด์. ์ด๊ฑฐ ๋ชจ๋ฅด๊ณ ๋ฎ์ ๋ฐฑ์ ๋๋ฆฌ๋ ํ ์ง์ง ๋ง์์ ใ ใ
StartWindowMinutes์ CompletionWindowMinutes๋ฅผ ๋๋ฌด ์งง๊ฒ ์ค์ ํ๋ฉด ๋ฐฑ์
์ด ์์์ ๋์ง๋ง ์๋ฃ ์ ์ ํ์์์์ผ๋ก ์คํจํด์. ๋์ฉ๋ DB๋ ์ถฉ๋ถํ ์๋ฃ ์๊ฐ์ ์ค์ผ ํด์.
โ ๋ฒ ์คํธ ํ๋ํฐ์ค
โข 3๊ฐ์ ๋ฐฑ์ ๋ณต์ฌ๋ณธ ์ ์ง
โข 2๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฏธ๋์ด/์คํ ๋ฆฌ์ง ํ์
โข 1๊ฐ๋ ์คํ์ฌ์ดํธ(๋ค๋ฅธ ๋ฆฌ์ ๋๋ ๊ณ์ )
AWS Backup์ ํฌ๋ก์ค ๋ฆฌ์ ๋ณต์ฌ๋ก ์ด ๊ท์น์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด์!
๋ชจ๋ ๋ฆฌ์์ค์ ์ผ๊ด๋ ํ๊ทธ ์ ์ฑ ์ ์ ์ฉํ์ธ์. ์:
โข
Backup=true/false: ๋ฐฑ์
๋์ ์ฌ๋ถโข
BackupTier=gold/silver/bronze: ๋ฐฑ์
์ค์๋ (๋ณด์กด ๊ธฐ๊ฐ ์ฐจ๋ฑ)โข
Environment=prod/staging/dev: ํ๊ฒฝ๋ณ ๋ค๋ฅธ ์ ์ฑ
์ ์ฉ
๊ธฐ๋ณธ์ ์ผ๋ก AWS Backup์ ์๋น์ค ๊ด๋ฆฌ ํค๋ก ์ํธํํ์ง๋ง, ๊ณ ๊ฐ ๊ด๋ฆฌ KMS ํค(CMK)๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ ๊ถ์ฅํด์. ํค ๋กํ ์ด์ ๋ ํ์ฑํํ์ธ์!
๋ฐฑ์ ์คํจ ์ ์ฆ์ ์๋ฆผ์ ๋ฐ๋๋ก EventBridge + SNS ์ค์ ์ ๋ฐ๋์ ํด๋์ธ์. Slack ์ฐ๋๋ ๊ฐ๋ฅํด์!
AWS Cost Explorer์์ ๋ฐฑ์ ๋น์ฉ์ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํ๊ณ , ๋ถํ์ํ๊ฒ ์์ธ ์๋ ๋ฐฑ์ ์ด๋ ๋ง๋ฃ๋ Recovery Point๋ฅผ ์ ๋ฆฌํ์ธ์.
๐ AWS Backup๊ณผ ๋ค๋ฅธ ์๋น์ค ์ฐ๋
AWS Backup์ ๋จ๋ ์ผ๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ๋ค๋ฅธ ์๋น์ค์ ์ฐ๋ํ๋ฉด ๋ ๊ฐ๋ ฅํด์ ธ์!
๐ง ์ฃผ์ ์ฐ๋ ์๋น์ค
| ์ฐ๋ ์๋น์ค | ํ์ฉ ๋ฐฉ๋ฒ |
|---|---|
| AWS Organizations | ๋ฉํฐ ๊ณ์ ํ๊ฒฝ์์ ์ค์ ์ง์ค์ ๋ฐฑ์ ์ ์ฑ ๊ด๋ฆฌ |
| AWS Config | ๋ฐฑ์ ์ ์ฑ ์ค์ ์ฌ๋ถ ์ง์์ ํ๊ฐ ๋ฐ ๊ฐ์ฌ ์ถ์ |
| AWS CloudTrail | ๋ฐฑ์ /๋ณต๊ตฌ API ํธ์ถ ๋ก๊น ๋ฐ ๊ฐ์ฌ |
| Amazon EventBridge | ๋ฐฑ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ํ (์คํจ ์๋ฆผ, ์๋ ๋ณต๊ตฌ ํธ๋ฆฌ๊ฑฐ ๋ฑ) |
| AWS Lambda | ๋ฐฑ์ ์๋ฃ ํ ์๋ํ ์์ (์๋ฆผ, ๊ฒ์ฆ, ํ๊ทธ ์ ๋ฐ์ดํธ ๋ฑ) |
| AWS SNS | ๋ฐฑ์ ์ํ ์๋ฆผ (์ด๋ฉ์ผ, SMS, Slack ๋ฑ) |
| AWS KMS | ๋ฐฑ์ ๋ฐ์ดํฐ ์ํธํ ํค ๊ด๋ฆฌ |
| AWS IAM | ์ธ๋ฐํ ์ ๊ทผ ์ ์ด ๋ฐ ๊ถํ ๊ด๋ฆฌ |
๐ค Lambda๋ก ๋ฐฑ์ ์๋ฃ ํ ์๋ ๊ฒ์ฆ
# Lambda ํจ์ - ๋ฐฑ์
์๋ฃ ํ Recovery Point ๊ฒ์ฆ
import boto3
import json
def lambda_handler(event, context):
backup_client = boto3.client('backup')
# EventBridge์์ ์ ๋ฌ๋ ๋ฐฑ์
์๋ฃ ์ด๋ฒคํธ
job_id = event['detail']['backupJobId']
recovery_point_arn = event['detail']['recoveryPointArn']
# Recovery Point ์ํ ํ์ธ
response = backup_client.describe_recovery_point(
BackupVaultName='production-backup-vault',
RecoveryPointArn=recovery_point_arn
)
rp = response['RecoveryPoint']
# ๊ฒ์ฆ ๊ฒฐ๊ณผ ๋ก๊น
print(f"Recovery Point ARN: {rp['RecoveryPointArn']}")
print(f"Status: {rp['Status']}")
print(f"Size: {rp.get('BackupSizeInBytes', 0) / (1024**3):.2f} GB")
print(f"Encrypted: {rp.get('IsEncrypted', False)}")
# ์ํธํ ์ฌ๋ถ ์ฒดํฌ
if not rp.get('IsEncrypted', False):
# SNS ์๋ฆผ ๋ฐ์ก
sns_client = boto3.client('sns')
sns_client.publish(
TopicArn='arn:aws:sns:ap-northeast-2:123456789012:backup-alerts',
Subject='โ ๏ธ ๋ฐฑ์
์ํธํ ๋ฏธ์ ์ฉ ๊ฒฝ๊ณ ',
Message=f'Recovery Point {recovery_point_arn}์ด ์ํธํ๋์ง ์์์ต๋๋ค!'
)
return {
'statusCode': 200,
'body': json.dumps('Validation completed')
}
์ด๋ฐ ์์ผ๋ก ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ AWS ๋ฐฑ์ ์๋ํ ๊ตฌ์ถ ์ฌ๋ฅ์ ์ ๊ณตํ๋ ๋ถ๋ค๋ ์ด Lambda + EventBridge ํจํด์ ๋ง์ด ํ์ฉํ๋๋ผ๊ณ ์ ๐
๐ ์๋น์ค๋ณ ๋ฐฑ์ ํน์ด์ฌํญ ์ ๋ฆฌ
๊ฐ ์๋น์ค๋ง๋ค ๋ฐฑ์ ๋ฐฉ์์ด๋ ์ ์ฝ์ฌํญ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์. ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ค์ ์ ๋ฆฌํด๋ดค์ด์!
๐ฅ๏ธ EC2 ๋ฐฑ์
โข ์ฐ๊ฒฐ๋ EBS ๋ณผ๋ฅจ๋ ํจ๊ป ์ค๋ ์ท ์์ฑ
โข ์ธ์คํด์ค ์คํ ์ด(์์ ์คํ ๋ฆฌ์ง)๋ ๋ฐฑ์ ์ ๋จ โ ๏ธ
โข ๋ณต๊ตฌ ์ ์ EC2 ์ธ์คํด์ค๋ก ์์ฑ๋จ
โข ๋ฐฑ์ ์ค์๋ ์ธ์คํด์ค ์คํ ์ํ ์ ์ง (๋ฌด์ค๋จ)
๐๏ธ RDS ๋ฐฑ์
โข ์๋ ๋ฐฑ์ (Automated Backup)๊ณผ ๋ณ๊ฐ๋ก ์ถ๊ฐ ๋ฐฑ์ ๊ฐ๋ฅ
โข Multi-AZ ํ๊ฒฝ์์๋ ์คํ ๋ฐ์ด ์ธ์คํด์ค์์ ๋ฐฑ์ ์ํ (์ฑ๋ฅ ์ํฅ ์ต์ํ)
โข ๋ณต๊ตฌ ์ ์ DB ์ธ์คํด์ค๋ก ์์ฑ๋จ
โข Aurora๋ ํด๋ฌ์คํฐ ์ค๋ ์ท์ผ๋ก ๋ฐฑ์ ๋จ
โก DynamoDB ๋ฐฑ์
โข AWS Backup์ On-demand ๋ฐฑ์ ๋ฐฉ์์ผ๋ก ๋์
โข PITR์ DynamoDB ์์ฒด ๊ธฐ๋ฅ์ผ๋ก ๋ณ๋ ์ค์ ํ์
โข ๋ฐฑ์ ์ค ํ ์ด๋ธ ์ฑ๋ฅ์ ์ํฅ ์์ (์๋ฒ๋ฆฌ์ค ๋ฐฑ์ )
โข ์ฝ๋ ์คํ ๋ฆฌ์ง ์ ํ ์ง์
๐ EFS ๋ฐฑ์
โข ์ฆ๋ถ ๋ฐฑ์ ์ง์ (๋ณ๊ฒฝ๋ ํ์ผ๋ง ๋ฐฑ์ )
โข ์ฝ๋ ์คํ ๋ฆฌ์ง ์ ํ ์ง์ (๋น์ฉ ์ ๊ฐ ํจ๊ณผ ํผ)
โข ๋ณต๊ตฌ ์ ์ EFS ํ์ผ ์์คํ ๋๋ ๊ธฐ์กด ํ์ผ ์์คํ ์ ๋ณต๊ตฌ ์ ํ ๊ฐ๋ฅ
๐ชฃ S3 ๋ฐฑ์
โข ๋ฒํท ๋ด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐฑ์
โข S3 ๋ฒ์ ๊ด๋ฆฌ์๋ ๋ณ๊ฐ์ ๊ธฐ๋ฅ
โข ๋ณต๊ตฌ ์ ์๋ณธ ๋ฒํท ๋๋ ์ ๋ฒํท์ผ๋ก ๋ณต๊ตฌ ๊ฐ๋ฅ
โข ๋์ฉ๋ ๋ฒํท์ ๋ฐฑ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์
๐ ๋ง๋ฌด๋ฆฌ - AWS Backup ๋์ ๋ก๋๋งต
์, ์ด์ AWS Backup์ ๋ํด ๊ฝค ๋ง์ด ์๊ฒ ๋์ฃ ? ใ ใ ์ค์ ๋ก ๋์ ํ ๋ ์ด๋ค ์์๋ก ์งํํ๋ฉด ์ข์์ง ๋ก๋๋งต์ ์ ๋ฆฌํด๋ดค์ด์!
ํ์ฌ ์ด๋ค ๋ฆฌ์์ค๊ฐ ์๋์ง, ๊ธฐ์กด ๋ฐฑ์ ๋ฐฉ์์ ์ด๋ค์ง, RTO/RPO ์๊ตฌ์ฌํญ์ ๋ฌด์์ธ์ง ํ์ ํด์.
๋ฐฑ์ ๋์ ์๋ณ์ ์ํ ํ๊ทธ ์ ์ฑ ์ ์๋ฆฝํ๊ณ ๊ธฐ์กด ๋ฆฌ์์ค์ ํ๊ทธ๋ฅผ ๋ถ์ฌ์.
๊ฐ๋ฐ/ํ ์คํธ ํ๊ฒฝ์์ ๋จผ์ AWS Backup์ ์ค์ ํ๊ณ ๋ฐฑ์ /๋ณต๊ตฌ๋ฅผ ํ ์คํธํด์.
๊ฒ์ฆ๋ ์ค์ ์ ํ๋ก๋์ ์ ์ ์ฉํด์. Terraform/CloudFormation์ผ๋ก IaCํ ๊ถ์ฅ!
CloudWatch ๋์๋ณด๋, EventBridge ์๋ฆผ, Audit Manager ์ค์ ํด์.
์ ๊ธฐ์ ์ผ๋ก ๋ณต๊ตฌ ํ ์คํธ๋ฅผ ์ค์ํ๊ณ RTO๋ฅผ ์ธก์ ํด์. ๋ฌธ์ํ๋ ํ์!
โข AWS Backup = ์ฌ๋ฌ ์๋น์ค ๋ฐฑ์ ์ ์ค์ ์ง์ค์ ๊ด๋ฆฌ ํ๋ซํผ
โข Backup Plan + Vault + Recovery Point + Selection 4๊ฐ์ง ๊ฐ๋ ์ด ํต์ฌ
โข Vault Lock์ผ๋ก ๋์ฌ์จ์ด ๋ฐฉ์ด ๋ฐ ์ปดํ๋ผ์ด์ธ์ค ์ถฉ์กฑ
โข ํฌ๋ก์ค ๋ฆฌ์ /๊ณ์ ๋ณต์ฌ๋ก ์ง์ ํ DR ๊ตฌ์ฑ ๊ฐ๋ฅ
โข Lifecycle ์ ์ฑ ์ผ๋ก ๋น์ฉ ์ต์ ํ ํ์
โข ๋ณต๊ตฌ ํ ์คํธ๋ ๋ฐ๋์ ์ ๊ธฐ์ ์ผ๋ก! ๋ฐฑ์ ๋ง ํ๊ณ ๋ณต๊ตฌ ํ ์คํธ ์ ํ๋ฉด ์๋ฏธ ์์ ใ ใ
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.