Community연구 & 데이터 분석github.com

Aws Cloud Infrastructure

Dynatrace Smartscape와 DQL을 사용하여 AWS 리소스를 모니터링하고 분석합니다. AWS 서비스를 쿼리하고, 비용을 최적화하며, 보안을 관리하고, AWS 인프라 전반에 걸쳐 용량을 계획할 수 있습니다.

Aws Cloud Infrastructure란 무엇인가요?

이 기술은 Dynatrace의 Smartscape 및 DQL(Dynatrace Query Language)을 활용하여 AWS 클라우드 인프라를 포괄적으로 모니터링하고 분석하는 AI 에이전트 기술입니다. 주로 Claude Code, Cursor, Codex와 같은 AI 에이전트 플랫폼에서 사용하도록 설계되었으며, 사용자가 자연어로 AWS 리소스 관련 질문을 하면 기술이 적절한 DQL 쿼리를 생성하여 실행함으로써 인벤토리 조회, 네트워크 분석, 비용 최적화, 보안 및 규정 준수 검사, 용량 계획 등 다양한 작업을 수행할 수 있습니다. 이 기술은 Dynatrace가 자동으로 검색하고 모델링한 AWS 엔터티(EC2, RDS, Lambda, VPC 등)를 기반으로 하며, AWS CloudWatch 메트릭을 `cloud.aws.*` 네이밍 규칙을 통해 조회합니다. 핵심 워크플로우로는 리소스 검색, VPC 네트워킹 분석, 데이터베이스 모니터링, 서버리스/컨테이너 워크로드 분석, 로드 밸런서 토폴로지 매핑, 비용 최적화, 보안 및 규정 준수 검사, 리소스 소유권 및 태깅 분석 등을 제공하며, 점진적 공개(progressive disclosure) 방식을 채택하여 필요한 경우 상세 참조 파일을 로드할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add Dynatrace/dynatrace-for-ai

Installed? Explore more 연구 & 데이터 분석 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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 Name
  • aws.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}

모범 사례

쿼리 최적화

  1. 계정 및 리전별로 일찍 필터링하세요.
  2. 특정 엔터티 유형을 사용하세요(가능하면 "AWS_*" 와일드카드 사용을 피하세요).
  3. 탐색 시 | limit N으로 결과를 제한하세요.
  4. 중첩 필드에 액세스하기 전에 isNotNull() 검사를 사용하세요.

구성 파싱

  1. 항상 JSON 파서로 aws.object를 파싱하세요: parse aws.object, "JSON:awsjson"
  2. 일관된 필드 이름 지정 사용: fieldsAdd configField = awsjson[configuration][field]
  3. 파싱 후 null 값이 있는지 확인하세요.
  4. 복잡한 중첩 객체에는 toString()을 사용하세요.

보안 필드

  1. 보안 그룹 ID는 배열입니다 - contains() 또는 expand를 사용하세요.
  2. 자세한 보안 컨텍스트를 위해 aws.object를 파싱하세요.
  3. publiclyAccessible, storageEncrypted 및 유사한 플래그를 확인하세요.
  4. IAM 역할 가정을 검증하세요.

태깅 전략

  1. 특정 태그 값으로 필터링하려면 tags[TagName]을 사용하세요.
  2. tags는 JSON 객체이며 배열이 아닙니다 — 태그가 없는 리소스에는 isNull(tags)를 사용하고, 절대 arraySize(tags)를 사용하지 마세요.
  3. 특정 태그가 누락된 리소스를 찾으려면 isNull(tags[TagName])을 사용하세요.
  4. 일관된 태그 명명 규칙을 구현하세요.
  5. 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 사용량 모니터링
  • 크기 조정

관련 스킬