인터넷에 액세스할 수 없는 Amazon EC2 Auto Scaling 그룹에 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 있습니다. 인스턴스에서 Amazon CloudWatch로 로그와 지표를 전송하고 싶습니다.
해결 방법
1. Amazon EC2 인스턴스에 CloudWatch 에이전트를 설치합니다. 이 인스턴스는 인터넷에 연결되어 있어야 합니다. 또는 CloudWatch 에이전트를 사용하여 이미 로그와 지표를 CloudWatch로 푸시하고 있는 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를 위한 인터페이스 Virtual Private Cloud(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(S3)용 Virtual Private Cloud(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 주소는 지표 및 로그 또는 VPC CIDR을 푸시하는 EC2 인스턴스의 IP 주소입니다.
- 인스턴스가 Auto Scaling 그룹의 일부인 경우 에이전트 구성 파일에서 차원 중 하나를 Auto Scaling 그룹 이름으로 지정합니다. Auto Scaling 그룹의 이름을 찾기 위해 에이전트는 Amazon EC2 엔드포인트에서 인스턴스와 연결된 태그를 가져옵니다. Amazon EC2 서비스에 대한 VPC 인터페이스 엔드포인트를 추가해야 합니다. 에이전트는 EC2 인스턴스의 metadata에서 ImageId, InstanceId 및 InstanceType 값을 가져옵니다.