오늘도 개발

[2차 프로젝트 내일의 집] AWS s3로 글쓰기 api 구현하기 - 1. AWS 세팅(IAM 설정, S3 설정) 본문

TIL & 프로젝트 회고

[2차 프로젝트 내일의 집] AWS s3로 글쓰기 api 구현하기 - 1. AWS 세팅(IAM 설정, S3 설정)

Sueeeeeee 2022. 8. 8. 17:23

0. API 핵심 기능

유저가 글, 사진을 작성하고 '글 올리기' 버튼을 누른다.

프론트에서 엔드포인트 posts/write로 POST 요청을 보낸다.

POST 바디에는 user id, 이미지 파일, 각 이미지에 대한 설명글, 태그 등이 들어있다.

 

글쓰기 api는 요청을 받으면

1) POST 바디로 받은 이미지 파일을 s3에 업로드한다.

2) 업로드한 사진의 url을 가져온다.

3) POST 바디로 받은 다른 데이터(ex. user_id, 설명 등)와 사진 url을 DB에 저장한다.

 

s3는 아마존에서 제공하는 클라우드 서비스이다.

이 포스트에서는 이미지 파일을 s3 업로드하기 위한 AWS 설정 방법을 다룰 것이다.

1.  IAM(Identity and Access Management) 유저 생성하기

AWS에서는 한 계정을 여러 사용자가 사용할 수 있다.

IAM은 각 사용자에게 AWS 서비스의 접근 권한을 주는 작업이다.

예를 들어 a라는 계정을 사용하는 1번 사용자에게는 RDS 권한만, 2번 사용자에게는 S3의 권한만 주는 식으로 설정할 수 있다.

 

최초로 AWS 계정을 만들면 루트 사용자가 되는데,

루트 사용자는 IAM으로 사용자를 추가할 수 있다.

 

여기서 루트 사용자인 나는 IAM으로 사용자 a를 추가하고,

a로 로그인하여 a사용자로 AWS를 사용할 것이다. 

 

1) 루트 사용자로 로그인 후 IAM 콘솔로 이동

2) 액세스 관리 > 사용자 > 사용자 추가 선택

3) 비밀번호 설정 (사용 편의를 위해 액세스 키, 암호 둘 다 선택)

4) 그룹에 사용자 추가

   가장 위의 그룹을 선택한다.

   나는 a 사용자에게 모든 기능에 대한 접근 권한을 주고 싶기 때문이다.

5) 사용자 추가 완료

6) 완료 시 뜨는 창에서 사용자의 키 등 중요한 정보가 들어있는 csv 다운로드(재다운로드 안 됨)

7) 링크 클릭해서 로그인

 

2.  IAM 정책 생성하기

1) 액세스 관리 > 정책 > 정책 생성 클릭

2) JSON 클릭 >  s3 관련 권한 부여하기

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3statement",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::{버킷이름}/*",
                "arn:aws:s3:::{버킷이름}"
            ]
        }
    
    ]
}

3) 정책 생성 클릭

 

3.  IAM 사용자에게 정책 부여하기

1) 액세스 관리 > 정책 클릭

2) 라디오 버튼으로 정책 선택 > 작업 클릭 > 연결 클릭

3) 연결할 사용자 선택하기

 

4.  S3 세팅하기

1) S3 > 버킷 만들기 클릭 > 버킷 생성

   버킷이란? 데이터를 저장할 곳. 오브젝트로 사용함.

2) 생성한 버킷 클릭 > 권한 > 액세스 > 모든 퍼블릭 액세스 차단 해지

3) 생성한 버킷 클릭 > 권한 > 버킷 정책 > 편집 > 정책 추가

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StatementSid1",
            "Effect": "Allow",
            "Principal": {
               /* IAM 대시보드로 가서 유저 클릭, 사용자 ARN 복사 */
                "AWS": "{user의 arn}"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::{버킷명}/*"
        },
        {
            "Sid": "StatementSid2",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{버킷명}/*"
        }
    ]
}

4) 생성한 버킷 클릭 > 권한 > CORS 편집 클릭

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ],
        "MaxAgeSeconds": 3000
    }
]