본문 바로가기

Trouble Shooting

S3 Batch Operations 사용 시에 주의할 점

S3는 Batch Operations이라는 기능을 제공해 준다. 이 기능을 사용하면 특정 Bucket에 있는 Object들을 쉽게 다른 Account 또는 현재 Account의 다른 Bucket에 옮길 수 있다.

비록 쓰면서 아쉬운 점들이 있었지만 많은 양의 Object를 손쉽게 옮길 수 있다는 점은 정말 큰 장점이라고 생각한다. (쓸 때마다 DataSycn와 기능이 합쳐졌으면 좋겠다 싶은 생각도 들었다)

다만 쓰면서 몇 가지 뼈아픈 실수를 하고 난 뒤에는 Batch Operations에 대한 PTSD가 생겼지만 (…) 그래도 여전히 대량의 Object를 옮길 때 매우 좋은 서비스이기도 하고, 실수를 반복하지 않기 위해 & 같은 피해자가 발생하지 않았으면 하는 마음에 포스팅을 작성해 본다.

 


 

1. S3 Replication rules 설정

S3 Batch Operations를 사용하려면 Replication rules를 설정해야 한다. Source path 또는 Tag로 필터를 넣을 수 있는데, 이때 [Change object ownership to destination bucket owner] 옵션이 필요하진 않은지 꼭 확인해야 한다.

이 설정을 활성화해야 Destination Source에 옮겨진 객체의 Ownership을 Destination Bucket이 가지고 있게 된다. 만약 저 옵션을 비활성화하고 돌렸다면 CDN을 통해 접근하면 AccessDenied가 발생하기 때문에 반드시 확인하고 필요한 경우 활성화를 해야 한다.

활성화하면 Replica owner가 Destination bucket owner로 바뀌게 된다.

 


 

2. Bucket versioning

1번과 이어진 경우인데, 나는 저 옵션을 비활성화했다가 활성화하고 다시 Replication 했는데, overwrite 하지 않고 Destination bucket을 비우고 삭제한 뒤, Bucket을 재생성하고 다시 Replication을 돌렸다. 그리고 모두 실패했다.

Batch Replication does not support re-replicating objects that were deleted with the version ID of the object from the destination bucket.

 

그 이유는 삭제된 객체에 대해 Re-replicating을 지원하지 않기 때문이다. 생각지도 못한 이유였고 해결 방법은 다른 이름으로 Temp bucket을 만들고 Replication을 걸어두었다. 그리고 S3에 더 이상 데이터가 쌓이지 않는 게 확실해진 시점에 mv로 한 땀 한 땀 옮겨야 했다. (이 경우에는 What's the best way to transfer large amounts of data from one Amazon S3 bucket to another? 링크를 참고해 include, exclude를 적절히 섞어서 병렬 작업으로 처리하는게 좋다. )

 

물론 다른 방법도 있다. 공식문서에도 나와있지만 Batch Copy job을 만들어 새로운 Object를 같은 위치에 복사하면 된다. 그러면 Replication job이 실행되어 Replication이 된다던데 해보진 않았다 🤷‍♀️

 

To re-replicate these objects you can copy the source objects in place with a Batch Copy job. Copying those objects in place will create new versions of the object in the source bucket and initiate replication automatically to the destination. Deleting and recreating the destination bucket will not initiate replication.

 

관련된 내용은 공식문서에 잘 나와있다.


3. put_tagging

put_tagging action을 한 Object 대상으로는 Replication을 진행하지 않는다. 만약 Tag 기반 필터를 사용하고, Tag가 Object 생성 이후에 put_tagging와 같은 Action으로 추가되는 것이라면 알아야 하는 내용이다.

증분분에 대한 Replication은 객체가 생성될 때, 삭제될 때 Trigger 되지만, put_tagging은 Trigger 하지 않는다. 그렇기 때문에 이런 경우에 증분분 Replication 하려면 수동으로 한 번 더 Job을 돌려야 한다.


마치며

S3 Batch Operations ↔ DataSync를 둘 다 사용해 보면서 온탕과 냉탕을 번갈아가듯이 S3 Batch Operations를 사용할 땐 DataSync가 생각나고, DataSync를 사용할 땐 S3 Batch Operations 생각이 난다. 둘의 보완점을 채워주는 새로운 서비스가 생겼으면 좋겠다 … ㅋㅋ 🙏


참고