インターネットにアクセスできない Amazon EC2 Auto Scaling グループに Amazon Elastic Compute Cloud (Amazon EC2) インスタンスがあります。このインスタンスから Amazon CloudWatch にログとメトリクスを送信したいと考えています。
解決方法
1. Amazon EC2 インスタンスに CloudWatch エージェントをインストールします。このインスタンスにはインターネット接続が必要です。または、CloudWatch エージェントを使用して、ログとメトリクスを CloudWatch にプッシュしている Amazon EC2 インスタンスを選択することもできます。
2. CloudWatch エージェントが EC2 インスタンスからメトリクスとログをプッシュしていることを確認します。
3. Auto Scaling グループの起動テンプレートを作成します。起動テンプレートで、詳細設定の次の手順を実行します。
IAM インスタンスプロファイルには、インスタンスがメトリックスとログを CloudWatch にプッシュできるようにする適切な AWS Identity and Access Management (IAM) ロールを選択します。
ユーザーデータについては、次の例のようなスクリプトを入力します。このスクリプトのカスタマイズバージョンを使用して、ステップ 1 の JSON 設定に基づいて CloudWatch エージェントをインストールおよび設定します。 注: このサンプルユーザーデータスクリプトは、EC2 Linux インスタンスに CloudWatch エージェントをインストールします。このスクリプトは、メモリとディスクの使用率を監視するようにエージェントを構成してから、エージェントを起動します。Auto Scaling グループの特定の AWS リージョンのダウンロードリンクを使用する必要があります。
#!/bin/bash
cd /tmp
wget https://s3.<region>.amazonaws.com/amazoncloudwatch-agent-<region>/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
rpm -U ./amazon-cloudwatch-agent.rpm
cat << EOF > /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
"agent": {
"metrics_collection_interval": 60
},
"metrics": {
"append_dimensions": {
"InstanceId": "${aws:InstanceId}"
},
"metrics_collected": {
"disk": {
"measurement": [
"disk_used_percent"
],
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
]
}
}
}
}
EOF
/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
4. プライベートサブネットをホストする VPC に、CloudWatch モニタリングおよび Amazon CloudWatch Logs 用のインターフェイス仮想プライベートクラウド (VPC) エンドポイントを追加します。正しいエンドポイントを見つけるには、Amazon CloudWatch のエンドポイントとクォータを参照してください。これらの VPC エンドポイントで必要な CloudWatch アクションのみを許可するには、エンドポイントポリシーをカスタムポリシーで更新します。
CloudWatch モニタリング VPC エンドポイントのポリシーの次の例を参照してください。
{
"Statement": [
{
"Sid": "PutOnly",
"Principal": "*",
"Action": [
"cloudwatch:PutMetricData"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
CloudWatch Logs VPC エンドポイントのポリシーの次の例を参照してください。
{
"Statement": [
{
"Sid": "PutOnly",
"Principal": "*",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
詳細については、「インターフェイス VPC エンドポイントの作成に関する考慮事項」セクションを参照してください。
5. プライベートサブネットをホストする VPC に、Amazon Simple Storage Service (Amazon S3) の 仮想プライベートクラウド (VPC) ゲートウェイエンドポイントを追加します。これにより、プライベートサブネット内のインスタンスからのユーザーデータスクリプトが Amazon S3 から CloudWatch エージェントパッケージにアクセスしてダウンロードできるようになります。
6. ステップ 3 で作成した起動テンプレートを使用して、Auto Scaling グループ (プライベートサブネットが有効になっている) を作成します。CloudWatch エージェントは、この Auto Scaling グループで起動したインスタンスで実行されます。また、エージェントは、ステップ 4 で作成した VPC インターフェイスエンドポイントを介してメトリクスとログを送信します。
インターフェイス VPC エンドポイントを作成する際の考慮事項
- 必ず Auto Scaling グループのリージョンに対応するエンドポイントを使用してください。例えば、Auto Scaling グループがロンドンリージョンにある場合、メトリクスのエンドポイントは monitoring.eu-west-2.amazonaws.com です。このシナリオのログのエンドポイントは logs.eu-west-2.amazonaws.com です。
- [Enable Private DNS name] (プライベート DNS 名を有効にする) オプションが有効になっていることを確認します。このオプションを有効にできるのは、VPC の [Enable DNS hostnames] (DNS ホスト名を有効にする) 属性と [Enable DNS Support] (DNS サポートを有効にする) 属性が true に設定されている場合のみです。このオプションが無効になっている場合、VPC インターフェイスエンドポイントはサービスエンドポイントにマッピングされません。その結果、インスタンスはパブリックサービスエンドポイントに到達できません。このオプションを有効にすると、サービスエンドポイントが VPC インターフェイスエンドポイントにマッピングされ、サービスエンドポイントへの通信が非公開になります。デフォルトでは、CloudWatch エージェントはこのエンドポイントに接続します。必要に応じて、エージェント構成ファイルの endpoint_override パラメータを使用して、デフォルトのエンドポイントを上書きできます。
- セキュリティグループのルールが、エンドポイントのネットワークインターフェイスとサービスと通信する VPC 内のリソース間通信を許可していることを確認します。ログとメトリクスをプッシュするための API 呼び出しは、HTTPS ベースの GET/POST リクエストです。エンドポイントネットワークインターフェイスのセキュリティグループには、送信元 IP からの HTTPS プロトコルのインバウンドルールが必要です。送信元 IP アドレスは、メトリクスとログをプッシュする EC2 インスタンスの IP アドレス、または VPC CIDR です。
- インスタンスが Auto Scaling グループの一部である場合、エージェント構成ファイルで Auto Scaling グループ名としてディメンションの 1 つを指定します。Auto Scaling グループの名前を見つけるために、エージェントは Amazon EC2 エンドポイントからインスタンスに関連付けられたタグを取得します。Amazon EC2 サービスの VPC インターフェイスエンドポイントを追加する必要があります。エージェントは、EC2 インスタンスのメタデータから ImageId、InstanceId、および InstanceType の値を取得します。