공부/AWS

[AWS S3] API Call로 S3 Access Logging 설정 시 유의할 점 (boto3)

haejang 2022. 2. 23. 21:33
728x90
728x90

 

 

상황 : 계정 내의 모든 버킷들에 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() 사용

S3.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
            }
        },
    )

 

왜 버지니아는 어디서나 다 튀게 만들어놨는지 모르겠다. 얘 때문에도 한참 고민함

 

 

 

 

 

728x90
728x90