My Boundary As Much As I Experienced

AWS S3 세팅하는 방법 (+IAM 세팅) 본문

BackEnd/Node.js

AWS S3 세팅하는 방법 (+IAM 세팅)

Bumang 2024. 8. 24. 21:23

 

AWS S3란?

Amazon S3(Simple Storage Service)는 AWS(Amazon Web Services).

AWS가 제공하는 확장 가능한 객체 스토리지 서비스다. S3는 대량의 데이터를 안전하게 저장하고

언제 어디서나 이를 빠르게 접근할 수 있는 클라우드 스토리지 솔루션이다.

그냥 쉽게 말해 이미지같은 대용량 파일들을 crud할 수 있는 서비스이다.

파이어베이스로 치면 Firebase Cloud Storage에 속하는 포지셔닝.

 

S3를 설정하기 전에 IAM 설정하기

IAM 서비스는 말그대로 Authentication 서비스이다.

접근할 수 있는 유저를 생성하고 권한 설정하는 곳.

 

1. 엑세스 관리 - 사용자에 들어가서 사용자 생성을 클릭

IAM 서비스를 검색해서 들어간 뒤 - 사용자 - 사용자 생성을 진행

 

 

 

2. AmazonS3FullAccess 권한 체크한 사용자를 만듦

권한 설정 메뉴에선 AmazonS3FullAccess 권한을 체크하고 하나 만들어주면 된다. 

 

 

3. 해당 사용자에 들어가서 엑세스 키를 발급한다.

밑줄 친 부분 눌러서 액세스 키 하나 만들어 주면 된다.

그럼 액세스키 비밀키 2개를 발급해주는데 함부로 남에게 노출하면 안 된다.

꼭 환경변수로 만들어서 써야한다. 이거 털리면 AWS 요금 월 1억 나온다.

(지금 강의 캡처해서 올린거여서 버킷명이나 해당 ARN이나 엑세스 키는 현재 유효하지 않다.)

 

 

AWS S3 본격 셋팅하기

1. 새로운 버킷 만들기

S3를 이용하고 싶으면 AWS 사이트 상단에서 S3 검색해서 들어가서

그리고 어딘가에 있는 버킷만들기 버튼 누르면 된다. 우측 상단 주황색 버튼을 누르자.

 

버킷 이름은 ID처럼 고유해야된다. 남들이 선점한 버킷 이름을 선택할 수 없으니 주의해야된다.

그리고 권한 설정으로 남들이 찌르는 요청을 받지 않을수는 있지만..

굳이 너무 쉬운 이름으로 해서 남들이 찔러볼 수 있는 이름이면 안 좋은거 같다.

 

 

2. 권한에서 버킷 정책을 설정하자

말한 것처럼 보안을 신경써야한다면 일반 사람들은 읽기만 가능하게,

관리자는 수정, 삭제가 가능하게 바꿔보자.

 

버켓 안에 들어가서 권한 탭으로 들어간다.

누가 버킷을 읽기, 수정, 삭제 할 수 있는지 정의하는 부분이다.

 

권한 페이지 내에 보면 버킷 정책이라는 것이 있는데

이 곳에 JSON파일을 설정하여 권한 설정을 할 수 있다.

 

 

(*원래 ACL이란 섹션에서 CRUD 접근 권한을 설정할수도 있지만

버킷 정책을 json으로 조작하는 것이 더 세밀하고 엄밀하게 조작할수 있어서 버킷정책이 선호된다고 한다.)

  • 버킷 정책은 더 정교하고 복잡한 권한 설정을 위해 사용되며, 버킷 전체나 특정 조건에 기반한 접근 제어를 제공한다.
  • ACL은 더 단순하고 객체별로 적용할 수 있으며, 개별 객체에 대해 간단히 권한을 설정하는 데 적합하다.

 

버킷 정책은 아래처럼 설정하였다.

누구나 다 읽을수는 있지만(get), 수정(put)과 삭제(delete)는 허용된 ARN만 쓸 수 있게 설정했다.

*ARN이란?
ARN은 Amazon Resource Name의 약자이다.
AWS에서 ARN은 특정 리소스를 고유하게 식별하기 위한 네이밍 규칙이다.
AWS의 모든 리소스는 ARN 형식을 사용하여 식별할 수 있으며, ARN은 리소스의 타입, 위치, 이름 등을 포함한다.

형식:
arn:partition:service:region:account-id:resource
{
    "Version": "2012-10-17",  // 정책 버전. 이 날짜는 AWS에서 정책의 버전을 지정하는 표준입니다.
    "Statement": [  // 정책의 주요 섹션으로, 여러 권한 부여나 제어 규칙(Statement)을 포함할 수 있습니다.
        {
            "Sid": "1",  // 이 규칙의 식별자(SID). 규칙을 구분하기 위해 사용되며, 고유할 필요는 없습니다.
            "Effect": "Allow",  // 이 규칙의 효과를 지정. "Allow"는 권한을 허용하는 것을 의미합니다.
            "Principal": "*",  // 이 규칙의 적용 대상. "*"는 모든 사용자나 계정을 의미합니다.
            "Action": "s3:GetObject",  // 허용된 작업. 여기서는 "s3:GetObject"로, 객체를 읽는(다운로드하는) 권한을 의미합니다.
            "Resource": "arn:aws:s3:::님들버킷명/*"  // 이 규칙이 적용되는 리소스. "님들버킷명"이라는 S3 버킷 내의 모든 객체에 대해 적용됩니다.
        },
        {
            "Sid": "2",  // 두 번째 규칙의 식별자(SID).
            "Effect": "Allow",  // 두 번째 규칙의 효과를 지정. 여기서도 권한을 허용합니다.
            "Principal": { 
                "AWS": "님들ARN"  // 이 규칙의 적용 대상. "님들ARN"으로 지정된 특정 AWS 계정에만 적용됩니다.
            },
            "Action": [  // 이 규칙에서 허용되는 작업들. 목록으로 여러 작업을 지정할 수 있습니다.
                "s3:PutObject",  // 객체를 업로드하는 권한을 의미합니다.
                "s3:DeleteObject"  // 객체를 삭제하는 권한을 의미합니다.
            ],
            "Resource": "arn:aws:s3:::님들버킷명/*"  // 이 규칙이 적용되는 리소스. "님들버킷명"이라는 S3 버킷 내의 모든 객체에 대해 적용됩니다.
        }
    ]
}

 

 

3.  CORS 설정

AllowedOrigins를 *로 한 건 지금 개발 중이라 그런 것이고, 실제 사이트 url이 있는 경우는 그걸 쓰면 된다.

[
    {
        "AllowedHeaders": [
            "*"  // 모든 요청 헤더를 허용합니다. 클라이언트가 서버에 전송할 수 있는 모든 헤더를 허용하도록 설정합니다.
        ],
        "AllowedMethods": [
            "PUT",  // PUT 메서드를 허용합니다. 클라이언트가 이 메서드를 사용하여 버킷에 객체를 업로드할 수 있습니다.
            "POST"  // POST 메서드를 허용합니다. 클라이언트가 폼을 통해 버킷에 객체를 업로드할 수 있습니다.
        ],
        "AllowedOrigins": [
            "*"  // 모든 도메인에서의 요청을 허용합니다. 즉, 어느 도메인에서든 이 버킷에 접근할 수 있도록 설정합니다.
        ],
        "ExposeHeaders": [
            "ETag"  // 응답 헤더에서 클라이언트가 접근할 수 있도록 허용된 헤더입니다. ETag는 객체의 변경 여부를 확인하는 데 사용됩니다.
        ]
    }
]