[데이터엔지니어링] - Project (4) : S3 권한 설정

nothingisme·2023년 11월 27일
0
post-thumbnail
😬 S3를 연결할 때 권한(정책) 설정하는 방법! S3 주인 설정 부분은 킹왕짱 민서언니가 써줬다🫶

1️⃣ 내 계정 S3 접근하기

S3와 연결 권한 에러

다음과 같은 종류의 에러( = 권한 없음)이 떴을 때 해결하는 방법에 대해 알아보자

  • botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden
  • 혹은 Permission Denied, Access Denied ...
    ( 사진 캡쳐 까먹음 🥲 )

본인의 경우에 Airflow의 DAG를 실행시켰을 때 upload 태스크에서 fail이 떠서 웹서버 로그를 확인해보니 아래와 같았다

그럼 다음과 같은 사항들이 적용되었는지 확인해보는 과정이 필요하다.

1. IAM 사용자의 권한 정책에 AmazonS3FullAccess가 있는지
2. S3 버킷의 퍼블릭 차단 액세스 권한이 비활성화 되어있는지

⭐️ IAM 사용자의 권한 정책에 AmazonS3FullAccess 등록하는 법

  1. AWS에서 IAM을 들어간다. 사용자 이름을 클릭해서 들어간다.
  2. 권한 탭에서 권한 추가 > 권한 추가를 누른다.
  3. 권한 옵션에서 직접 정책 연결을 선택한다.
  4. S3로 검색을 해서 AmazonS3FullAccess 를 찾아, 왼쪽에 체크로 선택을 하고 다음으로 넘어간다.
  5. 권한 추가 버튼 눌러주면 끝!

AmazonS3FullAccess 정책은 모든 Amazon S3 버킷에 대한 EC2 액세스를 허용해주는 것이다. 하지만 필요한 최소 권한으로 정책을 생성하는 것이 보안을 위해 가장 좋다!

⭐️ S3 버킷의 퍼블릭 차단 액세스 권한이 비활성화 되어있는지

S3 버킷 들어가서 권한 탭을 보면 퍼블릭 액세스 차단(버킷 설정)이 있다. 우선 퍼블릭 액세스 차단을 비활성으로 하면 괜찮을 것이다. 하지만 실제로 이렇게 설정 하면 보안 문제가 있기 때문에.. 이 글 읽고 나중에 추가로 더 공부해야겠다..


2️⃣ 다른 계정 S3 접근하기

👉🏻 다른 S3를 이용할 쪽에서 설정하기

  1. 계정 ID계정 이름을 상대방에게 전달해준다.

    → 사이트 오른쪽 상단 위에서 확인 가능하다. 계정 ID는 12자리 숫자!

  2. AWS IAM에서 정책 탭을 들어간다. 그리고 오른쪽 노란 버튼인 [ 정책 생성 ]을 누른다.

  3. 정책 편집기에서 시각적으로 되어있는 것을 JSON을 클릭해서 바꿔준다.

  4. JSON에 다음 내용을 복붙해서 작성해준다. 대충 airdnb라는 s3에 대해서 오브젝트를 Get, Put하는 액션에 대한 걸 허용해준다는 그런 내용

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject",
                    "s3:PutObjectAcl"
                ],
                "Resource": "arn:aws:s3:::airdnb/*"
            }
        ]
    }
  5. 정책 이름을 설정해준다. (나는 airdnb-s3 로 지정해줬다)

  6. 아래로 스크롤 해서 [ **이 정책에 정의된 권한 ]을 봤을 때 S3 서비스에 대해 제한적 읽기, 권한 관리, 쓰기**가 적용되어있다면 굳! 정책 생성을 누른다

  7. AWS에서 사용자 탭을 들어간다. 사용자 이름을 클릭해서 들어간다.

  8. 권한 탭에서 [권한 추가] → [권한 추가]를 누르자

  9. 권한 옵션에서 [ 직접 정책 연결 ]을 클릭하고 권한 정책 리스트에서 아까 만든 정책의 이름을 검색해서 선택해준다.

  10. [ 권한 추가 ] 눌러주면 끝!

  11. CLI에서 테스트해보기

    1. EC2에 접속한다.

    2. aws 명령어를 사용하기 위해서 설치해준다.

      pip3 install awscli
    3. 다음 명령어 실행해서 s3에 있는 파일들 목록이 잘 나오는지 확인해준다.

      aws s3 ls airdnb
  12. DAG에서 다른 S3로 보내주기

    → s3로 보낼 때 bucket 이름만 airdnb로 수정해주면 된다!


👉🏻 S3의 주인이 설정해야하는 부분 (사용자 권한 정책 부여)

  1. s3 의 권한 설정에 들어가서 퍼블릭 액세스 차단을 비활성으로 편집해줍니다.

  2. 퍼블릭 액세스 차단에 대해 옵션 설정하는 부분이 있는데 s3의 버킷 정책으로 사용자 권한을 부여하고 있으므로 밑에 두 개 체크!

  1. 버킷 정책에서 데엔 멤버들 접근 권한에 대한 설정을 진행해줘야합니다.
  • "Principal": {"AWS": "arn:aws:iam::AccountB:user/AccountBUserName"}

    • Principal “AWS” 키값으로 권한을 부여하고자 하는 계정ID AccountB, 계정유저이름 AccountBUserName을 작성해줍니다.
  • "Action": ["s3:GetObject","s3:PutObject","s3:PutObjectAcl"]

    • “Action” 키값에는 각 유저에게 허용하는 action(파일 넣기, 파일가져오기, 파일 내용 확인하기) 을 설정할 수 있습니다. (CRUD 느낌인듯..?)
  • "Resource": ["arn:aws:s3:::AccountABucketName/*"

    • “resource” 키값에는 AccountABucketName 을 넣어줍니다. AccountABucketName/data와 같이 특정 경로로 지정해줄 수 있습니다.

    • 참고 ) 위의 사진과 같이 list action을 부여할 때는 “Resource” 키값에 AccountABucketName/ ,AccountABucketName/* 모두 나열해줘야합니다.

⬇️ 해당 코드는 aws 공식 문서에 작성된 예시 코드 ⬇️

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Principal": {
              "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
          },
          "Action": [
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
          "Resource": [
              "arn:aws:s3:::AccountABucketName/*"
          ]
      }
  ]
}
profile
가볍게 재밌던 거 기록해요

2개의 댓글

comment-user-thumbnail
2023년 12월 2일

너무 친절한 설명이네요! 깔끔한 정리가 너무 좋아요... 사모합니다..

답글 달기
comment-user-thumbnail
2024년 1월 5일

멋져요
지식을 주고 받는 모습 보기 좋네요~^^

답글 달기