ELB Access Log 저장 - S3 Bucket
이전에 배포했던 Guestbook App의 앞에는 ELB와 Ingress Controller가 위치한다. 이번 시간은 사용자가 서비스에 접근하기 위해서 반드시 거쳐야 하는 ELB의 Access Log를 S3에 저장하는 방법에 대해 다뤄보려고 한다.
가장 먼저 S3 Bucket을 생성한다. AWS 콘솔의 Amazon S3 > Buckets 메뉴에서 생성 가능하다.
Bucket 이름은 Global Resource이므로 유일 식별 가능하도록 작명한다. 필자는 'my-eks-elb-access-log'라는 이름의 bucket을 ap-north-east2 리전에 생성하였다.
Log 저장이 주목적이므로 Public Access 및 Versioning, Encryption 등은 비활성화한 후 생성 버튼을 누르면, 아래와 같은 bucket이 추가된다.
다음은 Bucket Policy를 정의해야 한다. 이 과정이 다소 까다롭기 때문에 주의깊이 진행해야 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<elb-account-id>:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<bucket-name>/<prefix>/AWSLogs/<your-aws-account-id>/*"
},
{
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<bucket-name>/<prefix>/AWSLogs/<your-aws-account-id>/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::<bucket-name>"
}
]
}
- <elb-account-id>: Region마다 ELB의 Account ID가 다르기 때문에, 링크를 참고해서 ELB가 위치한 Region의 Account ID를 입력해야 한다. 참고로 ap-northeast-2의 ELB Account ID는 600734575887이다.
- <bucket-name>: ELB Access Log를 저장할 Bucket의 이름을 입력한다.
- <your-aws-account-id>: IAM User의 Account ID를 의미한다. 이름과는 다르며 유니크한 12자리 숫자로 구성된다. AWS 콘솔의 'IAM > User > Summary' 메뉴에서 확인 가능하다.
- <prefix>: Acess Log를 저장시, 분류를 하기 위한 prefix이다. 아무 이름도 무방하나, 가급적이면 구분하기 쉽게 설정한다.
위 내용에 맞게 작성한 Bucket Policy를 적용한다. 정확한 이름과 Account ID를 입력했다면 문제없이 Policy가 반영된다.
다음은 ELB가 Access Log를 저장할 수 있도록 Ingress Controller의 설정을 변경하고, 다시 배포한다. 아래와 같이 Helm 차트에 적용할 수 있는 values 파일(elb-access-log-to-bucket.yaml)을 추가하고 helm 명령어를 실행하여 기존 release를 업그레이드한다.
controller:
service:
annotations:
# access logs for AWS ELB
service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true"
service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "5"
service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "<your-bucket-name>"
service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "<prefix>"
참고로 'aws-load-balancer-access-log-emit-interval'는 ELB에서 Access Log를 publish하는 주기를 의미하며, 5분/60분 중에서 선택해야 한다. 이번엔 5분마다 Access Log를 저장하도록 설정하였다.
$ helm upgrade nginx-ingress-controller \
stable/nginx-ingress \
-n nginx-ingress-controller \
-f elb-access-log-to-bucket.yaml
변경사항이 적용되었는지 AWS 콘솔에서 ELB를 확인한 결과, 위 내용 그대로 반영된 것을 알 수 있다.
마지막으로 Bucket에 ELB Access Log가 실제로 저장되고 있는지 알아보았다. 계속해서 폴더 안으로 들어가다 보면 다음과 같이 로그 파일을 찾을 수 있다.
로그 파일의 내용도 확인해보자. Access Time, Src/Dst IP/Port, Request 헤더 등의 내용을 포함하고 있음을 알 수 있다.
참고
'Cloud' 카테고리의 다른 글
Container Vs. VM (0) | 2021.06.26 |
---|---|
Amazon EKS Tutorial - Part.6 (0) | 2021.03.22 |
Amazon EKS Tutorial - Part.4 (0) | 2021.03.17 |
Amazon EKS Tutorial - Part.3 (0) | 2021.03.16 |
Amazon EKS Tutorial - Part.2 (1) | 2021.03.15 |