AWS CloudWatch logs 攻略

維運時,如果能將四散的 log 集中到一個地方存放,要抓錯的時候就會非常方便,甚至可以透過分析內容來發出警報或是研究趨勢!

市面上有很多集中 log 的服務平台,或是也可以自己架設 ELK (elasticsearch logstash kibana) 來實現。由於目前工作上使用 AWS,以省時為由,就先選用了 AWS 提供的 CloudWatch logs 服務,這邊分享其中的設定方法!

IAM 設定 permission

要讓 EC2 能夠把 log 串流到 CloudWatch logs 上,必須先設定對應的「政策 Policy」和「角色 Role」。

建立政策 Policy

首先我們建立一個 policy 讓他有權限可以發布 log 到 CloudWatch,
可以用互動模式勾選,或者直接複製這裡的 json 貼上。這邊方便起見,暫時沒有設定 Resource 的限制,實作上如果有需要可以自行加入。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
AWS CloudWatch logs 攻略
使用 web 介面建立 policy

建立角色 Role

為 EC2 建立一個角色,並把剛剛建立的 policy 加入

AWS CloudWatch logs 攻略
截圖中勾選的 policy 名字只是示意,需要依剛剛設定的 policy 名稱為主

選擇目標的 EC2,點選 Actions -> Instance Settings -> Attach/Replace IAM Role,依照介面提示的步驟 Attach 剛剛建立的 Role 上去即可

AWS CloudWatch logs 攻略

設定 Docker Container

這邊我們以 docker-compose yml 做示範,在對應的 yml 中加入以下設定

logging:
  driver: "awslogs"
  options:
    awslogs-region: "<your_region>"
    awslogs-group: "<your_group_name>"
    awslogs-stream: "<your_stream_name>"

參數部分稍微做個解釋:
1. region :
依照 logs 所希望的存在區域給定,比如說 ap-southeast-1
2. group:
可以想像成 logs stream 的「資料夾」,名字上的命名可以用這種模式來區分環境和服務,比如說 「/dev/microservice/some-microservice」
3. stream:
可以想像成原先 log 的檔案,這邊可以直接依需求命名即可,如 「some-microservice」

當然命名方式可以不一定要像我這樣,主要還是以好區分,好管理為主!

其中特別注意的是,我發現 docker 發現對應的 awslogs-group 如果不存在,並不會幫忙建立,反而會導致 container 起不起來,此時只需要先到 CloudWatch logs web console 建立 group,之後 container 就能正常運作。

而 awslogs-stream 的部分則不用人工介入,如果不存在 docker 會自動幫我們建立。

使用 awslogs agent 串流 log file

如果要直接把 log file 串上 CloudWatch logs 也是可行的,AWS 有提供 awslogs agent 程式來幫忙。把 log file 設定給 awslogs agent,他就會偵測變動,把增加的 logs 上傳到 CloudWatch logs。

安裝 awslogs agent

curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O

# region 須依照實際狀況調整
sudo python ./awslogs-agent-setup.py --region us-east-1

增加 watch log file

一安裝完就會有互動介面提示你輸入要 watch 的 log file(如下圖)

AWS CloudWatch logs 攻略

這邊僅提示幾個比較重要地方

Step 4 of 5: Configure the CloudWatch Logs Agent...
Path of log file to upload: # 給定要串上去的 log 檔案路徑
Destination Log Group name: # 給定 log stream 要放的 group name

Choose Log Stream name:
  1. Use EC2 instance id. # 使用 ec2 instance id 作為 stream name
  2. Use hostname. # 使用該 ec2 的 hostname 作為 stream name
  3. Custom.  # 自定義,建議選這個,未來會比較好管理

...

Choose initial position of upload:
  1. From start of file. # 從檔案一開始,如果以前的 log 有需要則選此
  2. From end of file.  # 從設定啟用後開始串流上去

之後如果要手動修改,調整此檔案即可

/var/awslogs/etc/awslogs.conf
[/var/log/xxx.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/xxx.log
buffer_duration = 5000
log_stream_name = <your_stream_name>
initial_position = <start_of_file> or <end_of_file>
log_group_name = <your_group_name>

啟動 awslogsd service,完成!

sudo service awslogsd start
sudo systemctl enable awslogsd

延伸閱讀:使用 AWS Parameter Store 實現 Config 和 Credentials 外置

參考資料:
Pass Credentials to the awslogs Docker Logging Driver on Ubuntu
Amazon EC2 的 IAM 的角色
Sending Linux logs to AWS Cloudwatch
快速入門 安裝並配置 CloudWatch Logs 運行ec2Linux實例上的代理

封面圖片備註:集中管理就可以有 Dashboard,再也不用 ssh 進去機器裡面看 log,實在太棒了!

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。