AWS クラウド インフラストラクチャ
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リソースネーム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} |
ベストプラクティス
クエリ最適化
- アカウントとリージョンで早期にフィルタリングする
- 具体的なエンティティタイプを使用する (可能な場合は
"AWS_*"ワイルドカードを避ける) - 探索時には
| limit Nで結果を制限する - ネストされたフィールドにアクセスする前に
isNotNull()チェックを使用する
設定解析
- 常に
aws.objectをJSONパーサーで解析する:parse aws.object, "JSON:awsjson" - 一貫したフィールド命名を使用する:
fieldsAdd configField = awsjson[configuration][field] - 解析後にヌル値をチェックする
- 複雑なネストされたオブジェクトには
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()でヌル値を適切に処理する- 大規模な環境ではリージョンとアカウントのフィルターを組み合わせる
- 一意のリソース数には
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使用量を監視する場合
- サイジングを行う場合