Spring Boot에 S3 연동하여 파일 업로드하기 (+ 403 에러 해결)

지니·2022년 12월 25일
0

1. Spring Boot에 S3 연동

1-1. S3 퍼블릭 액세스 차단 비활성화



1-2. 버킷 정책 Action에 s3:PutObject 넣기

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
			...
            "Action": [
                "s3:PutObject",
            ],
			...
        }
    ]
}

버킷 정책 설정 참고



1-3. 코드 내 설정

build.gradle

implementation group: 'io.awspring.cloud', name: 'spring-cloud-starter-aws', version: '2.4.2'


AmazonS3 bean 생성 및 주입

@PostConstruct
public void setS3Client() {
    AWSCredentials credentials = new BasicAWSCredentials(this.accessKey, this.secretKey);

    final AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
    s3Client = AmazonS3ClientBuilder.standard()
            .withRegion(this.region)
            .disableChunkedEncoding()
            .withCredentials(credentialsProvider)
            .build();
}
  • bean으로 등록한 후 해당 빈을 주입받아 사용하는 것이 바람직하겠지만, 본인은 테스트를 위해 일단 @PostConstruct를 사용하여 해당 객체를 만들어주었다
  • 위에서 사용한 accessKey, secretKey, region은 yaml에서 관리하도록 하였다.


파일 업로드 메소드

public void upload(MultipartFile file) {
    ObjectMetadata objectMetadata = new ObjectMetadata();
    objectMetadata.setContentType(file.getContentType());
    objectMetadata.setContentLength(file.getSize());

    String key = "item/" + file.getOriginalFilename();

    try (InputStream inputStream = file.getInputStream()) {
        final PutObjectRequest putObjectRequest = new PutObjectRequest(
                bucket,
                key,
                inputStream,
                objectMetadata);
        putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);

        s3Client.putObject(putObjectRequest);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  • bucket : 파일이 저장될 S3 버킷의 이름
  • key : S3에 저장될 경로 포함 파일 이름
  • CannedAccessControlList.PublicRead : 외부에 공개할 이미지로 public read 권한 추가




2. 403 에러 해결

이대로 실행 시켰는데 403???

그대로 따라했는데 403 에러를 계속 보게 되었다.
S3 퍼블릭 액세스 차단도 모두 비활성하고 본인 IAM Access Key와 Secret Key도 전부 맞는데...?



여기서 Access Key와 Secret Key는 root 계정이 아니라 S3와 연결된 IAM의 것이라고 한다.



2-1. S3 접근을 위한 IAM 생성하기

  1. 사용자 추가 버튼 클릭

  1. 사용자 이름을 적어주고 AWS 자격 증명 유형을 액세스 키-프로그래밍 방식 액세스로 선택

  1. 기존 정책 직접 연결 클릭 후 AmazonS3FullAccess 선택

  1. 다음 버튼을 계속 누른 후 액세스 키와 비밀 액세스 키를 확인한다.
  • 단, 이 페이지에서 반드시 키를 복사해놓고 마쳐야 한다.




참고
https://programming-workspace.tistory.com/61
https://artiiicy.tistory.com/16

profile
Coding Duck

0개의 댓글