AWS CLI Queryコマンド完全ガイド:実践で使える15の基本テクニック

AWS CLI Queryコマンドとは

AWS CLIのクエリ機能の基本概念と重要性

AWS Command Line Interface (AWS CLI) は、AWSリソースを管理するための強力なコマンドラインツールです。その中でも--queryオプションは、コマンド実行結果から必要な情報だけを抽出できる非常に重要な機能です。

クエリ機能の基本概念

AWS CLIのクエリ機能は、JMESPath(JavaScript Message Path)というJSON検索言語を使用しています。この機能により、以下のような操作が可能になります:

  • JSON形式の出力から特定のフィールドを抽出
  • 条件に基づいたフィルタリング
  • 出力結果の整形や並び替え
  • 複雑なデータ構造の操作

例えば、以下のようなEC2インスタンスの一覧を取得するコマンドを考えてみましょう:

# クエリなしの場合(すべての情報が出力される)
aws ec2 describe-instances

# クエリを使用した場合(必要な情報のみを抽出)
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value|[0]]' \
  --output table

クエリ機能の重要性

  1. データの可視性向上
  • 必要な情報のみを抽出することで、重要なデータが一目で把握可能
  • 大量のJSON出力から必要な情報をピンポイントで取得
  1. 自動化・スクリプティングの効率化
  • スクリプト内でAWS CLIを使用する際、結果の解析が容易に
  • パイプラインでの処理が簡素化
  1. 運用効率の向上
  • 複雑なAWS環境での情報収集が効率化
  • 定期的なリソース監視やメンテナンス作業の効率化

–queryオプションが解決する3つの課題

1. 情報過多の解消

課題:AWS CLIの出力は情報量が多く、必要な情報を見つけるのが困難

解決方法

# インスタンスIDとステータスのみを抽出
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name]' \
  --output table

2. データ形式の統一化

課題:異なるコマンドからの出力形式が統一されていない

解決方法

# S3バケットの名前と作成日時を一貫した形式で出力
aws s3api list-buckets \
  --query 'Buckets[*].[Name,CreationDate]' \
  --output table

3. 条件付きフィルタリングの実現

課題:特定の条件に合致するリソースのみを抽出したい

解決方法

# 特定のタグが付いているEC2インスタンスのみを抽出
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?Tags[?Key==`Environment` && Value==`Production`]].[InstanceId,State.Name]' \
  --output table

このように、--queryオプションを使用することで、AWS CLIの出力を効率的に処理し、必要な情報のみを簡単に抽出することができます。次のセクションでは、より詳細なクエリの文法と使用方法について説明していきます。

AWS CLI Queryの基本文法マスター

JMESPathの基本構文と使い方

AWS CLIのクエリ機能で使用されるJMESPathは、JSONデータから必要な情報を抽出するための強力な検索言語です。以下に主要な構文要素と具体的な使用例を説明します。

1. 基本的なフィールド参照

# 単一フィールドの参照
aws s3api list-buckets --query 'Buckets[*].Name'

# ネストされたフィールドの参照
aws ec2 describe-instances --query 'Reservations[*].Instances[*].InstanceId'

2. インデックスと配列操作

# 特定のインデックスの要素を取得
aws ec2 describe-instances --query 'Reservations[0].Instances[0].InstanceId'

# スライス構文の使用
aws ec2 describe-instances --query 'Reservations[0:2].Instances[*].InstanceId'

3. 複数フィールドの同時取得

# 複数のフィールドを配列として取得
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,State.Name]'

# 複数のフィールドをオブジェクトとして取得
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].{ID:InstanceId,Type:InstanceType,State:State.Name}'

よく使う演算子とフィルター表現

1. フィルター演算子

比較演算子の使用

# 等価比較
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`running`].InstanceId'

# 数値比較
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?BlockDeviceMappings[0].Ebs.Size>`100`].InstanceId'

論理演算子の使用

# AND条件
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`running` && InstanceType==`t2.micro`].InstanceId'

# OR条件
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`running` || State.Name==`stopped`].InstanceId'

2. 関数とパイプ演算子

# length()関数の使用
aws ec2 describe-security-groups \
  --query 'SecurityGroups[?length(IpPermissions)>`5`].GroupName'

# sort_by()関数の使用
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*] | sort_by(@, &LaunchTime)'

実践的なクエリ例と解説

1. タグベースの検索と情報抽出

# 特定のタグを持つインスタンスの詳細情報を取得
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?Tags[?Key==`Environment` && Value==`Production`]].\
  {
    InstanceId: InstanceId,
    Type: InstanceType,
    State: State.Name,
    Name: Tags[?Key==`Name`].Value | [0]
  }'

2. 複数条件での絞り込みと整形

# 複数の条件を組み合わせた高度なフィルタリング
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`running` && contains(InstanceType, `t2`)].\
  {
    ID: InstanceId,
    Type: InstanceType,
    AZ: Placement.AvailabilityZone,
    PrivateIP: PrivateIpAddress,
    PublicIP: PublicIpAddress || `N/A`
  }'

3. データの集計と変換

# セキュリティグループのルール数を集計
aws ec2 describe-security-groups \
  --query 'SecurityGroups[].\
  {
    GroupName: GroupName,
    InboundRules: length(IpPermissions),
    OutboundRules: length(IpPermissionsEgress)
  }'

これらのクエリパターンを組み合わせることで、複雑なデータ抽出や変換も実現可能です。次のセクションでは、これらの基本文法を活用した具体的なユースケースについて説明していきます。

15の実践的なAWS CLIクエリテクニック

EC2インスタンス情報の効率的な抽出方法

1. インスタンスの詳細情報一覧作成

# インスタンスの重要情報をテーブル形式で出力
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    Name: Tags[?Key==`Name`].Value | [0],
    Type: InstanceType,
    State: State.Name,
    PrivateIP: PrivateIpAddress,
    PublicIP: PublicIpAddress || `N/A`,
    AZ: Placement.AvailabilityZone
  }' \
  --output table

2. 特定条件のインスタンス検索

# 停止中のt2/t3インスタンスを検索
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`stopped` && 
    contains(InstanceType, `t2`) || contains(InstanceType, `t3`)].{
    ID: InstanceId,
    Type: InstanceType,
    StopTime: StateTransitionReason
  }'

3. リソースタグベースの分析

# 環境別のインスタンス数集計
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].Tags[?Key==`Environment`].Value' \
  | sort | uniq -c

S3バケット管理に役立つクエリ技

4. バケットのサイズと最終更新日

# 各バケットの詳細情報を取得
aws s3api list-buckets \
  --query 'Buckets[*].{
    Name: Name,
    Created: CreationDate,
    Region: join(``, [`aws s3api get-bucket-location --bucket `, Name, 
      ` --query Location --output text`]) | @sh
  }'

5. 特定パターンのオブジェクト検索

# プレフィックスとサイズによるフィルタリング
aws s3api list-objects-v2 \
  --bucket my-bucket \
  --prefix "logs/" \
  --query 'Contents[?Size>`1048576`].{
    Key: Key,
    Size: Size,
    LastModified: LastModified
  }'

6. バージョニング状態の確認

# 全バケットのバージョニング状態を確認
aws s3api list-buckets \
  --query 'Buckets[*].Name' \
  --output text | xargs -I {} aws s3api get-bucket-versioning \
  --bucket {} --query '{Bucket: `{}`, Status: Status}'

IAMユーザー管理のための必須クエリ

7. アクセスキーの有効期限管理

# 90日以上経過したアクセスキーを検出
aws iam list-users \
  --query 'Users[*].{
    UserName: UserName,
    AccessKeys: UserName | [join(``, [`aws iam list-access-keys --user-name `, @])] | @sh
  }' \
  --output text | while read user keys; do
    eval "aws iam $keys \
      --query 'AccessKeyMetadata[?DateCreated<=\`$(date -d '90 days ago' -u +%Y-%m-%dT%H:%M:%SZ)\`].{
        User: UserName,
        KeyID: AccessKeyId,
        Created: DateCreated
      }'"
done

8. 未使用の認証情報の特定

# 90日以上使用されていないIAMユーザーを検出
aws iam list-users \
  --query 'Users[?PasswordLastUsed<=`'$(date -d '90 days ago' -Iseconds)'`].{
    UserName: UserName,
    Created: CreateDate,
    LastUsed: PasswordLastUsed
  }'

9. ポリシーの権限分析

# 特定の権限を持つポリシーを検索
aws iam list-policies \
  --query 'Policies[*].{
    Name: PolicyName,
    Arn: Arn,
    Details: Arn | [join(``, [`aws iam get-policy-version --policy-arn `, @, 
      ` --version-id v1`])] | @sh
  }' \
  --output text | while read name arn details; do
    eval "$details" | jq -r 'select(.Document.Statement[].Action | 
      contains("s3:*"))'
done

CloudWatchログの高度な検索テクニック

10. ログストリームのフィルタリング

# 特定のパターンを含むログストリームを検索
aws logs describe-log-streams \
  --log-group-name /aws/lambda/my-function \
  --query 'logStreams[?contains(logStreamName, `ERROR`)].{
    Stream: logStreamName,
    FirstEvent: firstEventTimestamp,
    LastEvent: lastEventTimestamp
  }'

11. エラーログの抽出

# 直近のエラーログを取得
aws logs filter-log-events \
  --log-group-name /aws/lambda/my-function \
  --filter-pattern "ERROR" \
  --query 'events[*].{
    Timestamp: timestamp,
    Message: message
  }'

12. メトリクス統計の取得

# 特定期間のメトリクス統計を取得
aws cloudwatch get-metric-statistics \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
  --start-time $(date -d '24 hours ago' -u +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 3600 \
  --statistics Average Maximum \
  --query 'Datapoints[*].{
    Time: Timestamp,
    Avg: Average,
    Max: Maximum
  }'

複数リージョンを横断したリソース検索

13. リージョン横断インスタンス検索

# 全リージョンの特定タグを持つインスタンスを検索
aws ec2 describe-regions \
  --query 'Regions[*].RegionName' \
  --output text | xargs -I {} aws ec2 describe-instances \
  --region {} \
  --query 'Reservations[*].Instances[?Tags[?Key==`Environment` && 
    Value==`Production`]].{
    Region: `{}`,
    ID: InstanceId,
    Type: InstanceType,
    State: State.Name
  }'

14. グローバルリソースの監査

# IAMユーザーの認証情報を全リージョンで確認
aws iam list-users \
  --query 'Users[*].{
    UserName: UserName,
    AccessKeys: UserName | [join(``, [`aws iam list-access-keys --user-name `, @])] | @sh,
    MFADevices: UserName | [join(``, [`aws iam list-mfa-devices --user-name `, @])] | @sh
  }' \
  --output text | while read user keys devices; do
    echo "User: $user"
    eval "$keys"
    eval "$devices"
done

15. クロスリージョンバックアップの確認

# 全リージョンのスナップショット一覧を取得
aws ec2 describe-regions \
  --query 'Regions[*].RegionName' \
  --output text | xargs -I {} aws ec2 describe-snapshots \
  --region {} \
  --owner-ids self \
  --query 'Snapshots[*].{
    Region: `{}`,
    ID: SnapshotId,
    Volume: VolumeId,
    Size: VolumeSize,
    State: State,
    Progress: Progress
  }'

これらのクエリテクニックを組み合わせることで、より効率的なAWS環境の管理が可能になります。次のセクションでは、これらのクエリを使用する際のトラブルシューティングについて説明していきます。

AWS CLIクエリのトラブルシューティング

よくあるエラーと解決方法

1. 構文エラー

エラーメッセージ例:

Invalid jmespath expression: Incomplete expression

主な原因と解決方法:

  1. 括弧の不一致
# 誤った例(括弧が閉じていない)
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{ID:InstanceId'

# 正しい例
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{ID:InstanceId}'
  1. クォートの使い方
# 誤った例(クォートの使い方が不適切)
aws ec2 describe-instances --query "Reservations[*].Instances[?State.Name=='running']"

# 正しい例(文字列比較には`バッククォート`を使用)
aws ec2 describe-instances --query 'Reservations[*].Instances[?State.Name==`running`]'
  1. パイプ演算子の誤用
# 誤った例(パイプの後のスペースが不足)
aws ec2 describe-instances --query 'Reservations[*]|[0]'

# 正しい例
aws ec2 describe-instances --query 'Reservations[*] | [0]'

2. 参照エラー

エラーメッセージ例:

Invalid jmespath expression: Unknown function: contains()

主な原因と解決方法:

  1. 存在しないフィールドの参照
# エラーとなる例(存在しないフィールド)
aws ec2 describe-instances --query 'Reservations[*].Instances[*].nonexistentField'

# 解決方法(オプショナルチェーンを使用)
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{
  ID: InstanceId,
  Tag: Tags[?Key==`Name`].Value | [0] || `NoTag`
}'
  1. 配列インデックスの範囲外
# エラーとなる例
aws ec2 describe-instances --query 'Reservations[5].Instances[*]'

# 解決方法(存在チェックを追加)
aws ec2 describe-instances --query 'Reservations[*].Instances[*] | [0:5]'

クエリ結果が期待通りでない場合の対処法

1. デバッグ手法

  1. 段階的なクエリの分解
# 複雑なクエリを段階的に実行
# ステップ1: 基本構造の確認
aws ec2 describe-instances --query 'Reservations'

# ステップ2: 中間層の確認
aws ec2 describe-instances --query 'Reservations[*].Instances'

# ステップ3: 最終的なフィルタリング
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{
  ID: InstanceId,
  State: State.Name
}'
  1. 出力形式の変更によるデバッグ
# テキスト形式での確認
aws ec2 describe-instances --query 'Reservations[*].Instances[*]' --output text

# テーブル形式での確認
aws ec2 describe-instances --query 'Reservations[*].Instances[*]' --output table

# JSON形式での確認
aws ec2 describe-instances --query 'Reservations[*].Instances[*]' --output json

2. 一般的な問題と解決策

  1. フィルタリングが機能しない
# 問題のある例(大文字小文字の区別)
aws ec2 describe-instances --query 'Reservations[*].Instances[?State.Name==`Running`]'

# 正しい例(正確な値を使用)
aws ec2 describe-instances --query 'Reservations[*].Instances[?State.Name==`running`]'
  1. NULL値の処理
# NULLを考慮したクエリ
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    PublicIP: PublicIpAddress || `N/A`,
    Tags: Tags || `[]`
  }'
  1. 配列操作の改善
# 配列の最初の要素を安全に取得
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    Name: Tags[?Key==`Name`].Value | [0] || `Unnamed`,
    Type: InstanceType
  }'

3. パフォーマンス改善のヒント

  1. 必要最小限のデータ取得
# 良い例(必要なフィールドのみを指定)
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name]'
  1. 効率的なフィルタリング
# フィルタオプションとクエリの組み合わせ
aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    Type: InstanceType
  }'

これらのトラブルシューティング手法を理解し、適切に適用することで、AWS CLIクエリの問題を効率的に解決できます。次のセクションでは、より効果的なクエリ設計のためのベストプラクティスについて説明していきます。

AWS CLIクエリのベストプラクティス

パフォーマンスを考慮したクエリ設計

1. データ取得の最適化

フィルタリングの効率化

# 非効率な例(クライアントサイドでのフィルタリング)
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`running`]'

# 効率的な例(サーバーサイドでのフィルタリング)
aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --query 'Reservations[*].Instances[*]'

2. クエリの最適化テクニック

  1. 必要なフィールドのみを取得
# 最適化されたクエリ例
aws ec2 describe-instances \
  --filters "Name=tag:Environment,Values=production" \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    Type: InstanceType,
    State: State.Name
  }'
  1. ページネーションの活用
# 大量のデータを効率的に処理
aws s3api list-objects-v2 \
  --bucket my-bucket \
  --max-items 100 \
  --query 'Contents[*].{
    Key: Key,
    Size: Size
  }' \
  --starting-token $NEXT_TOKEN
  1. キャッシュの活用
# シェル変数でキャッシュを実装
cache_file="/tmp/aws-cli-cache"
if [ ! -f "$cache_file" ] || [ $(( $(date +%s) - $(stat -f %m "$cache_file") )) -gt 300 ]; then
  aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
      ID: InstanceId,
      Type: InstanceType
    }' > "$cache_file"
fi
cat "$cache_file"

セキュリティを考慮したクエリ実行のポイント

1. アクセス制御の最適化

最小権限の原則の適用

# IAMポリシーの例
{
  "Version": "2012-10-01",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeTags"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "ap-northeast-1"
        }
      }
    }
  ]
}

2. セキュアなクエリ実行

  1. 機密情報の取り扱い
# 機密情報を含むフィールドのマスキング
aws iam list-access-keys \
  --query 'AccessKeyMetadata[*].{
    UserName: UserName,
    KeyID: AccessKeyId,
    Created: CreateDate,
    Status: Status
  }'
  1. 出力のサニタイズ
# 安全な出力処理
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    Tags: Tags[*].{
      Key: Key,
      Value: Value || `[MASKED]`
    }
  }' \
  --output json | jq 'del(.[][] | select(.Tags[].Key == "Password"))'

自動化スクリプトでの活用方法

1. シェルスクリプトでの活用

#!/bin/bash

# 関数定義
get_instance_info() {
  local environment=$1
  aws ec2 describe-instances \
    --filters "Name=tag:Environment,Values=$environment" \
    --query 'Reservations[*].Instances[*].{
      ID: InstanceId,
      Name: Tags[?Key==`Name`].Value | [0],
      Type: InstanceType,
      State: State.Name
    }'
}

# エラーハンドリング
handle_error() {
  local exit_code=$?
  echo "Error: Command failed with exit code $exit_code" >&2
  exit $exit_code
}

# メイン処理
main() {
  trap handle_error ERR

  # 環境ごとのインスタンス情報を取得
  for env in "production" "staging" "development"; do
    echo "Checking $env environment..."
    get_instance_info "$env" --output table
  done
}

main "$@"

2. 定期実行タスクの実装

#!/bin/bash

# 監視スクリプトの例
ALERT_THRESHOLD=80  # CPU使用率のしきい値(%)

# CloudWatchメトリクスの取得と分析
check_instance_metrics() {
  aws cloudwatch get-metric-statistics \
    --namespace AWS/EC2 \
    --metric-name CPUUtilization \
    --dimensions Name=InstanceId,Value=$1 \
    --start-time $(date -d '1 hour ago' -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --statistics Average \
    --query 'Datapoints[*].{
      Time: Timestamp,
      CPU: Average
    }' \
    --output json | jq -r '.[] | select(.CPU >= '$ALERT_THRESHOLD')'
}

# インスタンス一覧の取得
instances=$(aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --query 'Reservations[*].Instances[*].{
    ID: InstanceId,
    Name: Tags[?Key==`Name`].Value | [0]
  }' \
  --output json)

# 各インスタンスのメトリクスをチェック
echo "$instances" | jq -r '.[][] | .ID' | while read -r instance_id; do
  result=$(check_instance_metrics "$instance_id")
  if [ ! -z "$result" ]; then
    echo "Alert: High CPU usage detected for instance $instance_id"
    echo "$result"
  fi
done

3. CI/CDパイプラインでの活用

#!/bin/bash

# デプロイ前のリソースチェック
check_resources() {
  # ECSクラスターのキャパシティチェック
  cluster_capacity=$(aws ecs describe-clusters \
    --clusters production-cluster \
    --query 'clusters[*].{
      Name: clusterName,
      RegisteredInstances: registeredContainerInstancesCount,
      PendingTasks: pendingTasksCount,
      RunningTasks: runningTasksCount
    }')

  # ALBのヘルスチェック
  target_health=$(aws elbv2 describe-target-health \
    --target-group-arn $TARGET_GROUP_ARN \
    --query 'TargetHealthDescriptions[*].{
      Target: Target.Id,
      Health: TargetHealth.State
    }')

  # 結果の評価
  if echo "$cluster_capacity" | jq -e '.[][] | select(.RegisteredInstances < 2)' > /dev/null; then
    echo "Error: Insufficient cluster capacity"
    return 1
  fi

  if echo "$target_health" | jq -e '.[] | select(.Health != "healthy")' > /dev/null; then
    echo "Error: Unhealthy targets detected"
    return 1
  fi
}

# メイン処理
if ! check_resources; then
  echo "Pre-deployment checks failed"
  exit 1
fi

echo "All checks passed, proceeding with deployment"

これらのベストプラクティスを適用することで、より効率的で安全なAWS CLI操作が実現できます。次のセクションでは、さらに発展的なクエリの活用方法について説明していきます。

発展的なAWS CLIクエリ活用法

複雑なJSONデータの操作テクニック

1. ネストされたデータの高度な操作

# ECSタスク定義の詳細な分析
aws ecs describe-task-definition \
  --task-definition my-task:1 \
  --query '{
    Family: taskDefinition.family,
    Containers: taskDefinition.containerDefinitions[*].{
      Name: name,
      Image: image,
      Memory: memory,
      CPU: cpu,
      Environment: environment[*].{
        Key: name,
        Value: value
      },
      Ports: portMappings[*].{
        Container: containerPort,
        Host: hostPort,
        Protocol: protocol
      }
    }
  }'

2. 複数サービスのデータ結合

#!/bin/bash

# EC2インスタンスとEBSボリュームの情報を結合
get_instance_storage_info() {
  # インスタンス情報の取得
  instances=$(aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
      InstanceId: InstanceId,
      Name: Tags[?Key==`Name`].Value | [0],
      Type: InstanceType,
      Volumes: BlockDeviceMappings[*].Ebs.VolumeId
    }')

  # ボリューム情報の取得と結合
  echo "$instances" | jq -r '.[][] | .Volumes[]' | while read -r volume_id; do
    volume_info=$(aws ec2 describe-volumes \
      --volume-ids "$volume_id" \
      --query 'Volumes[0].{
        VolumeId: VolumeId,
        Size: Size,
        Type: VolumeType,
        IOPS: Iops,
        State: State
      }')

    # 結果の結合
    jq -n \
      --arg vid "$volume_id" \
      --argjson inst "$instances" \
      --argjson vol "$volume_info" \
      '$inst[][] | select(.Volumes[] == $vid) * $vol'
  done
}

カスタムスクリプトとの連携方法

1. データ処理パイプラインの実装

#!/bin/bash

# AWS CLIクエリ結果の高度な処理を行う関数群
process_instance_metrics() {
  local instance_id=$1
  local start_time=$(date -d '7 days ago' -u +%Y-%m-%dT%H:%M:%SZ)
  local end_time=$(date -u +%Y-%m-%dT%H:%M:%SZ)

  # CPU使用率の取得
  local cpu_metrics=$(aws cloudwatch get-metric-statistics \
    --namespace AWS/EC2 \
    --metric-name CPUUtilization \
    --dimensions Name=InstanceId,Value=$instance_id \
    --start-time $start_time \
    --end-time $end_time \
    --period 3600 \
    --statistics Average Maximum \
    --query 'Datapoints[*].{
      Timestamp: Timestamp,
      Average: Average,
      Maximum: Maximum
    }')

  # メモリ使用率の取得
  local memory_metrics=$(aws cloudwatch get-metric-statistics \
    --namespace System/Linux \
    --metric-name MemoryUtilization \
    --dimensions Name=InstanceId,Value=$instance_id \
    --start-time $start_time \
    --end-time $end_time \
    --period 3600 \
    --statistics Average Maximum \
    --query 'Datapoints[*].{
      Timestamp: Timestamp,
      Average: Average,
      Maximum: Maximum
    }')

  # データの結合と分析
  jq -n \
    --argjson cpu "$cpu_metrics" \
    --argjson mem "$memory_metrics" \
    '{
      InstanceId: $ARGS.named.instance_id,
      Metrics: {
        CPU: $cpu,
        Memory: $mem
      },
      Analysis: {
        CPUAverage: ($cpu | map(.Average) | add / length),
        MemoryAverage: ($mem | map(.Average) | add / length),
        CPUPeaks: ($cpu | map(select(.Maximum > 80)) | length),
        MemoryPeaks: ($mem | map(select(.Maximum > 80)) | length)
      }
    }' --arg instance_id "$instance_id"
}

2. カスタムレポート生成システム

#!/bin/bash

# AWSリソースの包括的な分析レポートを生成
generate_resource_report() {
  local report_date=$(date +%Y-%m-%d)
  local report_file="aws_resource_report_${report_date}.json"

  # EC2リソース情報の取得
  local ec2_info=$(aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
      InstanceId: InstanceId,
      Type: InstanceType,
      State: State.Name,
      Platform: Platform || `Linux`,
      Tags: Tags[?Key==`Name`].Value | [0]
    }')

  # RDSリソース情報の取得
  local rds_info=$(aws rds describe-db-instances \
    --query 'DBInstances[*].{
      DBIdentifier: DBInstanceIdentifier,
      Engine: Engine,
      Class: DBInstanceClass,
      Status: DBInstanceStatus
    }')

  # ELBリソース情報の取得
  local elb_info=$(aws elbv2 describe-load-balancers \
    --query 'LoadBalancers[*].{
      Name: LoadBalancerName,
      Type: Type,
      Scheme: Scheme,
      State: State.Code
    }')

  # レポートの生成
  jq -n \
    --argjson ec2 "$ec2_info" \
    --argjson rds "$rds_info" \
    --argjson elb "$elb_info" \
    '{
      ReportDate: $ARGS.named.report_date,
      ResourceSummary: {
        EC2: {
          TotalInstances: ($ec2 | length),
          RunningInstances: ($ec2 | map(select(.State == "running")) | length),
          InstanceTypes: ($ec2 | group_by(.Type) | map({key: .[0].Type, count: length}))
        },
        RDS: {
          TotalInstances: ($rds | length),
          EngineTypes: ($rds | group_by(.Engine) | map({key: .[0].Engine, count: length}))
        },
        ELB: {
          TotalLoadBalancers: ($elb | length),
          Types: ($elb | group_by(.Type) | map({key: .[0].Type, count: length}))
        }
      },
      Details: {
        EC2: $ec2,
        RDS: $rds,
        ELB: $elb
      }
    }' --arg report_date "$report_date" > "$report_file"

  echo "レポートが生成されました: $report_file"
}

CI/CDパイプラインでの活用例

1. デプロイメント前の環境チェック

#!/bin/bash

# デプロイメント前のインフラストラクチャチェック
check_infrastructure() {
  local environment=$1
  local errors=0

  # ECSクラスターの状態チェック
  local cluster_status=$(aws ecs describe-clusters \
    --clusters "${environment}-cluster" \
    --query 'clusters[0].{
      Status: status,
      Instances: registeredContainerInstancesCount,
      Tasks: runningTasksCount
    }')

  # ALBターゲットグループのヘルスチェック
  local target_health=$(aws elbv2 describe-target-health \
    --target-group-arn "${environment}-tg-arn" \
    --query 'TargetHealthDescriptions[*].{
      Target: Target.Id,
      Health: TargetHealth.State
    }')

  # Auto Scalingグループの状態チェック
  local asg_status=$(aws autoscaling describe-auto-scaling-groups \
    --auto-scaling-group-names "${environment}-asg" \
    --query '{
      DesiredCapacity: AutoScalingGroups[0].DesiredCapacity,
      CurrentInstances: AutoScalingGroups[0].Instances[*].LifecycleState
    }')

  # 結果の評価
  if [ "$(echo "$cluster_status" | jq -r '.Status')" != "ACTIVE" ]; then
    echo "Error: ECSクラスターが非アクティブです"
    ((errors++))
  fi

  if [ "$(echo "$target_health" | jq '[.[] | select(.Health != "healthy")] | length')" -gt 0 ]; then
    echo "Error: 不健全なターゲットが存在します"
    ((errors++))
  fi

  local desired_capacity=$(echo "$asg_status" | jq -r '.DesiredCapacity')
  local current_instances=$(echo "$asg_status" | jq -r '.CurrentInstances | length')
  if [ "$current_instances" -lt "$desired_capacity" ]; then
    echo "Error: Auto Scalingグループが期待される容量に達していません"
    ((errors++))
  fi

  return $errors
}

# デプロイメントスクリプト
deploy_application() {
  local environment=$1

  echo "環境チェックを開始: $environment"
  if ! check_infrastructure "$environment"; then
    echo "Error: インフラストラクチャチェックに失敗しました"
    exit 1
  fi

  echo "デプロイメントを開始します..."
  # デプロイメントロジックをここに実装
}

# メイン処理
main() {
  local environment=${1:-"production"}
  deploy_application "$environment"
}

main "$@"

2. 継続的なインフラストラクチャ監視

#!/bin/bash

# インフラストラクチャの継続的な監視と分析
monitor_infrastructure() {
  # メトリクスの収集期間設定
  local start_time=$(date -d '1 hour ago' -u +%Y-%m-%dT%H:%M:%SZ)
  local end_time=$(date -u +%Y-%m-%dT%H:%M:%SZ)

  # ECSサービスのメトリクス収集
  local ecs_metrics=$(aws cloudwatch get-metric-statistics \
    --namespace AWS/ECS \
    --metric-name CPUUtilization \
    --dimensions Name=ClusterName,Value=production-cluster \
    --start-time "$start_time" \
    --end-time "$end_time" \
    --period 300 \
    --statistics Average Maximum \
    --query 'Datapoints[*].{
      Time: Timestamp,
      Average: Average,
      Maximum: Maximum
    }')

  # RDSインスタンスのメトリクス収集
  local rds_metrics=$(aws cloudwatch get-metric-statistics \
    --namespace AWS/RDS \
    --metric-name DatabaseConnections \
    --dimensions Name=DBInstanceIdentifier,Value=production-db \
    --start-time "$start_time" \
    --end-time "$end_time" \
    --period 300 \
    --statistics Average Maximum \
    --query 'Datapoints[*].{
      Time: Timestamp,
      Average: Average,
      Maximum: Maximum
    }')

  # メトリクスの分析と警告生成
  jq -n \
    --argjson ecs "$ecs_metrics" \
    --argjson rds "$rds_metrics" \
    '{
      Timestamp: now,
      ECSAnalysis: {
        AverageCPU: ($ecs | map(.Average) | add / length),
        MaxCPU: ($ecs | map(.Maximum) | max),
        Warnings: ($ecs | map(select(.Maximum > 80)) | length)
      },
      RDSAnalysis: {
        AverageConnections: ($rds | map(.Average) | add / length),
        MaxConnections: ($rds | map(.Maximum) | max),
        Warnings: ($rds | map(select(.Maximum > 100)) | length)
      }
    }'
}

# 監視結果に基づくアクション実行
process_monitoring_results() {
  local results=$1

  # 警告条件の評価
  local ecs_warnings=$(echo "$results" | jq -r '.ECSAnalysis.Warnings')
  local rds_warnings=$(echo "$results" | jq -r '.RDSAnalysis.Warnings')

  if [ "$ecs_warnings" -gt 0 ] || [ "$rds_warnings" -gt 0 ]; then
    # アラート通知の送信
    aws sns publish \
      --topic-arn "arn:aws:sns:region:account:alerts" \
      --message "$(echo "$results" | jq -r tostring)" \
      --subject "インフラストラクチャ警告"
  fi
}

# メイン監視ループ
main() {
  while true; do
    echo "インフラストラクチャ監視を実行中..."
    results=$(monitor_infrastructure)
    process_monitoring_results "$results"
    sleep 300  # 5分間隔で監視
  done
}

main "$@"

これらの発展的な活用例を参考に、AWS CLIクエリを活用した効率的なインフラストラクチャ管理と自動化を実現してください。各例は実際の要件に応じてカスタマイズして使用することができます。