본문 바로가기
개발 이야기/Springboot

AWS S3 타계정의 버킷 업로드 시 BucketOwnerFullControl 설정

by 농개 2024. 6. 6.
반응형

 

목차

    1. 서로 다른 AWS 계정에서 업로드 시 객체 소유권

    S3 버킷에 파일 객체를 업로드할 때, 버킷 생성 AWS 계정과 동일한 계정이라면 특별한 문제가 발생하지 않습니다.

     

    그러나 다른 계정 간에 S3 버킷에 파일을 업로드하는 경우, 해당 객체에 대한 접근 권한 설정이 복잡해질 수 있습니다.

    이는 아래와 같은 AWS S3 소유권 정책 때문입니다.

    https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/access-policy-language-overview.html

     

     

    2. AWS 콘솔을 통해 버킷 정책 변경

    아래와 같이 AWS 콘솔에 접근하여 버킷의 정책을 변경해줍니다.

    이는 애플리케이션 측에서 bucket-owner-full-control를 설정하여 객체를 업로드할 때

    해당 객체의 소유자를 버킷 소유자로 합니다.

     

     

    3. 의존성 추가

    Springboot에서 S3 업로드 및 조회를 하려면 

    라이브러리 의존성을 먼저 추가해줘야합니다.

    // build.gradle
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web' 
        // ...(중략)
        implementation 'com.amazonaws:aws-java-sdk-s3:1.12.174' // 추가
    }

     

     

    4. 코드 작성

    AWS IAM 계정 발급 및 Access Token 발급 과정은 생략합니다.

    만약, 발급이 완료되었다면 아래와 같이 accesskey, secretkey에 인증 정보를 넣고 s3 버킷에 업로드 하면됩니다.

    public class S3Uploader {
        private AmazonS3 amazonS3;
    
        public void upload() {
            // aws credential
            BasicAWSCredentials awsCredentials = new BasicAWSCredentials("accesskey", "secretkey");
            amazonS3 = AmazonS3ClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .withRegion(Regions.AP_NORTHEAST_2)
                .build();
                
            // file object write
            byte[] fileContentBytes = content.getBytes(StandardCharsets.UTF_8);
            InputStream fileInputStream = new ByteArrayInputStream(fileContentBytes);
    
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType("application/json"); // json file을 업로드 한다고 가정
            metadata.setContentLength(fileContentBytes.length);
    
            // s3 bucket upload
            PutObjectRequest req = new PutObjectRequest(
                "bucketname",
                "keyname",
                fileInputStream,
                metadata).withCannedAcl(CannedAccessControlList.BucketOwnerFullControl); // bucket-owner-full-control 설정
    
            amazonS3.putObject(req);
        }
    }

     

    반드시 CannedAccessControlList.BucketOwnerFullControl 옵션을 추가해줍니다.

     

    반응형