| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- headless service
- github action 사용법
- EKS 클러스터
- Firelens
- 메탈LB
- SAA 합격 후기
- Kubernetes
- 솔데스크
- 딥레이서
- 그라파나 시각화
- 그라파나 대시보드
- jenkins
- LoadBalancer Controller
- Kubernets on Jenkins
- 쿠버네티스 컴포넌트
- kubernetes 동작 원리
- EFS CSI Driver
- blue-green
- AWS 딥레이서
- 딥레이서 보상함수
- 쿠버네티스
- helm
- livenessPorbe
- terraform
- 깃허브 액션
- Prometheus install
- 로드밸런서 컨트롤러
- grafana on kubernetes
- Aurora cluster
- Solution Architecture
mingming
Netbackup AWS Integration 본문
NetBackup Snapshot Manager AWS Cross-Account Integration
AWS에서 서비스를 운영하다 보면, 계정을 하나만 쓰지 않고 여러 개로 나눠 쓰는 경우가 많습니다.
예를 들어, 운영 계정에는 실제 서비스가 돌고, 별도의 보안/백업 계정에서는 모니터링과 로그만 관리하는 식이죠.
바로 Cross-Account Integration을 설정해서, Snapshot Manager가 다른 계정 리소스까지 백업하도록 만드는 방법이 있습니다.
Cross-Account 구조 이해하기
간단히 말해,
- Source Account → NetBackup Snapshot Manager가 설치된 계정
- Target Account → 실제 보호할 워크로드(EC2, EBS, RDS)가 있는 계정
이 두 계정을 이어주는 게 IAM Role + AssumeRole 입니다.
즉, Source Account의 Snapshot Manager가 Target Account 안에 있는 Role을 “빌려 쓰는” 방식으로 접근하는 거죠.
단계별 설정 방법
1) Target Account에 IAM Role 만들기
먼저 보호 대상 계정에 Role을 하나 만듭니다. 이름은 편하게 NBU_SnapshotRole 정도로 두면 관리하기 좋습니다.
그리고 신뢰 정책(Trust Policy)에 Source Account ID를 넣어줘야 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::PRIMARY_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
이렇게 하면 Source Account에서 이 Role을 AssumeRole 할 수 있게 됩니다.
2) Role에 권한 붙이기
Snapshot Manager가 할 수 있는 일이 꽤 많습니다. EC2 스냅샷도 만들고, RDS 백업도 하고, 암호화된 볼륨은 KMS까지 접근해야 하죠.
그래서 Role에 다음과 같은 권한을 붙입니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "KMSAccess",
"Effect": "Allow",
"Action": [
"kms:ListKeys",
"kms:Encrypt",
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:GenerateDataKeyWithoutPlaintext",
"kms:CreateGrant",
"kms:ReEncryptTo",
"kms:ReEncryptFrom",
"kms:DescribeKey",
"kms:ListAliases"
],
"Resource": "*"
},
{
"Sid": "RDSBackupRestore",
"Effect": "Allow",
"Action": [
"rds:DescribeDBSnapshots",
"rds:DescribeDBClusters",
"rds:DescribeDBClusterSnapshots",
"rds:DeleteDBSnapshot",
"rds:CreateDBSnapshot",
"rds:CreateDBClusterSnapshot",
"rds:ModifyDBSnapshotAttribute",
"rds:DescribeDBSubnetGroups",
"rds:DescribeDBInstances",
"rds:CopyDBSnapshot",
"rds:CopyDBClusterSnapshot",
"rds:DescribeDBSnapshotAttributes",
"rds:DeleteDBClusterSnapshot",
"rds:ListTagsForResource",
"rds:AddTagsToResource",
"rds:ModifyDBInstance",
"rds:ModifyDBClusterSnapshotAttribute",
"rds:RestoreDBInstanceFromDBSnapshot",
"rds:ModifyDBCluster",
"rds:RestoreDBClusterFromSnapshot",
"rds:CreateDBInstance",
"rds:RestoreDBClusterToPointInTime",
"rds:CreateDBSecurityGroup",
"rds:CreateDBCluster",
"rds:RestoreDBInstanceToPointInTime",
"rds:DescribeDBClusterParameterGroups"
],
"Resource": "*"
},
{
"Sid": "STSAccess",
"Effect": "Allow",
"Action": [
"sts:GetCallerIdentity",
"sts:AssumeRole"
],
"Resource": "*"
},
{
"Sid": "EC2SnapshotAndRestore",
"Effect": "Allow",
"Action": [
"ec2:CreateSnapshot",
"ec2:CreateSnapshots",
"ec2:DescribeInstances",
"ec2:DescribeInstanceStatus",
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:DescribeSnapshots",
"ec2:DescribeVolumeStatus",
"ec2:DescribeVolumes",
"ec2:RegisterImage",
"ec2:DeregisterImage",
"ec2:DescribeVolumeAttribute",
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"ec2:DescribeInstanceAttribute",
"ec2:DeleteSnapshot",
"ec2:DescribeRegions",
"ec2:DescribeAvailabilityZones",
"ec2:ResetSnapshotAttribute",
"ec2:DescribeHosts",
"ec2:DescribeImages",
"ec2:DescribeSecurityGroups",
"ec2:DescribeNetworkInterfaces",
"ec2:RunInstances",
"ec2:AttachNetworkInterface",
"ec2:DetachVolume",
"ec2:AttachVolume",
"ec2:DeleteTags",
"ec2:CreateTags",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances",
"ec2:CreateVolume",
"ec2:DeleteVolume",
"ec2:DescribeIamInstanceProfileAssociations",
"ec2:AssociateIamInstanceProfile",
"ec2:AssociateAddress",
"ec2:DescribeKeyPairs",
"ec2:DescribeInstanceTypeOfferings",
"ec2:GetEbsEncryptionByDefault",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:AuthorizeSecurityGroupIngress"
],
"Resource": "*"
},
{
"Sid": "EBSBackupAndRestore",
"Effect": "Allow",
"Action": [
"ebs:ListSnapshotBlocks",
"ebs:GetSnapshotBlock",
"ebs:ListChangedBlocks",
"ebs:CompleteSnapshot",
"ebs:PutSnapshotBlock",
"ebs:StartSnapshot"
],
"Resource": "*"
},
{
"Sid": "IAMInspection",
"Effect": "Allow",
"Action": [
"iam:ListAccountAliases",
"iam:SimulatePrincipalPolicy"
],
"Resource": "*"
},
{
"Sid": "DynamoDBBackupRestore",
"Effect": "Allow",
"Action": [
"dynamodb:ListTables",
"dynamodb:DescribeTable",
"dynamodb:CreateTable",
"dynamodb:BatchWriteItem",
"dynamodb:DescribeContinuousBackups",
"dynamodb:ExportTableToPointInTime",
"dynamodb:DescribeExport",
"dynamodb:DeleteTable",
"dynamodb:UpdateTable",
"dynamodb:UpdateContinuousBackups"
],
"Resource": "*"
},
{
"Sid": "RedshiftBackupRestore",
"Effect": "Allow",
"Action": [
"redshift:ListDatabases",
"redshift:GetClusterCredentialsWithIAM",
"redshift-data:ExecuteStatement",
"redshift-data:ListDatabases",
"redshift-data:GetStatementResult",
"redshift:DescribeClusters",
"redshift-data:CancelStatement",
"redshift:GetClusterCredentials",
"redshift-data:DescribeStatement"
],
"Resource": "*"
},
{
"Sid": "S3AccessForBackup",
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:ListBucket",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject",
"s3:PutObjectRetention"
],
"Resource": "*"
},
{
"Sid": "SSMApplicationConsistentSnapshot",
"Effect": "Allow",
"Action": [
"ssm:SendCommand",
"ssm:DescribeDocument",
"ssm:DescribeInstanceInformation",
"ssm:UpdateDocumentDefaultVersion",
"ssm:UpdateDocument",
"ssm:CreateDocument",
"ssm:GetCommandInvocation"
],
"Resource": "*"
},
{
"Sid": "EKSClusterOperations",
"Effect": "Allow",
"Action": [
"eks:DescribeNodegroup",
"eks:DescribeUpdate",
"eks:UpdateNodegroupConfig",
"eks:ListClusters",
"eks:DescribeCluster"
],
"Resource": "*"
},
{
"Sid": "AutoScalingAndSNS",
"Effect": "Allow",
"Action": [
"autoscaling:UpdateAutoScalingGroup",
"autoscaling:AttachInstances",
"autoscaling:DescribeScalingActivities",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"sns:Publish",
"sns:GetTopicAttributes"
],
"Resource": "*"
}
]
}
테스트 단계에서는 Resource: "*" 로 두고, 운영에선 꼭 필요한 리소스 ARN만 넣는 게 더 안전합니다.
3) Source Account에 AssumeRole 권한 주기
이제 NetBackup이 돌아가는 계정에 “저쪽 Role을 AssumeRole 할 수 있다”라는 권한을 줘야 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::TARGET_ACCOUNT_ID:role/ROLE_NAME"
},
"Action": "sts:AssumeRole"
}
]
}
4) Snapshot Manager에 Cross-Account 등록
이제 NetBackup 콘솔로 가서 Snapshot Manager 설정 메뉴에서
- Target Account ID
- Role 이름
을 입력해주면 끝입니다.
Assume Role 검증하기
구성이 제대로 됐는지 확인하려면, CLI에서 직접 AssumeRole을 해볼 수 있습니다.
aws sts assume-role \ --role-arn arn:aws:iam::<TARGET_ACCOUNT_ID>:role/NBU_SnapshotRole \ --role-session-name TestNetBackup
정상적으로 AccessKey, SecretKey, SessionToken이 나오면 설정이 성공한 겁니다.
마무리
NetBackup Snapshot Manager로 여러 AWS 계정을 하나의 창구에서 관리하려면,
결국 핵심은 IAM Role과 AssumeRole 설정입니다.
한 번만 제대로 설정해두면, 계정이 여러 개로 쪼개져 있어도 Snapshot Manager가 알아서 스냅샷을 생성하고 관리할 수 있습니다.
복잡해 보이지만 실제로는
- Target Account에 Role 만들기
- Source Account에서 AssumeRole 허용
- Snapshot Manager에 등록