mingming

Netbackup AWS Integration 본문

카테고리 없음

Netbackup AWS Integration

mingming_96 2025. 9. 27. 20:36

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에 등록