본문 바로가기

Storage

[실습] DataSync 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기

반응형

안녕하세요 서후아빠입니다. ^_^
이번 세션은 지난번 진행한 aws cli를 통한 동기화가 아닌 DataSync 서비스를 이용하여 서로 다른 계정에 위치하는 S3 bucket을 동기화하는 실습을 해보겠습니다.


구성도

제약사항

DataSync 통해 버킷간 전송 시 작업당 2,500만개 이상의 객체는 복사가 불가능하므로 접두사로 구분하여 분할 전송
서로 다른 계정간 버킷 동기화는 aws cli를 이용하는 과정 필요 (모든 과정을 콘솔에서 지원하지 않음)

1단계 : IAM User 및 Role 생성 (A계정에서 진행)

IAM > Users > Add users > Name(user01), 권한(AdministratorAccess)

보안을 위해 MFA 설정 필수 (설명 SKIP)
aws cli 작업을 위해 Access keys 발급 진행 필요 (설명 SKIP)

IAM > Policies > Create policy > JSON (tab)

JSON 내용 Name 설명
아래 참조 AWSDataSyncPolicyForDestinationS3BcketAccess 필수
아래 참조 AWSDataSyncPolicyForSourceS3BcketAccess 4단계 과정에서 자동 생성 가능하므로 생략 가능
# AWSDataSyncPolicyForDestinationS3BcketAccess 내용
{
  "Version": "2012-10-17",
  "Statement": [
	{
	  "Action": [
		"s3:GetBucketLocation",
		"s3:ListBucket",
		"s3:ListBucketMultipartUploads"
	  ],
	  "Effect": "Allow",
	  "Resource": "arn:aws:s3:::bucketB"
	},
	{
	  "Action": [
		"s3:AbortMultipartUpload",
		"s3:DeleteObject",
		"s3:GetObject",
		"s3:ListMultipartUploadParts",
		"s3:PutObject",
		"s3:GetObjectTagging",
		"s3:PutObjectTagging"
	  ],
	  "Effect": "Allow",
	  "Resource": "arn:aws:s3:::bucketB/*"
	}
  ]
}

# AWSDataSyncPolicyForSourceS3BcketAccess은 위 내용에서 bucketB를 bucketA로 수정하면 됨

 

IAM > Roles > Create role 

Select trusted entity Add permissions Name, review, and create 설명
Trusted entity type : AWS service
Use case : DataSync
AWSDataSyncFullAccess
AWSDataSyncReadOnlyAccess
AWSDataSyncPolicyForDestinationS3BcketAccess
Role name : AWSDataSyncRoleForDestinationS3BcketAccess 필수
Trusted entity type : Custom trust policy AWSDataSyncPolicyForSourceS3BcketAccess Role name : AWSDataSyncRoleForSourceS3BcketAccess 4단계 과정에서 자동 생성 가능하므로 생략 가능
Trusted entity는 아래 참조
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "datasync.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111111111111"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:datasync:us-east-2:111111111111:*"
                }
            }
        }
    ]
}

2단계 : S3 bucket 정책 생성 (B계정에서 진행)

S3 > Buckets > bucketB 선택 > Permissions (tab) > Bucket policy의 Edit

{
  "Version": "2008-10-17",
  "Statement": [
	{
	  "Sid": "DataSyncCreateS3LocationAndTaskAccess",
	  "Effect": "Allow",
	  "Principal": {
		"AWS": "arn:aws:iam::111111111111:role/AWSDataSyncRoleForDestinationS3BcketAccess"
	  },
	  "Action": [
		"s3:GetBucketLocation",
		"s3:ListBucket",
		"s3:ListBucketMultipartUploads",
		"s3:AbortMultipartUpload",
		"s3:DeleteObject",
		"s3:GetObject",
		"s3:ListMultipartUploadParts",
		"s3:PutObject",
		"s3:GetObjectTagging",
		"s3:PutObjectTagging"
	  ],
	  "Resource": [
		"arn:aws:s3:::bucketB",
		"arn:aws:s3:::bucketB/*"
	  ]
	},
	{
	  "Sid": "DataSyncCreateS3Location",
	  "Effect": "Allow",
	  "Principal": {
		"AWS": "arn:aws:iam::111111111111:user/user01"
	  },
	  "Action": "s3:ListBucket",
	  "Resource": "arn:aws:s3:::bucketB"
	}
  ]
}

3단계 : EC2(Amazon Linux AMI) 생성하여 터미널 접속(설명 SKIP)

EC2는 권한 부여가 불필요하며, Amazon Linux AMI로 EC2를 생성하면 aws cli를 별도 설치할 필요가 없습니다.
EC2를 접속하여 4단계를 진행합니다.

4단계 : DataSync 대상 위치 생성 (A계정의 IAM User(ex : user01)를 이용하여 aws cli에서 진행

# 대상 위치 생성 명령어 
aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::bucketB --s3-config '{"BucketAccessRoleArn":"arn:aws:iam::111111111111:role/AWSDataSyncRoleForDestinationS3BcketAccess"}' --region ap-northeast-2

# 정상적으로 생성 시 아래처럼 출력됨
{
    "LocationArn": "arn:aws:datasync:ap-northeast-2:111111111111:location/loc-01ecb6bf0c16db836"
}

# 2단계가 완료되지 않은 경우 아래처럼 에러 발생
An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: DataSync location access test failed: could not perform s3:HeadBucket on bucket MyBucketB. Access denied. Ensure bucket access role has s3:ListBucket permission.
위에서 언급한 것처럼 작업당 2,500만개 이상의 객체는 복사가 불가능하므로 접두사로 구분합니다. 
대상 위치 생성 명령어의 "arn:aws:s3:::bucketB" 부분을 예를 들어 폴더 단위로 "arn:aws:s3:::bucketB/folderB1" 생성하고 아래 5단계에서도 Configure source location의 Folder 경로를 동일하게 forderA로 표기합니다.
즉, 여러개의 대상 위치를 생성하고, 여러개의 Task를 생성합니다.

EC2 접속 및 aws cli 로그인 설명은 SKIP (https://sh-t.tistory.com/manage/newpost/62 3단계 참조)
A계정의 S3 버킷과 B계정의 S3 버킷 리전이 다른 경우 명령어 마지막에 B계정의 리전을 지정 (ex : --region ap-northeast-2)
A계정 콘솔 로그인하여 ap-northeast-2 리전 선택하여 아래 경로로 이동하면 생성 결과 확인 가능
 - 경로 : DataSync > Locations

5단계 : DataSync Task 생성하여 S3 bucket 동기화 실행 (A계정에서 진행)

DataSync > Tasks > Create task

Configure source location Destination location options Configure settings
Choose the location that you want to transfer data from : Create a new location
Location type : Amazon S3
Region : us-east-2
S3 bucket : bucketA
Folder : /
IAM role : AWSDataSyncRoleForSourceS3BcketAccess
Choose the location that you want to transfer data from : Choose an existing location
Choose existing location
  - Region : ap-northeast-2
  - Existing locations : 3단계에서 생성한 location 선택 (ex : s3://bucketB/)
Task Name : taskA
Task execution configuration
  - Verify data : Verify only the data transferred
   - Set bandwidth limit : Use available
   - Queueing : Enable 
Data transfer configuration
  - Data to scan : Entire source location 
  - Transfer mode : Transfer only data that has changed 
  - Keep deleted files : Disabled
  - Overwrite files : Enable 
  - Specific files and folders : -
  - Exclude patterns : -
Schedule : Hourly, at minute (00)
Task logging
  - Log level : Log basic information such as transfer errors
  - CloudWatch log group : taskA-cloudwatch-logs
  - Create a CloudWatch resource policy : Enable
주의 : 2단계의 S3 버킷 정책에 지정한 IAM 사용자(ex : user01)로 콘솔 접속하여 4단계 진행해야 하며, 리전은  B계정의 S3 버킷 리전(ap-northeast-2)으로 선택합니다.

AWSDataSyncRoleForSourceS3BcketAccess : 5단계에서 자동 생성 클릭으로 생성 가능하나 Name은 임의값으로 생성됨

Configure settings 
- Verify data : Verify only the data transferred, Check integrity during transfer(기본값), Verify all data in the destination
- Set bandwidth limit : Use available(기본값), Set bandwidth limit (MiB/s)

Data transfer configuration
- Data to scan : Entire source location(기본값), Specific files and folders
- Transfer mode : Transfer only data that has changed(기본값), Transfer all data
- Keep deleted files : Enable 경우 소스에서 삭제해도 목적지에서는 삭제되지 않음
- Specific files and folders : Pattern(ex : /foler-to-include/*) 통해 전송할 대상 선택하는 옵션
- Exclude patterns : 패턴에 맞으면 전송 제외하는 옵션

Schedule : Hourly, Daily, Weekly, Days of the week, Custom

Task logging
- Log level : Log basic information such as transfer errors(기본값), Do not send logs, All

DataSync > Tasks >  MyDataSyncTask 선택 > 상단의 Start > Start with defaults

Start with defaults : 현재 Task 수정없이 즉시 실행
Start with overriding options : 현재 Task  실행전에 수정할 경우 선택

6단계 : S3 bucket 동기화 상태 확인 (B계정에서 진행)

S3 > Buckets > bucketB 선택 > 파일과 권한 모두 동일하게 동기화 되었음을 확인할 수 있음

기타 : CloudWatch Logs에서 Log 확인 (A계정에서 진행)

CloudWatch > Logs > taskA-cloudwatch-logs 선택

# Log 예시 
2023-02-27T17:22:35.098+09:00
Copy
[INFO] Request to start task-09ab010e1a4bf95a8.

2023-02-27T17:25:20.100+09:00
Copy
[INFO] Execution exec-0e19e9998f6212360 started.

2023-02-27T17:25:20.733+09:00
Copy
[INFO] Started logging in destination hostId: host-0014cdcc4173d0f11 for Execution exec-0e19e9998f6212360

2023-02-27T17:25:25.146+09:00
Copy
[NOTICE] Created directory /AWS-PatchNow/32a7938e-3060-4f27-b38c-21c4a32f47f9

2023-02-27T17:25:26.524+09:00
Copy
[NOTICE] Transferred file /AWS-PatchNow/32a7938e-3060-4f27-b38c-21c4a32f47f9/i-01f4a42fdcb981d69/awsrunShellScript/PatchLinux/stdout, 125936 bytes

2023-02-27T17:25:27.277+09:00
Copy
[NOTICE] Verified directory /

2023-02-27T17:25:27.277+09:00
Copy
[NOTICE] Verified directory /AWS-PatchNow

2023-02-27T17:25:27.277+09:00
Copy
[NOTICE] Verified directory /AWS-PatchNow/1013e457-d51a-4fac-a119-c1be9f010a35

2023-02-27T17:25:27.797+09:00
Copy
[INFO] Execution exec-0e19e9998f6212360 finished with status Success.

주의사항

s3 sync 명령어를 옵션없이 실행할 경우 Server(=EC2)의 CPU 사용율이 100%까지 사용할 수 있습니다.

만약, 운영중인 서버에서 실행할 경우 장애가 발생할 수 있기 때문에 주의를 요합니다. 

혹은 아래처럼 CPU 스레드를 조정한 후,  동기화를 진행하면 장애는 발생하지 않으나, 전송 속도는 떨어질 수 있습니다. 

# 기본 프로필 설정 (기본값은 10, 1로 설정하는 경우)
aws configure set default.s3.max_concurrent_requests 1   

# 사용자 프로필 설정
aws configure set s3.max_concurrent_requests 1 --profile [사용자 프로필]

# 세팅확인
cat .aws/config

누락 및 에러 

s3 sync 명령어를 통해 복제된 파일이 누락이나 에러로 전송되지 않는 경우에 대한 의심을 하시는 분들을 위해서 아래 가이드를 권고 드립니다.

aws s3 ls 명령어는 1000개 이상 동시 조회 불가능하므로 1000개 이상일 경우 aws s3api list-objects 명령어를 사용해야 합니다.

# 작업전후 파일 비교 방법 (예시)
aws s3 ls --recursive s3://[버킷명] --summarize 
Total Objects: 333    
Total Size: 344375 

aws s3api list-objects --bucket "[버킷명]" --prefix "prefix-name"  --output json --query "[sum(Contents[].Size), length(Contents[])]"

# Output결과를 넣고, vi나 여러가지 방법으로 error 필터링하는 방법
aws s3 ls | tee -a "output.log"

# 디버깅 로그 기록 (예시)
aws s3 sync s3://bucketA s3://bucketB --debug& >> ./s3_debug.log

다른 방법

aws cli를 이용한 동기화 방법은 아래 링크를 참조하세요

2023.02.16 - [Storage] - [실습] AWS CLI 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기

 

[실습] AWS CLI 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 서로 다른 계정에 위치하는 S3 bucket을 aws cli 명령어를 통해서 동기화하는 실습을 해보겠습니다. DataSync를 이용한 동기화 방법은 아래 링크를 참조하

sh-t.tistory.com

S3 버킷의 Replication rules을 이용하여 복제하는 방법도 있습니다.

  - 사전 설정 : S3 버킷 선택 > Properties (tab) > Bucket Versioning의 Edit > Bucket Versioning (Enable) > Save changes

  - 경로 : 출발지 S3 버킷 선택 > Management (tab) > Replication rules의 Create replication rule

Replication rule configuration Source bucket Destination IAM role 옵션
Replication rule name : 규칙명 입력
Status : Enabled (or Disabled)
Source bucket name : 자동 선택
Choose a rule scope : 모든 오브젝트 (or 필터링된 오브젝트)
Destination : 목적지 버킷 선택 Create new role Encryption
Destination storage class
Additional replication options

 

반응형