개요
Ubuntu 14.04 LTS에서 사용하고 있던 aws s3 sync, cp 명령이 동일하게 구성한 Ubuntu 22.04 LTS에서 아래와 같은 에러를 발생시키며 동작하지 않았다.
실행 명령어
aws s3 cp \
--profile=dev \
s3://prd-bucket/test/parser-v1.parquet s3://dev-bucket/test/parser-v1.parquet
발생 오류 메시지
copy failed: s3://s3://prd-bucket/test/parser-v1.parquet to s3://dev-bucket/test/parser-v1.parquet An error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Denied
원인을 확인하여 정리한다.
원인
각 서버에서 사용하는 AWS CLI 버전과 권한과 관련된 문제였다. Ubuntu 14.04 사용 서버에서는 AWS CLI 1 버전을, Ubuntu 22.04 사용 서버에서는 AWS CLI 2 버전을 사용하는데 버킷 간 객체 복사 시 동작과 관련된 부분에 변경점이 있었다.
aws s3 cp, sync와 같은 명령어로 대용량 파일을 S3 버킷으로 복사하면 AWS 자동으로 멀티파트 업로드/복사를 수행한다. 이는 S3 버킷 간의 복사에서도 마찬가지지만, CLI 버전에 따라 동작 방식에 차이가 존재한다.
- AWS CLI 1 버전 : 객체 복사 시 소스 객체의 파일 속성을 복사하지 않는다.
- AWS CLI 2 버전 : 객체 복사 시 소스 객체의 태그와 속성 집합을 복사한다. 객체의 content-type, content-language, content-encoding, content-disposition, cache-control, expires, metadata 속성이 복사된다.
따라서 AWS CLI 2 버전을 사용하는 경우에는 AWS CLI 1 버전에서는 발생하지 않았던 HeadObject, GetObjectTagging, PutObjectTagging과 같은 추가적인 API 호출이 필요하다. 그러므로 aws cp, sync를 사용하는 사용자 또는 역할에게 관련 권한이 주어지지 않았을 때 오류가 발생할 수 있다.
해결
크게 두 가지 방법으로 문제를 해결할 수 있을 것 같다.
1. 사용자 또는 역할에 권한 추가
aws s3 sync나 cp를 수행하는 사용자 또는 역할에 권한을 적절히 추가한다. 직접 적용해보지 못해 확신할 수 없지만, 다음과 같은 정책으로 설정하면 될 것 같다. 좀 더 관대하게 권한을 설정해도 된다면 s3:Get*으로 설정하는 게 좋겠다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:HeadObject",
"s3:PutObjectTagging",
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::prd-bucket",
"arn:aws:s3:::prd-bucket/*",
"arn:aws:s3:::dev-bucket",
"arn:aws:s3:::dev-bucket/*",
]
}
]
}
2. cp, sync 수행 시 --copy-props 옵션 추가
AWS CLI 2 버전을 이용해 cp, sync 수행 시 동작 방식을 변경하고 싶다면 --copy-props 옵션을 추가할 수 있다. default, metadata-directive, none 세 가지 값을 지정할 수 있다.
- default : 기본값으로 소스 객체의 모든 태그와 속성을 복사한다.
- metadata-directive : 지정한 속성만 복사하며 HeadObject API 호출이 필요하다. 태그는 복사하지 않는다.
- none : 소스 객체의 속성을 포함하지 않고 복사한다.
권한 추가를 하지 않는 방향으로 진행한다면, none으로 지정하여 사용한다.
aws s3 cp \
--profile=dev \
--copy-props=none
s3://prd-bucket/test/parser-v1.parquet s3://dev-bucket/test/parser-v1.parquet
참고 문서
Amazon S3 cp fails with (AccessDenied) when calling the GetObjectTagging operation
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html