AWS Memos

說明

工作中的主要部署環境是 AWS,所以這邊紀錄一些常用的指令。

TIPS

  1. CloudFront 中的 504 錯誤
    這是一個有趣的問題,在我們的專案裡,504 gateway timeout 的原因是 server 端的 websocket faye 的連線逾時設定為 60 秒,而因為 CloudFront 有自己的 timeout 設定,預設是 30 秒,所以當連線超過 30 秒沒有回應時,就會回傳 504 錯誤。在把 faye 的連線逾時設定改為 50 秒並將 CloudFront改為 60 秒後,就不會再出現 504 錯誤了。

  2. EC2 的 EBS 空間擴展
    檢查 File System Type: df -hT
    檢查 Volume ID: lsblk (xvda or nvme0n1看這裡)
    擴展 Volume: sudo growpart /dev/xvda 1 or sudo growpart /dev/nvme0n1 1
    a. 擴展 xfs File System: sudo xfs_growfs /dev/xvda1 or sudo xfs_growfs -d /
    b. 擴展 ext4 File System: sudo resize2fs /dev/xvda1 or sudo resize2fs /dev/nvme0n1p1

  3. DynamoDB Local 的使用
    我打算用 Docker Image 來跑本地端的 DynamoDB 開發,安裝時遇到一個使用者權限問題, 如果直接使用 image,data 的路徑是 root 建立的,所以 docker user 沒有權限寫入,所以我決定自己建立一個 image,以下是我的 Dockerfile:

    1
    2
    3
    4
    FROM amazon/dynamodb-local
    WORKDIR /home/dynamodblocal
    RUN mkdir ./data && chown -R 1000 ./data
    CMD ["-jar", "DynamoDBLocal.jar", "-sharedDb", "-dbPath", "/home/dynamodblocal/data"]

    然後要整合 Docker Compose 的話,可以參考以下的設定:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: '3.8'
    services:
    dynamodb-local:
    build:
    context: .
    dockerfile: Dockerfile
    ports:
    - 8000:8000/tcp
    volumes:
    - dynamodb_data:/home/dynamodblocal/data

    這樣就可以在本地端使用 Docker Image 來跑 DynamoDB Local 了。用以下指令來測試一下連線:

    1
    aws dynamodb list-tables --endpoint-url http://localhost:8000

    如果有成功的話,就會看到以下的回應:

    1
    2
    3
    {
    "TableNames": []
    }
  4. CloudWatch Agent EC2 Instances 監控設定

    1. 安裝 CloudWatch Agent in Ubuntu EC2 Instances
      1
      2
      wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
      sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
    2. IAM 權限設定要加入 CloudWatchAgentServerPolicy,這樣才能正確的上傳資料到 CloudWatch
    3. 執行 CloudWatch Agent Wizard
      1
      sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
      這邊要注意的是,如果是要監控 EC2 Instances 的話,要選擇 EC2,如果是要監控 Docker 的話,要選擇 Others,然後選擇 CollectD,其他的就照著 wizard 的指示設定就可以了。
    4. Logs的設置可以在稍後的設定檔中修改,我的部分大概長這樣:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
       {
      "agent": {
      "run_as_user": "root"
      },
      "logs": {
      "logs_collected": {
      "files": {
      "collect_list": [
      {
      "file_path": "/home/user/app/log/sample.log*",
      "log_group_name": "app",
      "log_stream_name": "{instance_id}",
      "retention_in_days": 180,
      "filters": [
      {
      "type": "include",
      "expression": "P(UT|OST)|GET"
      }
      ]
      }
      ]
      }
      }
      }
      }
    5. 設定完成後,會產生一個 amazon-cloudwatch-agent.json 的設定檔案,可以用以下指令來啟動 CloudWatch Agent:
      1
      2
      3
      4
      5
      6
      7
      8
      # Ubuntu 要有安裝 collectd
      sudo apt-get update && sudo apt-get install collectd -y
      # 啟動 CloudWatch Agent
      sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
      # 查看 CloudWatch Agent 狀態
      sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
      # 停止 CloudWatch Agent
      sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

參考資料

  1. CloudFront 504 Gateway Timeout
  2. CloudWatch Agent Wizard
  3. CloudWatch Agent Manual
  4. 調整磁碟區大小後擴展 Linux 檔案系統
  5. Day 27 將 EC2 的 Log 轉發到 CloudWatch Log