AWS ALB設定方式

ALB設定的memo

CLB vs ALB

一個比較新一個比較舊 XD

目前比較能搜尋到的都是CLB/NLB的設定

ALB官方文件比較多,不過我還是會搞混就跑去問了Support

簡單來說

1
2
3
ALB做Redirect的部分會直接在前面ELB的機器上處理

CLB則是導回EC2由Nginx處理
1
2
3
mulitsite domain也是直接對應好domain

進入nginx後由nginx判斷對應

剩下功能請參閱官方網站…


轉換ElasticIP to ALB

原先設定

使用直通Elastic IP + domain (HTTP) / Let’s Encrypt (HTTPS)

Nginx強制Redirect Https

1
2
3
if ($host = api.com.tw) {
return 301 https://$host$request_uri;
}

設定ALB

直接設定HTTPS (443 port) Listener

並掛上先設定好的AWS Certificate

e.g.

1
2
3
4
5
api.com.tw

或是Wildcard 格式

*.com.tw

然後在ALB 設定http redict to https

http 80 to 443 Listener

如果是用CLB的話要從nginx設

如何在 ELB 中的 Classic Load Balancer 上将 HTTP 流量重定向到 HTTPS

1
2
3
4
5
6
7
server {
listen 80;
server_name _;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}

調整NGINX Vhost設定

所以要無痛轉換現有環境設定至ALB,照前面的設定完成之後

拿掉Nginx強制Redirect Https

1
2
3
if ($host = api.com.tw) {
return 301 https://$host$request_uri;
}

然後更換domain DNS,change domain IP to CNAME(約略1~3hr)

轉換中間影響不大。


設定ELB Log to S3 Bucket

基本上參照官方文件做就可以了 XD

Access Logs for Your Application Load Balancer

記得設定prefix,不設定也可以但是會出現奇怪route(這是support幫忙測試的)

ALB的設定在

Basic Configuration -> Attributes->Edit Attributes -> Access logs -> Enable

e.g.

api-log/folder

api-log是s3 bucket name

不過官方的policy跟我後來用的有一點不同

582318560864是Tokyo區的Elastic Load Balancing Account ID

這在官方文件裡面有說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version": "2012-10-17",
"Id": "Policy1556003235575",
"Statement": [
{
"Sid": "Stmt1556003219386",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::582318560864:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::S3bucketName/prefixfolder/AWSLogs/AWS帳號(數字)/*"
}
]
}

使用GoAccess分析ELB LOG

  1. 把要抓LOG回來的那台機器掛IAMrole,給予特定S3 bucket存取權限

  2. aws cli sync 到local

1
aws s3 sync s3://mybucket s3://mybucket2
  1. 使用gunzip解壓全部

e.g.

1
gunzip 12345678_elasticloadbalancing_ap-northeast-1_app.osmLoadBalancer*
  1. 使用goaccess 分析log

goaccess的似乎只有CLB的格式(不確定)

所以就在github找到了ALB的格式解法

Amazon Application Load Balancer (alb) access log format

e.g.

1
goaccess 12345678* --log-format='%^ %dT%t.%^ %v %h:%^ %^ %T %^ %^ %s %^ %b %^ "%r" "%u" %^' --date-format='%Y-%m-%d' --time-format=%T

或是

1
goaccess access.log --log-format='%^ %dT%t.%^ %v %h:%^ %^ %T %^ %^ %s %^ %b %^ "%r" "%u" %^' --date-format='%Y-%m-%d' --time-format=%T
  1. 其他方法

當然用s3fs直接mount也是一個解法,就不用花費local的空間

但是個人很討厭s3fs :p

  1. 一行搞定法
1
aws s3 sync s3://bucketName/prefix/AWSLogs/AWS數字Account/elasticloadbalancing/ap-northeast-1/2019/05/07 /home/ec2-user/你的位置 && gunzip 檔名* && cat *.log >access.log && goaccess access.log --log-format='%^ %dT%t.%^ %v %h:%^ %^ %T %^ %^ %s %^ %b %^ "%r" "%u" %^' --date-format='%Y-%m-%d' --time-format=%T

Reference

如何在 ELB 中的 Classic Load Balancer 上将 HTTP 流量重定向到 HTTPS

Access Logs for Your Application Load Balancer

aws cli sync

Amazon Application Load Balancer (alb) access log format

還有強大的AWS Support工程師。