ハンズオンの目的
本ハンズオンでは、Private サブネットの EC2 から
CloudWatch Logs へ任意ログを収集する構成を SSM 接続のみで構築し、
以下理解することを目的とする。
- CloudWatch Agent の導入と設定
- 任意ログ(例:/var/log/messages)の収集
- VPC エンドポイントを使った 完全閉域通信
構成と準備
使用リソース
| リソース / 項目 | 詳細内容 |
|---|---|
| VPC | Private Subnet |
| EC2 | Amazon Linux 2023 |
| 接続方式 | SSM Session Manager |
| NAT | なし |
| Interface Endpoint |
ssm / ec2messages / ssmmessages / logs
|
| ログ送信 | CloudWatch Agent → CloudWatch Logs |
実施手順
STEP 1. IAMロールの作成(CloudWatch にログを送る権限)
STEP 2. EC2 に CloudWatch Agent をインストール
STEP 3. テスト用ログファイルを作成
STEP 4. CloudWatch Agent 設定ファイルを配置
STEP 5. CloudWatch Agent を起動
STEP 6. 状態確認
STEP 7. CloudWatch Logs で確認
STEP 8. ログが増えるかテスト
検証内容と結果
STEP 1. IAMロールの作成(CloudWatch にログを送る権限)
EC2 に以下のポリシーをアタッチ:
AmazonSSMManagedInstanceCore SSM接続用
CloudWatchAgentServerPolicy CloudWatchにログを送る権限
STEP 2. EC2 に CloudWatch Agent をインストール
EC2インスタンスへSSM接続を行い、以下のコマンドを実行
sudo dnf install amazon-cloudwatch-agent -y
インストール完了後、以下にディレクトリが作成される
/opt/aws/amazon-cloudwatch-agent
※AMI2023にはデフォルトではインストールされていない
STEP 3. テスト用ログファイルを作成
EC2インスタンスで以下のコマンドを実行
sudo bash -c 'echo "Hello CloudWatch Log" >> /var/log/myapp.log'
STEP 4. CloudWatch Agent 設定ファイルを配置
CloudWatch Agent の設定ファイルは
/opt/aws/amazon-cloudwatch-agent/bin/config.json
に置く形式にします。
sudo tee /opt/aws/amazon-cloudwatch-agent/bin/config.json > /dev/null << 'EOF'
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/myapp.log",
"log_group_name": "myapp-log-group",
"log_stream_name": "{instance_id}",
"timezone": "UTC"
}
]
}
}
},
"metrics": {
"append_dimensions": {
"InstanceId": "${aws:InstanceId}"
},
"metrics_collected": {
"cpu": {
"measurement": [
{"name": "cpu_usage_idle", "unit": "Percent"},
{"name": "cpu_usage_system", "unit": "Percent"},
{"name": "cpu_usage_user", "unit": "Percent"}
],
"metrics_collection_interval": 60
}
}
}
}
EOF
設定のポイント
-
/var/log/myapp.logのログを CloudWatch Logs へ送信 - Log group:
myapp-log-group - Stream:インスタンスID
- CPU メトリクスも収集
STEP 5. CloudWatch Agent を起動
EC2インスタンスで以下のコマンドを実行
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
STEP 6. 状態確認
EC2インスタンスで以下のコマンドを実行
sudo systemctl status amazon-cloudwatch-agent
正常なら active (running)。
STEP 7. CloudWatch Logs で確認
AWS コンソール → CloudWatch → Logs → Log groups
- myapp-log-group が作成されている
- 中に log stream(EC2のID)
- Hello CloudWatch Log のログが見える
STEP 8. ログが増えるかテスト
EC2インスタンスで以下のコマンドを実行
sudo bash -c 'echo "Another line at $(date)" >> /var/log/myapp.log'
今回の学び
-
IFEPの不足が原因でロググループが作成されなかった
EC2⇒CloudWatch Logsが通るルートがなかった
★com.amazonaws.ap-northeast-1.logs
⇒Cloudwatch専用のIFEP -
CloudWatch Agentのインストールができなかった
CloudWatch Agent のインストール時、EC2 はパッケージを S3 から取得する。S3 は Interface Endpoint ではなく Gateway Endpoint 経由で通信するため、Interface Endpointへの通信だけを許可していても、S3 へのパケットが遮断されインストールに失敗する。
EC2のSGに東京リージョンの S3マネージドプレフィックスリスト (pl-61a54008) を宛先とした HTTPS (443) 通信を追加することで、0.0.0.0/0 を許可することなく、安全かつ最小権限でインストールが可能になる。
⇒EC2のSG設定のアウトバウンドにInterface EndpointへアタッチしたのSGのみを参照するようにしていた
