들어가며
AWS S3 라이브러리를 이용하여 AWS S3에 객체를 업로드 하였고, 특정 객체에 대해 불러오려고 했는데 AcceeDenied가 발생했습니다.
처음엔 해당 AWS S3 Bucket에 get 권한이 없나? 싶어서 해당 권한을 설정해주었는데도 해당 문제가 지속되었습니다.
원인은 ownership
terraform으로 AWS S3 Bucket을 만들때 aws_s3_bucket_ownership_controls 리소스를 설정했었습니다.
resource "aws_s3_bucket_ownership_controls" "ownership_controls_bucket_A" {
bucket = aws_s3_bucket.bucket.id
rule {
object_ownership = "BucketOwnerPreferred"
}
}
위와 같이 BucketOwnerPreferred로 설정하게 되면 ACL이 설정되어 업로드할 때마다 bucket-owner-full-control을 옵션으로 넣어 다른 계정이 버킷에 작성하는 새 객체를 소유하고 완전히 제어할 수 있게 합니다. 하지만 해당 내용은 권장사항이 아니었고, 모든 개발팀에서 bucket-owner-full-control 값을 넣어서 업로드 하기엔 번거로운 작업이기 때문에 다른 방법을 찾게 되었습니다.
ACL은 권장사항이 아니다!
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/about-object-ownership.html
AWS를 사용하다 보면 여러 계정(multi account)를 사용하는 상황이 발생하는데, 이러면 A계정에서 B계정의 bucket을 읽어야 하는 상황이 발생할 수 도 있습니다. 읽기 권한만 실행한다면 큰 문제는 없지만 쓰기 권한을 실행한다면 권한 이슈가 발생하게 됩니다. 즉, ACL이 설정되어있다면 A 계정에서 B계정의 S3 Bucket에 객체를 업로드하게 되었을 때 객체의 권한이 A계정이 되어버려서 S3 Bucket의 소유자인 B 계정에서 해당 객체에 대한 권한이 없어지게 됩니다.
이를 방지하기 위해서 BucketOwnerFullControl 를 설정해주는 것이 일반적인 방법이었는데, 2023년 4월부터 모든 S3 bucket에 대해 ACL을 끄고 사용하는것을 권장하게 되었습니다. 다시 말해, 누가 쓰든 다 버킷의 소유자가 권한을 갖는다는 것입니다.
여기서 잠깐! ACL이 뭐야?
AWS ACL(Access Control List)은 S3 버킷과 객체에 대한 접근 권한을 제어하기 위한 메커니즘으로, 각 객체 또는 버킷에 대해 특정 사용자나 그룹이 가질 수 있는 권한을 정의하는 리스트입니다.
권한 목록
policy | description |
READ | 객체나 버킷의 데이터를 읽을 수 있는 권한 |
WRITE | 버킷에 객체를 업로드하거나 수정할 수 있는 권한(버킷에 대해서만 가능) |
READ_ACP | ACL을 읽을 수 있는 권한 |
WITE_ACP | ACL을 수정할 수 있는 권한 |
FULL_CONTROLL | 모든 권한(READ, WRITE, READ_ACP, WRITE_ACP)을 포함한 권한 |
해결은 ACL 해제!
ACL은 더 이상 S3 버킷의 데이터에 대한 권한에 영향을 주지 않는다는 것을 문서를 통해 확인했기에 terraform코드에서 해당 리소스를 삭제했고, 정상적으로 다운로드가 가능하게 되었습니다!
Reference
- https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/about-object-ownership.html
'데브옵스 이야기' 카테고리의 다른 글
명심 (3) | 2024.10.06 |
---|---|
[오픈소스 기여하기] 첫번째 기여 - ArgoCD (Implement graceful shutdown in application-controller) (1) | 2024.08.12 |
K8s의 Memory? (RAM, Storage) (0) | 2024.08.02 |
Kubernetes common errors (0) | 2024.07.29 |