AWS

[AWS cli] s3 sync/cp - An error occurred () when calling the GetObjectTagging operation: Access Denied

비번변경 2023. 7. 28. 23:08

개요

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://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-before-large

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html