Aws Cloud Infrastructure은(는) 무엇을 하나요?
Dynatrace Smartscape와 DQL을 사용하여 AWS 리소스를 모니터링하고 분석합니다. AWS 서비스를 쿼리하고, 비용을 최적화하며, 보안을 관리하고, AWS 인프라 전반에 걸쳐 용량을 계획할 수 있습니다.
이 기술을 사용해야 하는 경우
사용자가 Dynatrace에서 AWS 리소스로 작업해야 할 때 이 기술을 사용합니다. 작업 유형에 따라 참조 파일을 로드하세요:
- 인벤토리: "us-east-1의 모든 EC2 인스턴스 보여줘"
- 네트워크: "VPC vpc-abc123의 모든 리소스 찾아줘"
- 데이터베이스: "Multi-AZ가 활성화된 모든 RDS 인스턴스 나열해줘"
- 서버리스: "VPC 액세스 권한이 있는 Lambda 함수 보여줘"
- 비용: "비용 절감을 위해 연결되지 않은 EBS 볼륨 찾아줘"
- 보안: "공개적으로 액세스 가능한 데이터베이스 식별해줘"
- 규정 준수: "Environment 태그가 누락된 리소스 찾아줘"
- 용량: "서브넷 IP 사용률 분석해줘"
- 문제 해결: "대상 그룹을 통해 로드 밸런서에서 인스턴스로 매핑해줘"
- 문제 분석: "이 AWS 문제가 발생하기 전에 무엇이 변경되었나요?" / "이 리소스에 영향을 미친 이벤트는 무엇인가요?"
- 워크로드 컨텍스트: "이 인스턴스가 로드 밸런서 뒤에 있나요, EKS 클러스터에 있나요, 아니면 ECS에서 관리하나요?"
- 이벤트: "이 리소스에 영향을 미치는 최근 AWS 이벤트가 있었나요?"
핵심 개념
엔터티 유형
AWS 리소스는 AWS_* 접두사를 사용하며 smartscapeNodes 함수를 사용하여 쿼리할 수 있습니다. 모든 AWS 엔터티는 Dynatrace Smartscape에서 자동으로 검색되고 모델링됩니다.
컴퓨팅: AWS_EC2_INSTANCE, AWS_LAMBDA_FUNCTION, AWS_ECS_CLUSTER, AWS_ECS_SERVICE, AWS_EKS_CLUSTER
네트워킹: AWS_EC2_VPC, AWS_EC2_SUBNET, AWS_EC2_SECURITYGROUP, AWS_EC2_NATGATEWAY, AWS_EC2_VPCENDPOINT
데이터베이스: AWS_RDS_DBINSTANCE, AWS_RDS_DBCLUSTER, AWS_DYNAMODB_TABLE, AWS_ELASTICACHE_CACHECLUSTER
스토리지: AWS_S3_BUCKET, AWS_EC2_VOLUME, AWS_EFS_FILESYSTEM
로드 밸런싱: AWS_ELASTICLOADBALANCINGV2_LOADBALANCER, AWS_ELASTICLOADBALANCINGV2_TARGETGROUP
메시징: AWS_SQS_QUEUE, AWS_SNS_TOPIC, AWS_EVENTS_EVENTBUS, AWS_MSK_CLUSTER
공통 AWS 필드
모든 AWS 엔터티에는 다음이 포함됩니다:
aws.account.id- AWS 계정 식별자aws.region- AWS 리전(예: us-east-1)aws.resource.id- 고유 리소스 식별자aws.resource.name- 리소스 이름aws.arn- Amazon Resource Nameaws.vpc.id- VPC 식별자(VPC 연결 리소스의 경우)aws.subnet.id- 서브넷 식별자aws.availability_zone- 가용 영역aws.security_group.id- 보안 그룹 ID(배열)tags- 리소스 태그(tags[TagName]사용)
로그 및 Bizevents의 AWS 필드
AWS에서 생성된 로그(fetch logs)는 다음 필드를 전달합니다 — 탐색이 필요 없습니다:
aws.region,aws.account.id,aws.service,aws.log_group,aws.log_stream- 표준 로그 필드 추가:
content,loglevel,timestamp,k8s.*,dt.smartscape.*
AWS에서 생성된 bizevents(fetch bizevents)는 다음을 전달합니다:
aws.region,aws.account.id,event.type,event.provider
filter isNotNull(aws.region)을 사용하여 AWS 생성 레코드로 범위를 지정합니다.
관계 유형
AWS 엔터티는 다음 관계 유형을 사용합니다:
is_attached_to- 전용 연결(예: 볼륨에서 인스턴스로)uses- 종속 관계(예: 인스턴스가 보안 그룹 사용)runs_on- 수직 관계(예: 인스턴스가 AZ에서 실행)is_part_of- 구성(예: 클러스터의 인스턴스)belongs_to- 집계(예: 서비스가 클러스터에 속함)balances- 로드 밸런싱(예: 대상 그룹이 인스턴스의 부하를 분산)balanced_by- 역 로드 밸런싱 관계(예: 로드 밸런서가 대상 그룹에 의해 부하 분산됨)
AWS 메트릭 키 명명 규칙
Dynatrace는 AWS CloudWatch 메트릭을 다음 패턴을 사용하여 수집합니다:
cloud.aws.<service>.<MetricName>.By.<DimensionName>
<service>는 소문자 AWS 서비스 이름이고, <MetricName>은 CloudWatch 메트릭 이름(대소문자 유지)이며, <DimensionName>은 CloudWatch 차원입니다.
예시: cloud.aws.ec2.CPUUtilization.By.InstanceId, cloud.aws.lambda.Invocations.By.FunctionName, cloud.aws.rds.CPUUtilization.By.DBInstanceIdentifier
이러한 메트릭에는 fetch가 아닌 timeseries를 사용하세요. 엔터티별로 분할하려면 dt.smartscape_source.id로 그룹화하세요.
→ 서비스별 전체 메트릭 카탈로그와 DQL 쿼리 템플릿은 references/metrics-performance.md를 참조하세요.
주요 워크플로우
1. AWS 리소스 검색
유형별로 모든 AWS 리소스 가져오기:
smartscapeNodes "AWS_*"
| summarize count = count(), by: {type}
| sort count desc
계정 및 리전별 필터링:
smartscapeNodes "AWS_*"
| filter aws.account.id == "123456789012" and aws.region == "us-east-1"
| fields type, name, aws.resource.id
태그를 사용한 필터링:
smartscapeNodes "AWS_*"
| filter tags[Environment] == "production"
| summarize count = count(), by: {type, aws.region}
→ 전체 리소스 인벤토리 패턴은 references/resource-management.md를 참조하세요.
2. VPC 네트워킹 분석
모든 VPC 나열:
smartscapeNodes "AWS_EC2_VPC"
| fields name, aws.account.id, aws.region, aws.vpc.id
VPC에서 리소스 찾기:
smartscapeNodes "AWS_*"
| filter aws.vpc.id == "vpc-0be61db7c5d2d1bd1"
| summarize resource_count = count(), by: {type, aws.subnet.id}
| sort resource_count desc
보안 그룹 사용량 분석:
smartscapeNodes "AWS_EC2_INSTANCE"
| filter contains(aws.security_group.id, "sg-abc123")
| fields name, aws.resource.id, aws.vpc.id, aws.subnet.id
→ VPC 네트워킹은 references/vpc-networking-security.md를 참조하세요. → 보안 그룹 패턴은 references/security-compliance.md를 참조하세요.
3. 데이터베이스 모니터링
모든 RDS 인스턴스 나열:
smartscapeNodes "AWS_RDS_DBINSTANCE"
| fields name, aws.account.id, aws.region, aws.vpc.id, aws.availability_zone
Multi-AZ 데이터베이스 찾기:
smartscapeNodes "AWS_RDS_DBINSTANCE"
| parse aws.object, "JSON:awsjson"
| fieldsAdd multiAZ = awsjson[configuration][multiAZ]
| filter multiAZ == true
| fields name, aws.resource.id, aws.region
엔진 유형별 그룹화:
smartscapeNodes "AWS_RDS_DBINSTANCE"
| parse aws.object, "JSON:awsjson"
| fieldsAdd engine = awsjson[configuration][engine]
| summarize db_count = count(), by: {engine, aws.region}
| sort db_count desc
→ 데이터베이스 모니터링은 references/database-monitoring.md를 참조하세요.
4. 서버리스 및 컨테이너 워크로드
Lambda 함수 나열:
smartscapeNodes "AWS_LAMBDA_FUNCTION"
| fields name, aws.account.id, aws.region, aws.vpc.id
클러스터에서 ECS 서비스 찾기:
smartscapeNodes "AWS_ECS_SERVICE"
| traverse "belongs_to", "AWS_ECS_CLUSTER"
| fields name, aws.resource.id, aws.region
EKS 클러스터 나열:
smartscapeNodes "AWS_EKS_CLUSTER"
| fields name, aws.account.id, aws.region, aws.vpc.id
→ 서버리스는 references/serverless-containers.md를 참조하세요. → 컨테이너는 references/serverless-containers.md를 참조하세요.
5. 로드 밸런서 토폴로지
로드 밸런서에서 인스턴스까지의 전체 매핑:
smartscapeNodes "AWS_ELASTICLOADBALANCINGV2_LOADBALANCER"
| parse aws.object, "JSON:awsjson"
| fieldsAdd dnsName = awsjson[configuration][dnsName], scheme = awsjson[configuration][scheme]
| filter scheme == "internet-facing"
| traverse "balanced_by", "AWS_ELASTICLOADBALANCINGV2_TARGETGROUP", direction:backward, fieldsKeep:{dnsName, id}
| fieldsAdd targetGroupName = aws.resource.name
| traverse "balances", "AWS_EC2_INSTANCE", fieldsKeep: {targetGroupName, id}
| fieldsAdd loadBalancerDnsName = dt.traverse.history[-2][dnsName],
loadBalancerId = dt.traverse.history[-2][id],
targetGroupId = dt.traverse.history[-1][id]
→ 로드 밸런싱은 references/load-balancing-api.md를 참조하세요.
6. 비용 최적화
연결되지 않은 EBS 볼륨 찾기:
smartscapeNodes "AWS_EC2_VOLUME"
| parse aws.object, "JSON:awsjson"
| fieldsAdd state = awsjson[configuration][state]
| filter state == "available"
| fields name, aws.resource.id, aws.availability_zone, aws.account.id
유형별 EBS 비용 분석:
smartscapeNodes "AWS_EC2_VOLUME"
| parse aws.object, "JSON:awsjson"
| fieldsAdd volumeType = awsjson[configuration][volumeType],
size = awsjson[configuration][size],
state = awsjson[configuration][state]
| summarize total_volumes = count(), total_size_gb = sum(size), by: {volumeType, state}
| sort total_size_gb desc
→ 비용 최적화는 references/cost-optimization.md를 참조하세요.
7. 보안 및 규정 준수
공개적으로 액세스 가능한 데이터베이스 찾기:
smartscapeNodes "AWS_RDS_DBINSTANCE"
| parse aws.object, "JSON:awsjson"
| fieldsAdd publiclyAccessible = awsjson[configuration][publiclyAccessible]
| filter publiclyAccessible == true
| fields name, aws.resource.id, aws.vpc.id, aws.account.id
보안 그룹 영향 범위:
smartscapeNodes "AWS_EC2_INSTANCE"
| traverse "uses", "AWS_EC2_SECURITYGROUP"
| summarize instance_count = count(), by: {aws.resource.name, aws.vpc.id}
| sort instance_count desc
| limit 20
→ 보안은 references/security-compliance.md를 참조하세요.
8. 리소스 소유권 및 태깅
태그가 없는 리소스 찾기:
smartscapeNodes "AWS_*"
| filter isNull(tags)
| fields type, name, aws.resource.id, aws.account.id, aws.region
비용 센터별 비용 할당:
smartscapeNodes "AWS_*"
| filter isNotNull(tags[CostCenter])
| summarize resource_count = count(), by: {tags[CostCenter], type}
| sort resource_count desc
→ 리소스 소유권은 references/resource-ownership.md를 참조하세요.
일반적인 쿼리 패턴
| 패턴 | 템플릿 |
|---|---|
| 검색 | smartscapeNodes "AWS_*" | fieldsAdd <attrs> | filter <cond> | summarize <agg> |
| 구성 파싱 | smartscapeNodes "AWS_<T>" | parse aws.object, "JSON:awsjson" | fieldsAdd f = awsjson[configuration][field] |
| 트래버설 | smartscapeNodes "AWS_<SRC>" | traverse "<rel>", "AWS_<TGT>" |
| 다중 유형 | smartscapeNodes "AWS_T1", "AWS_T2" | filter <cond> | summarize count(), by: {type} |
모범 사례
쿼리 최적화
- 계정 및 리전별로 일찍 필터링하세요.
- 특정 엔터티 유형을 사용하세요(가능하면
"AWS_*"와일드카드 사용을 피하세요). - 탐색 시
| limit N으로 결과를 제한하세요. - 중첩 필드에 액세스하기 전에
isNotNull()검사를 사용하세요.
구성 파싱
- 항상 JSON 파서로
aws.object를 파싱하세요:parse aws.object, "JSON:awsjson" - 일관된 필드 이름 지정 사용:
fieldsAdd configField = awsjson[configuration][field] - 파싱 후 null 값이 있는지 확인하세요.
- 복잡한 중첩 객체에는
toString()을 사용하세요.
보안 필드
- 보안 그룹 ID는 배열입니다 -
contains()또는expand를 사용하세요. - 자세한 보안 컨텍스트를 위해
aws.object를 파싱하세요. publiclyAccessible,storageEncrypted및 유사한 플래그를 확인하세요.- IAM 역할 가정을 검증하세요.
태깅 전략
- 특정 태그 값으로 필터링하려면
tags[TagName]을 사용하세요. tags는 JSON 객체이며 배열이 아닙니다 — 태그가 없는 리소스에는isNull(tags)를 사용하고, 절대arraySize(tags)를 사용하지 마세요.- 특정 태그가 누락된 리소스를 찾으려면
isNull(tags[TagName])을 사용하세요. - 일관된 태그 명명 규칙을 구현하세요.
- summarize 연산으로 태그 적용 범위를 추적하세요.
제한 사항 및 참고 사항
Smartscape 제한 사항
- AWS 객체 구성을 파싱하려면
parse aws.object, "JSON:awsjson"이 필요합니다. - AWS 메트릭은
cloud.aws.*명명 규칙을 사용하여 Dynatrace 메트릭으로 사용할 수 있습니다(AWS 메트릭 명명 규칙 참조). - 리소스 검색은 AWS 통합 구성에 따라 달라집니다.
- 태그 동기화에 약간의 지연이 있을 수 있습니다.
관계 트래버설
- 역방향 관계(예: 대상 그룹 → 로드 밸런서)에는
direction:backward를 사용하세요. - 트래버설을 통해 중요한 필드를 유지하려면
fieldsKeep를 사용하세요. dt.traverse.history[-N]으로 트래버설 기록에 액세스하세요.- 복잡한 토폴로지에는 여러 번의 트래버설 작업이 필요할 수 있습니다.
일반 팁
- 사람이 읽을 수 있는 리소스 이름에는
getNodeName()을 사용하세요. isNotNull()및isNull()로 null 값을 적절히 처리하세요.- 대규모 환경의 경우 리전 및 계정 필터를 결합하세요.
- 고유 리소스 수를 계산하려면
countDistinct()를 사용하세요.
참조를 로드해야 하는 경우
이 기술은 점진적 공개를 사용합니다. 80%의 사용 사례는 여기서 시작하세요. 세부 사양이 필요한 경우 참조 파일을 로드하세요.
vpc-networking-security.md 로드 시기:
- VPC 토폴로지 및 연결성 분석
- 보안 그룹 구성 조사
- 보안 그룹별 리소스 찾기
- 네트워크 인터페이스 문제 해결
database-monitoring.md 로드 시기:
- RDS 인스턴스 및 클러스터 관리
- 데이터베이스 엔진 분포 분석
- Multi-AZ 구성 확인
- 캐시 클러스터 모니터링
serverless-containers.md 로드 시기:
- Lambda 함수 작업
- ECS/EKS 배포 분석
- 컨테이너 네트워킹 조사
- 서버리스 마이그레이션 계획
load-balancing-api.md 로드 시기:
- 로드 밸런서 토폴로지 매핑
- 대상 그룹 상태 분석
- API Gateway 작업
- CloudFront 구성
messaging-event-streaming.md 로드 시기:
- SQS 큐 및 SNS 주제 관리
- EventBridge 이벤트 버스 분석
- Kinesis 또는 MSK 작업
- Step Functions 모니터링
resource-management.md 로드 시기:
- 리소스 감사 수행
- 태그 규정 준수 분석
- 연결되지 않은 리소스 찾기
- 리전별 분포 계획
cost-optimization.md 로드 시기:
- 비용 절감 기회 식별
- 스토리지 비용 분석
- 사용되지 않는 리소스 찾기
- 인스턴스 유형 최적화
capacity-planning.md 로드 시기:
- 용량 확장 계획
- 리소스 사용률 분석
- 서브넷 IP 사용량 모니터링
- 크기 조정