[AWS] Spring Boot S3 이미지 업로드 (1)

LDB·2025년 6월 19일
0

AWS

목록 보기
3/4
post-thumbnail

작성계기

사이드 프로젝트를 진행하던중 이미지 업로드기능이 필요했고 그래서 초기에는 로컬PC에 이미지를 저장하는 방법을 썼고 브라우저에서 로컬PC로 파일을 저장하는 것 까지는 성공 했지만

로컬PC에 저장된 이미지를 브라우저에 출력하는 것은 성공하지 못했습니다.

그러던 와중에 Amazon S3에 파일을 저장하는 방식을 발견했고 예전에도 S3를 이용해 CI/CD를 구축하기 위해 S3를 사용한 경험이 있어서 S3에 업로드하는 방식으로 바꾸기로 했습니다. 또한 나중에 프로젝트를 현재는 로컬로 개발하고 있지만 운영은 AWS에서 할 생각이기에 나중에 파일 업로드 관련해서 별도 AWS환경에 맞게 수정을 많이 거칠 필요가 없기 때문에 이렇게 하기로 결정했습니다.

(해당 주제는 내용이 많기에 Amazon에서의 작업과 Spring Boot 코드작성 부분 이렇게 두 개로 나누어 작성할 계획입니다.)


Amazon AWS 준비목록

  • S3 bucket 등록
  • IAM 사용자 생성

S3 bucket 생성

S3 bucket은 이미지를 저장하는 저장소 입니다.

1. 버킷 생성

다음과 같이 Amazon S3으로 이동하고 버킷 만들기 버튼을 클릭하여 버킷 생성 준비를 합니다.


2. 버킷 이름 지정

버킷이름을 지정합니다.


3. 객체 소유권 지정

객체 소유권은 ACL 비활성화 시키는데 다른 계정은 접근하지 못하도록 하기위해 설정 한 것 입니다.


4. 퍼블릭 액세스 차단설정

만약 데이터가 중요도가 낮다면 퍼블릭 액세스를 차단하지 않아도 상관 없습니다. 하지만 뒤에서 설정할 IAM에서 허용한 사용자만 이미지를 입력하도록 하기위해 다음과 같이 설정합니다.


5. 버킷 버전 관리 / 기본 암호화 활성화

  • 버킷 버전 관리 : 활성화하면 나중에 모든 객체의 보존, 검색 및 복원할 수 있습니다.
  • 기본 암호화 : 서버 암호화는 기본으로 체크되어있는 것을 세팅합니다.

마지막으로 버킷 만들기버튼을 클릭하면 버킷이 생성됩니다.


IAM 사용자 생성

IAM(Identity and Access Management)은 AWS에서 사용자, 역할, 정책을 기반으로 리소스 접근을 제어하고, 안전하게 클라우드 환경을 구축하기위한 필수 서비스 입니다.

1. IAM 사용자 생성

먼저 사용자에서 사용자 생성버튼을 클릭하여 사용자를 생성합니다.


2. 사용자 이름 설정

생성할 사용자 이름을 입력하고 다음 버튼을 클릭합니다.


3. 권한 설정

권한을 설정하는데 2가지 방법이 있습니다. AWS에서 제공하는 권한 정책을 사용하거나 아니면 직접 정책을 생성하는 방법 이렇게 2가지가 있습니다.

첫 번째는 AmazonS3FullAccess 정책을 선택하는 방법입니다, 저는 개인적으로 이 방법을 선호하지 않고 있는데 AmazonS3FullAccess는 사용자가 S3의 모든 버킷에 접근을 가능하다는 의미이기에 보안 이슈가 생길 우려가 있습니다.

두 번째는 정책을 생성하는 방법입니다, 이 방법은 상세하게 create,delete,update,read 권한을 직접 지정할 수 있고 또한 특정 버킷에만 접근이 가능하도록 설정이 가능합니다.


3-1 권한 제작

스크립트 예시

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::{bucketname1}/*",
                "arn:aws:s3:::{bucketname2}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::{bucketname1}/*",
                "arn:aws:s3:::{bucketname2}/*"
            ]
        }
    ]
}

스크립트는 다음과 같이 작성 할 수 있겠습니다.

  • Effect : 는 블록에 있는 권한을 허용할지 여부를 결정하는 내용 입니다. 그래서 Allow/Deny 이렇게 둘 중 허용하면 Allow 거부하면 Deny를 작성합니다.
  • Action : 이 부분은 "문 편집" 이하는 부분의 작업추가 항목에 서비스를 검색하면 쉽게 추가할 수 있습니다.
  • Resource : 여기는 접근할 영역을 선택하는 부분인데 여기서는 접근할 S3버킷을 입력하면 됩니다. 작성 규칙은 arn:aws:s3:::{버킷이름}/{접근할 리소스} 이런식으로 작성하는데 만약 접근할 리소스 부분에 *를 입력하면 해당 버킷의 모든 내용에 접근하겠다는 의미 입니다, 그리고 버킷을 여러개 설정하고 싶으면 위의 예시대로 ,을 붙이고 뒤에 버킷을 추가합니다.

만약 권한을 생성한다면 해당 스크립트를 참고 하시기 바랍니다.


사용자 생성완료

사용자 생성을 완료하고 사용자 목록 페이지에서 생성한 사용자로 이동하면 다음과 같이 확인할 수 있습니다.


액세스 키 생성

실제로 S3에 업로드를 하기위해서는 액세스 키가 필요합니다. 첫 번째로 액세스 키 대안을 선택해야하는데 위의 이미지처럼 맨 처음 사례를 선택하고 확인 부분을 체크 합니다.


액세스 키 생성 완료

선택적으로 태그를 입력하고 다음단계로 넘어가면 이렇게 액세스 키를 생성되는 것을 확인할 수 있습니다.

(액세스 키의 secret을 분실하면 다시 확인이 불가능하나 액세스 키는 추가적으로 생성이 가능합니다.)


참고 사이트

https://smilesharkhelp.zendesk.com/hc/ko/articles/6193081783823--IAM-IAM-S3-Access-Key-%EB%B0%9C%EA%B8%89-%EA%B0%80%EC%9D%B4%EB%93%9C

https://j-d-i.tistory.com/271

https://somaz.tistory.com/181

(항상 감사합니다.)

profile
가끔은 정신줄 놓고 멍 때리는 것도 필요하다.

0개의 댓글