[AWS S3] API Call로 S3 Access Logging 설정 시 유의할 점 (boto3)
상황 : 계정 내의 모든 버킷들에 access log 설정을 해두려고 한다
-> python boto3로 진행
1. 먼저 access log를 받을 버킷을 만든다
=> access log는 cross region이 지원되지 않는다
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html
따라서 계정 내 버킷의 리전 종류가 여러개라면, 각 리전별로 액세스로그용 버킷을 만들어야 한다
2. ACL 설정
ACL 의 S3 로그 전달 그룹에 대해 객체 쓰기
/버킷 ACL 읽기
권한을 부여해야 한다
만약 ACL 수정이 불가하다면 위의 객체 소유권을 수정해줘야 한다
3. boto3 활용
1) 계정 내의 모든 버킷 리스트 담아오기
: client.list_buckets()
사용
2) 버킷 리스트(죽기 전에 꼭 한 번쯤은 해 보고 싶은 것들을 정리한 목록 아님ㅎ) 내 반복을 돌며 리전 정보 얻기
: client.get_bucket_location(Bucket=bucket_name)
사용
S3.Client.get_bucket_location 확인
(리전이 한개밖에 없으면 생략 가능)
=> 참고로 버지니아 리전은 None
값을 불러온다
API_GetBucketLocation_ResponseElements 확인
3) 조건을 달아서 각 리전별로 액세스 로깅을 받을 버킷을 지정해준다
if region == 'ap-northeast-2':
response = client.put_bucket_logging(
Bucket=bucket_name,
BucketLoggingStatus={
'LoggingEnabled': {
'TargetBucket': seoul_access_logging_bucket,
'TargetPrefix': '%s/' % bucket_name
}
},
)
S3.Client.put_bucket_logging 확인
함수명에 당연히 access가 들어갈 줄 알았는데 없어서 좀 헤맸다;
그리고 여기서...! 버지니아 리전은 us-east-1
이 아닌 None
을 불러오기 때문에 아래와 같이 조건을 달아줘야 한다
if region == None:
response = client.put_bucket_logging(
Bucket=bucket_name,
BucketLoggingStatus={
'LoggingEnabled': {
'TargetBucket': virginia_access_logging_bucket,
'TargetPrefix': '%s/' % bucket_name
}
},
)
왜 버지니아는 어디서나 다 튀게 만들어놨는지 모르겠다. 얘 때문에도 한참 고민함
끝