안녕하세요 서후아빠입니다. ^_^
이번 세션은 Amazon ELB의 Log를 Amazon S3에 저장하는 실습을 해보겠습니다.
온프레미스 L4엔지니어 때는 실시간 패킷 확인이 가능하여 트러블슈팅이 쉬웠는데 AWS에서 이러한 부분이 불편하여 찾은 방법입니다. 물론 VPC Flow Log라는 녀석이 있긴 하는데, 개인적으로는 ELB 로그는 이 녀석이 더 보기가 쉬운 것 같습니다.
1단계 : S3 설정
S3 > bucket > Create a bucke : elb-bucket
S3 > bucket > elb-bucket > Create a folder : elb-log
S3 > bucket > elb-bucket > Permission (tab) > Bucket Policy "edit" > "버킷 권한 가이드"의 내용 추가 > Save changes
※ 버킷 권한 AWS 가이드 URL : Classic LB, NLB, ALB
※ elb-account-id(Principal) : 600734575887(서울, ap-northeast-2)
※ bucket-name/prefix : elb-bucket/elb-log
※ your-aws-account-id : IAM > dashboard > 우측 “계정 ID” (ex : 239243157363)
이번 세션에서 가장 중요한 부분입니다. S3에 ELB 로그를 저장하기 위해서는 버킷 권한 설정을 해야 하는데요. NLB와 ALB의 권한 설정 내용(JSON)이 다릅니다. 자세한 내용을 알고 싶으시면 위 "버킷 권한 AWS 가이드 URL"을 참고하시면 됩니다. 직접 찾는 과정이 귀찮으시다면 아래 코드 블럭 안의 내용에서 추가된 부분을 복사하신 다음에 "elb-bucket", "elb-bucket/elb-log", "239243157363" 부분만 변경하셔서 사용하시면 됩니다. 아래 권한을 제대로 설정하지 않으면 2단계 로그 활성화 시 에러 발생하면서 활성화가 되지 않습니다. 아래 예시를 사용하여 정상동작하지 않을 경우는 "버킷 권한 AWS 가이드 URL"로 이동하시어 변경된 내용을 확인하시기 바랍니다. 또한 NLB의 경우는 TLS 리스너(인증서 필요)가 있는 경우만 액세스 로그가 수집되기 때문에 TCP 리스너로 설정한 경우 액세스 로그 수집이 되지 않습니다. (참조 URL) |
# ALB 경우
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::600734575887:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::elb-bucket/*"
},
{
"Effect": "Allow",
"Principal": {
"Service": "logdelivery.elb.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::elb-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
# NLB 경우
{
"Version": "2012-10-17",
"Id": "AWSLogDeliveryWrite",
"Statement": [
{
"Sid": "AWSLogDeliveryAclCheck",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::elb-bucket",
"Condition": {
"StringEquals": {
"aws:SourceAccount": ["239243157363"]
},
"ArnLike": {
"aws:SourceArn": ["arn:aws:logs:ap-northeast-2:239243157363:*"]
}
}
},
{
"Sid": "AWSLogDeliveryWrite",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::elb-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": ["239243157363"]
},
"ArnLike": {
"aws:SourceArn": ["arn:aws:logs:ap-northeast-2:239243157363:*"]
}
}
}
]
}
# ALB+NLB 경우
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::600734575887:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::elb-bucket/*"
},
{
"Effect": "Allow",
"Principal": {
"Service": "logdelivery.elb.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::elb-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Sid": "AWSLogDeliveryAclCheck",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::elb-bucket",
"Condition": {
"StringEquals": {
"aws:SourceAccount": ["239243157363"]
},
"ArnLike": {
"aws:SourceArn": ["arn:aws:logs:ap-northeast-2:239243157363:*"]
}
}
},
{
"Sid": "AWSLogDeliveryWrite",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::elb-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": ["239243157363"]
},
"ArnLike": {
"aws:SourceArn": ["arn:aws:logs:ap-northeast-2:239243157363:*"]
}
}
}
]
}
2단계 : ELB 액세스 로그 활성화
EC2 > load balancer > 생성된 ELB 선택하고, 우클릭 > Edit properties
구분 | access logs | S3 location (Example : S3Bucket/prefix) | ||
ELB attiributes | Enable | elb-bucket/elb-log |
1단계 과정을 진행하지 않고 2단계 과정을 진행하면 활성화 진행 시 권한 없음으로 진행이 되지 않습니다. |
3단계 : ELB 도메인으로 접속
구성된 ELB 도메인으로 접속(ex : http://alb-dfb80a03d83596ff.elb.ap-northeast-2.amazonaws.com)
4단계 : S3에 수집된 로그 확인
수집된 로그 형태 및 내용 (예시)
http 2022-03-01T00:24:03.645580Z app/alb/a052b971cfca93c4 175.113.243.202:53185 10.0.3.26:80 0.000 0.004 0.000 200 200 499 4387 "GET http://alb-dfb80a03d83596ff.elb.ap-northeast-2.amazonaws.com:80/ HTTP/1.1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-2:461287778302:targetgroup/alb-tg/62cf44eb82e433be "Root=1-621d67a1-4ca285864a6c7fd34971012c" "-" "-" 0 2022-03-01T00:24:01.657000Z "forward" "-" "-" "10.0.3.26:80" "200" "-" "-"
구분 | 내용 |
프로토콜 | http |
접속 시간 | 2022-03-01T00:24:03 |
ELB 종류 및 ID | app/alb/a052b971cfca93c4 |
SIP:SPORT(클라이언트 측) | 175.113.243.202:53185 |
DIP:DPORT(서버측) | 10.0.3.26:80 |
ELB에 등록된 DNS 이름 | http://alb-dfb80a03d83596ff.elb.ap-northeast-2.amazonaws.com:80 |
ELB에 등록된 ARN, 대상그룹 이름 | arn:aws:elasticloadbalancing:ap-northeast-2:461287778302:targetgroup/alb-tg |
접속 요청에 대한 응답값 | 200 |
기타 : S3에 수집된 로그 자동 삭제
S3 > bucket > elb-bucket > Properties(tab) > Bucket Versioning > Edit > Bucket Versioning(Enable) > Save changes
버킷 버전관리를 활성화하지 않으면 Lifecycle rule 동작하지 않습니다. |
S3 > bucket > elb-bucket > Management(tab) > Lifecycle rules > Create lifecycle rule
※ your-aws-account-id : IAM > dashboard > 우측 “계정 ID” (ex : 239243157363)
Lifecycle rule configuration | Lifecycle rule actions | ||
Lifecycle rule name : Delete3days Choose a rule scope : Limit the scope of this rule using one or more filters Prefix : elb-log/awslogs/239243157363/elasticloadbalancing/ap-northeast-2/ |
Expire current versions of objects : check - Days after object creation : 3 Permanently delete noncurrent versions of objects : check - Days after objects become noncurrent : 1 |
해당 버킷의 모든 객체(all object)에 대해서 생성된지 3일된 객체는 현재 버전을 만료 처리하여 과거 버전으로 변경 시킵니다. 그리고 과거 버전의 객체는 최신 상태가 1일이면 영구 삭제합니다. (3일만 저장한다는 의미) |
AWS 참고 URL
ALB 액세스 로그 수집 : https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/load-balancer-access-logs.html
NLB 액세스 로그 수집 : https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/network/load-balancer-access-logs.html
'Networking' 카테고리의 다른 글
[실습] Amazon TGW (Transit Gateway) 구성하기 (동일 AWS 계정+동일 Region, Split)-1편 (0) | 2022.07.14 |
---|---|
[이론] Amazon TGW(Transit Gateway) 기본 개념 (0) | 2022.07.14 |
[실습] Amazon ELB (ALB+NLB) 구성하기 (3) | 2022.07.13 |
[실습] Amazon ELB (ALB, NLB) 구성하기 (0) | 2022.07.13 |
[이론] AWS VPN 기본 개념 (0) | 2022.07.06 |