😬 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 버킷의 퍼블릭 차단 액세스 권한이 비활성화 되어있는지
권한
탭에서 권한 추가 > 권한 추가
를 누른다.권한 옵션
에서 직접 정책 연결
을 선택한다.AmazonS3FullAccess
를 찾아, 왼쪽에 체크로 선택을 하고 다음으로 넘어간다.권한 추가
버튼 눌러주면 끝!AmazonS3FullAccess
정책은 모든 Amazon S3 버킷에 대한 EC2 액세스를 허용해주는 것이다. 하지만 필요한 최소 권한으로 정책을 생성하는 것이 보안을 위해 가장 좋다!
S3 버킷 들어가서 권한
탭을 보면 퍼블릭 액세스 차단(버킷 설정)
이 있다. 우선 퍼블릭 액세스 차단을 비활성으로 하면 괜찮을 것이다. 하지만 실제로 이렇게 설정 하면 보안 문제가 있기 때문에.. 이 글 읽고 나중에 추가로 더 공부해야겠다..
계정 ID 와 계정 이름을 상대방에게 전달해준다.
→ 사이트 오른쪽 상단 위에서 확인 가능하다. 계정 ID는 12자리 숫자!
AWS IAM에서 정책 탭을 들어간다. 그리고 오른쪽 노란 버튼인 [ 정책 생성 ]을 누른다.
정책 편집기에서 시각적으로 되어있는 것을 JSON을 클릭해서 바꿔준다.
JSON에 다음 내용을 복붙해서 작성해준다. 대충 airdnb라는 s3에 대해서 오브젝트를 Get, Put하는 액션에 대한 걸 허용해준다는 그런 내용
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::airdnb/*"
}
]
}
정책 이름을 설정해준다. (나는 airdnb-s3 로 지정해줬다)
아래로 스크롤 해서 [ **이 정책에 정의된 권한 ]을 봤을 때 S3 서비스에 대해 제한적 읽기, 권한 관리, 쓰기**가 적용되어있다면 굳! 정책 생성을 누른다
AWS에서 사용자 탭을 들어간다. 사용자 이름을 클릭해서 들어간다.
권한
탭에서 [권한 추가] → [권한 추가]를 누르자
권한 옵션에서 [ 직접 정책 연결 ]을 클릭하고 권한 정책 리스트에서 아까 만든 정책의 이름을 검색해서 선택해준다.
[ 권한 추가 ] 눌러주면 끝!
CLI에서 테스트해보기
EC2에 접속한다.
aws 명령어를 사용하기 위해서 설치해준다.
pip3 install awscli
다음 명령어 실행해서 s3에 있는 파일들 목록이 잘 나오는지 확인해준다.
aws s3 ls airdnb
DAG에서 다른 S3로 보내주기
→ s3로 보낼 때 bucket 이름만 airdnb로 수정해주면 된다!
s3 의 권한 설정에 들어가서 퍼블릭 액세스 차단을 비활성으로 편집해줍니다.
퍼블릭 액세스 차단에 대해 옵션 설정하는 부분이 있는데 s3의 버킷 정책으로 사용자 권한을 부여하고 있으므로 밑에 두 개 체크!
"Principal": {"AWS": "arn:aws:iam::AccountB:user/AccountBUserName"}
AccountB
, 계정유저이름 AccountBUserName
을 작성해줍니다."Action": ["s3:GetObject","s3:PutObject","s3:PutObjectAcl"]
"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/*"
]
}
]
}
너무 친절한 설명이네요! 깔끔한 정리가 너무 좋아요... 사모합니다..