S3 access ...?

Jaymee·2021년 10월 22일
0

yeomanda 프로젝트에서 추가 기능을 넣기 위해 회원정보 수정 기능을 넣으려고 했다.
회원정보 수정이야 그냥 기존에 쓰던 api 혹은 함수를 사용하면 되겠다~ 싶어서 만만하게 봤는데, s3에서 데이터를 가져올때 getObject() 함수만 생각했는데,
결과가 나오지 않아서 뭐가 문제일까 싶었는데, 객체의 리스트를 보여지는 함수는 listObjects() 를 사용하면 객체리스트를 볼 수 있다.

const params_update2 = {
            Bucket : '[name]',
            Prefix : '[path]'
        }
const updatedFilePath = await s3.listObjects(params_update2).promise()

파라미터에는 bucket, key 가 아니라, bucket, prefix 로 대체되어야 한다.

또한 가장 중요한 문제가 있었는데, s3에서 delete를 하기 위해서는 권한을 정확하게 설정해줘야 한다.

  1. IAM>사용자 >권한

    여기서 s3에 관한 정책중
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

모든 정책이 위와 같이 s3와 관련되 정책에 한해서는 "Effect": "Allow"이어야 한다.
직접 연결에 많은 정책들이 있는데 그 중에 어떤 정책에서도 s3에 관해서 "Effect": "Deny" 가 있어서는 안된다.

  1. 버킷>권한
    버킷정책
{
    "Version": "2012-10-17",
    "Id": "Policy1634782651426",
    "Statement": [
        {
            "Sid": "Stmt1634782600366",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::936611888126:user/jaemin"
            },
            "Action": [
                "s3:Get*",
                "s3:PutObject*"
            ],
            "Resource": "arn:aws:s3:::yeomanda-userface/*"
        },
        {
            "Sid": "Stmt1634782600366",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::936611888126:user/jaemin"
            },
            "Action": [
                "s3:List*",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::yeomanda-userface"
        },
        {
            "Sid": "Stmt1634782600366",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::936611888126:user/jaemin"
            },
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::yeomanda-userface/*"
        }
    ]
}

key 설명
Principal : 누구에게 다음과 같은 권한을 줄 것인지. *로 처리하면 누구나 사용할 수 있다.
Effect : 해당 권한을 사용할 것 인지 말것인지. Deny이면 해당 권한을 부여하지 않는다.
Action : 어떤 행동에 대한 권한인지
Resource : 어떤 버킷에 대한 권한인지

추가적으로 여기서 다른 key들은 같은데 왜 Action에 대해서만 굳이 나눈 이유는 List Action에 대해서는 Resource가 다른 것을 볼 수 있다. 이렇기 때문에 나눠줬다.

다음과 같이 처리하면 s3에 대해서 모든 권한을 처리할 수 있다.

profile
backend developer

0개의 댓글