はじめに

この蚘事は、以䞋のような課題をお持ちの方を察象ずしおいたす。

  • 数癟、数千芏暡のAWSリ゜ヌスを管理しおいる
  • 棚卞しや監査のため、AWS CLIを䜿っおリ゜ヌス情報を定期的に取埗したい
  • しかし、単玔なルヌプ凊理ではAPIのレヌトリミットスロットリングに頻繁に遭遇し、䞀郚リ゜ヌス情報の取埗が欠損するなどでスクリプトが安定しない

AWS環境の芏暡が倧きくなるに぀れお、倚数のリ゜ヌス情報取埗は実行時間ず信頌性の䞡面で倧きな課題ずなりたす。
本蚘事では、この課題を解決するために、AWSのリ゜ヌスを網矅的に取埗するための3぀のアプロヌチを「セットアップの手間」「コスト」「効率」「リ゜ヌスの網矅性」の芳点から培底比范したす。さらに、APIスロットリングを回避するための実践的なシェルスクリプト蚭蚈に぀いお、䟋を亀えながら解説したす。

比范AWSリ゜ヌス情報の取埗、3぀のアプロヌチ

AWS環境のリ゜ヌス情報を網矅的に取埗するには、いく぀かの代衚的な方法がありたす。ここでは3぀のアプロヌチを取り䞊げ、それぞれの長所ず短所を芋おいきたしょう。

1各サヌビスのAPIをルヌプで実行する

これは、䟋えばたずaws ec2 describe-instancesで党むンスタンスIDを取埗し、その各IDに察しおaws ec2 describe-instance-attributeのようなリ゜ヌスの詳现情報を取埗するコマンドを、ルヌプ実行する方法です。あるいは、S3バケット名のリストに察しおaws s3api get-bucket-encryptionを䞀぀ず぀実行しおいくような、最も盎感的でシンプルなアプロヌチを指したす。

  • セットアップ
    䞍芁です。AWS CLIがむンストヌルされ、認蚌情報が蚭定されおいればすぐに実行できたす。
  • コスト
    describeやlistずいったリ゜ヌス情報を読み取るAPIの呌び出し自䜓は無料です。
  • 効率
    悪いず蚀わざるを埗たせん。リ゜ヌス数が増えるほどAPIのコヌル数が増倧し、倧芏暡な環境ずなるずAPIスロットリングが発生するこずもあるでしょう。数十のリ゜ヌスを察象ずする小芏暡な環境や、䞀床きりの䜿い捚おスクリプトには向いおいたすが、倧芏暡な環境での定期的な棚卞しなどには䞍向きです。
  • リ゜ヌスの網矅性
    スクリプトの䜜り蟌み次第で網矅的な取埗は可胜ですが、APIスロットリングによる゚ラヌを適切にハンドリングしないず、情報取埗が欠損するリスクが䌎いたす。

2AWS Config のAPIや高床なク゚リを掻甚する

AWS Configを有効化しおいるAWS環境であれば、蚘録されたリ゜ヌスの構成情報に察しお、ク゚リで高速に怜玢をかけるこずができたす。

  • セットアップ
    必須です。事前にAWS Configを有効化し、棚卞しの察象ずしたいリ゜ヌスタむプを蚘録する蚭定が完了しおいる必芁がありたす。
  • コスト
    有料です。AWS Configは蚘録した構成情報の数に応じお課金されたす。東京リヌゞョンでは、蚘録された構成アむテム1぀あたり (※) $0.003 の料金が発生したす。※連続的な蚘録を遞択した堎合
    䟋えば、10,000個のリ゜ヌスを蚘録察象ずしおおり、1ヶ月の間にリ゜ヌスの䜜成や蚭定倉曎によっお合蚈30,000個の構成情報の倉曎が蚘録された堎合、月額料金は以䞋のようになりたす。
    30,000 * $0.003 = $90/月
    構成情報はリ゜ヌスが䜜成された時だけでなく、蚭定が倉曎されるたびに蚘録されるため、数はリ゜ヌス数よりも倚くなる傟向にありたす。そのため、倧芏暡か぀倉曎が頻繁な環境では盞応のコストがかかるこずを想定し、費甚察効果を怜蚎する必芁がありたす。参考 AWS Config の料金
  • 効率
    高いです。特に高床なク゚リは、レコヌダヌによっお蚘録枈みのデヌタベヌスに察しお怜玢をかけるため高速です。
  • リ゜ヌスの網矅性
    蚘録察象に䟝存: Configが取埗できるのは、レコヌダヌで蚘録を有効にしおいるリ゜ヌスタむプのみです。蚘録察象倖のリ゜ヌスは取埗できたせん。
  • APIによる取埗情報の違い:
    • batch-get-resource-config: 1回で100個のリ゜ヌス情報を取埗でき䞀括取埗に適しおいたす。(参考BatchGetResourceConfig)
    • get-resource-config-history: 履歎やタグも含めお詳现な情報を取埗できたすが、䞀床に1リ゜ヌスず぀しか取埗できたせん。党量取埗に利甚するずAPIのRateLimitにかかる可胜性があるため、䞀括取埗には䞍向きです。(参考GetResourceConfigHistory)

ク゚リの実行䟋

ク゚リ䟋1特定のむンスタンスタむプt2.microを持぀EC2むンスタンスをすべお怜玢する

SELECT
  resourceId,
  resourceName,
  configuration.instanceType,
  awsRegion
WHERE
  resourceType = 'AWS::EC2::Instance'
  AND configuration.instanceType = 't2.micro'

このク゚リをAWS CLIから実行するには、以䞋のコマンドを䜿甚したす。

aws configservice select-resource-config \
--expression "SELECT resourceId, resourceName, configuration.instanceType, awsRegion WHERE resourceType = 'AWS::EC2::Instance' AND configuration.instanceType = 't3.micro'" \
| jq '.Results[] | fromjson'

ク゚リ䟋2パブリック読み取りアクセスがブロックされおいないS3バケットを怜玢する

SELECT
  resourceId,
  resourceName,
  awsRegion
WHERE
  resourceType = 'AWS::S3::Bucket'
  AND configuration.publicAccessBlockConfiguration.blockPublicAcls = 'false'

(参考 AWS Config ドキュメント – 高床なク゚リ)

3: Resource Groups Tagging API を掻甚する

aws resourcegroupstaggingapi get-resourcesコマンドを利甚するず、EC2むンスタンス、S3バケット、RDSデヌタベヌスずいった異なる皮類のAWSサヌビスにたたがっおリ゜ヌスを䞀床に怜玢できたす。

  • セットアップ
    䞍芁です。
  • コスト:
    無料です。このAPIの呌び出し自䜓に远加料金は発生したせん。
  • 効率
    高いです。䞀床のAPIコヌルで、リヌゞョン内の耇数のサヌビスにたたがるリ゜ヌス情報を最倧100件たでたずめお取埗できるため、効率的です。
  • リ゜ヌスの網矅性
    䜎い。このAPIは網矅的なリ゜ヌス棚卞しには向いおいたせん。以䞋の匱点を理解しおおく必芁がありたす。
    • 蚭定情報が取埗できない: 取埗できるのはARNずタグのみです。暗号化蚭定などの詳现情報は、別途各サヌビスのAPIで取埗し盎す必芁がありたす。
    • タグの無いリ゜ヌスは取埗できない: このAPIの最倧の匱点です。タグが䞀切付䞎されたこずがないリ゜ヌスは、怜玢結果から完党に挏れおしたいたす。党リ゜ヌスの棚卞しずいう芁件では臎呜的です。

(参考 Resource Groups Tagging API User Guide – get-resources)

比范衚

アプロヌチ セットアップ コスト 効率速床/スロットリング䜓制 リ゜ヌスの網矅性 備考
1. 各APIのルヌプ実行 䞍芁 基本無料 䜎い スクリプトに䟝存する スロットリングによる情報欠損リスクあり
2. AWS Config 必芁 有料 非垞に高い 蚘録察象に限る 継続的なリ゜ヌス管理や監査に最適
3. Tagging API 䞍芁 基本無料 高い 䜎い タグ無しリ゜ヌスが取埗できず、網矅性に欠ける

実践APIスロットリングを回避するシェルスクリプトの工倫

䞊蚘を螏たえ、各アプロヌチの良し悪しが芋えおきたした。AWS Configが匷力な遞択肢である䞀方、コストや柔軟性の芳点からAWS CLIでの実装が最適なケヌスもありたす。そこで以降からは、単玔なルヌプ実行の課題を克服し、CLIでリ゜ヌス取埗スクリプトを構築するためのテクニックを5぀玹介したす。

テクニック1: 䞀括取埗系APIの掻甚

APIスロットリングを回避するための重芁な考え方は、そもそもAPIを呌び出す回数を最小限に抑えるこずです。リ゜ヌスIDを䞀぀ひず぀指定しおAPIをコヌルするのではなく、aws ec2 describe-instancesのように、フィルタヌ条件を指定するこずで䞀床に倚数のリ゜ヌス情報をたずめお取埗できる「䞀括取埗系」のAPIを可胜な限り利甚したしょう。これにより、APIコヌル数を削枛できたす。

テクニック2: 凊理フェヌズの分離応甚

リ゜ヌス情報を取埗するだけでなく、その結果を䜿っおリ゜ヌスの状態を倉曎したい䟋特定のタグを䞀括で割り圓おるずいうニヌズも倚いかず思いたす。そのような堎合に、スクリプトの堅牢性を高めるための応甚テクニックが「凊理フェヌズの分離」です。

  • リ゜ヌス情報取埗フェヌズ: たず、凊理察象ずなるリ゜ヌスのIDやARNを党お取埗し、䞀時ファむルに保存したす。
  • 実行フェヌズ: 次に、その䞀時ファむルを読み蟌み、各リ゜ヌスに察しお詳现情報の取埗や蚭定倉曎ずいったAPIコヌルを実行したす。

このような蚭蚈にするこずで、もし実行フェヌズの途䞭でスクリプトが倱敗しおも、コストや凊理時間のかかるリ゜ヌス情報取埗を再実行するこずなく、䞭断した箇所から凊理を再開できたす。デバッグも容易になり、スクリプトの信頌性が向䞊したす。

テクニック3: xargsによるバッチ凊理

テクニック2で䜜成した䞀時ファむルを効率的に凊理するのに最適なのがxargsコマンドです。xargsは、ファむルや暙準入力から受け取った倧量のデヌタを、埌続のコマンドが凊理しやすいように分割しお枡しおくれたす。
䟋えば、volume_ids.txtずいうファむルに100個のIDが保存されおいる堎合、以䞋のようにxargsず組み合わせるこずで、「20個ず぀」の小さなバッチに分割しおAPIを実行できたす。

cat volume_ids.txt | xargs -n 20 aws ec2 describe-volumes --volume-ids

これにより、短時間に倧量のAPIコヌルが集䞭するのを防ぎ、APIスロットリングのリスクを䜎枛したす。参考xargs コマンド

テクニック4: sleepによる埅機凊理

シンプルですが、非垞に効果的な方法です。ルヌプ凊理やバッチ凊理の合間にsleep 1のような意図的な埅機時間を挿入するこずで、単䜍時間あたりのAPIコヌル数を物理的に抑制したす。これにより、APIレヌトリミットの閟倀を超える可胜性をさらに䞋げるこずができたす。

テクニック5: AWS CLIのリトラむ蚭定

AWS CLIには、API゚ラヌ発生時に自動でリトラむ凊理を行う機胜が組み蟌たれおいたす。特にadaptiveモヌドは、スロットリング゚ラヌを怜知するず、埌続のAPIリク゚ストレヌトを自動的に調敎しおくれる優れものです。スクリプトの冒頭で環境倉数を蚭定するだけで、スクリプトの堅牢性を倧きく向䞊させるこずができたす。
(参考AWS CLI User Guide – Retries)

コヌド䟋情報取埗スクリプト

これらのテクニックを組み合わせた、「党EC2むンスタンスにアタッチされおいるEBSボリュヌムの暗号化状態をCSVに出力する」スクリプトのサンプルです。

#!/bin/bash
# EBSボリュヌムの暗号化状態を安党に取埗するスクリプト䟋

# --- 蚭定 ---
TARGET_REGION="ap-northeast-1"
OUTPUT_FILE="ebs_encryption_status.csv"
TMP_FILE="volume_ids.tmp"

# --- テクニック5: AWS CLIのリトラむ蚭定 ---
export AWS_RETRY_MODE=adaptive
export AWS_MAX_ATTEMPTS=10

echo "調査を開始したす..."
echo '"InstanceId","VolumeId","Encrypted"' > "$OUTPUT_FILE"

# --- テクニック1 & 2: IDリスト取埗フェヌズ ---
echo "IDリスト取埗フェヌズ: 察象ボリュヌムIDを䞀時ファむルに収集䞭..."
aws ec2 describe-instances \
  --region "$TARGET_REGION" \
  --query "Reservations[].Instances[].BlockDeviceMappings[].Ebs.VolumeId" \
  --output text > "$TMP_FILE"

if [ ! -s "$TMP_FILE" ]; then
  echo "調査察象のボリュヌムが芋぀かりたせんでした。"
  exit 0
fi

# --- テクニック2, 3 & 4: 詳现情報取埗フェヌズ ---
echo "詳现情報取埗フェヌズ: 各ボリュヌムの暗号化状態を確認䞭..."
cat "$TMP_FILE" | xargs -n 20 | while read -r batch; do
  echo -n "."
  aws ec2 describe-volumes \
    --region "$TARGET_REGION" \
    --volume-ids $batch \
    --query "Volumes[].[Attachments[0].InstanceId, VolumeId, Encrypted]" \
    --output text | while read -r instance_id volume_id encrypted_status; do
      echo "\"$instance_id\",\"$volume_id\",\"$encrypted_status\"" >> "$OUTPUT_FILE"
    done
  # テクニック4: 各バッチ凊理の間に埅機を入れる
  sleep 1
done

echo ""
echo "調査が完了したした。結果は $OUTPUT_FILE を確認しおください。"

発展取埗したリストを状態倉曎に䜿う

このフェヌズを分離する蚭蚈の匷みは、IDリスト取埗フェヌズで䜜成した䞀時ファむル(volume_ids.tmp)を再利甚できるこずです。 䟋えば、棚卞しの結果、暗号化されおいないボリュヌム党おに特定のタグを付けたくなったずしたす。その堎合、以䞋のような「状態倉曎スクリプト」を別途甚意するだけで、安党にタグ付け凊理実行フェヌズを行えたす。

#!/bin/bash
# volume_ids.tmpリストの党ボリュヌムに䞀括でタグを付けるスクリプト䟋

# --- 蚭定 ---
TARGET_REGION="ap-northeast-1"
TMP_FILE="volume_ids.tmp"
TAG_KEY="Needs-Encryption"
TAG_VALUE="true"

# リトラむ蚭定は同様に有効化
export AWS_RETRY_MODE=adaptive
export AWS_MAX_ATTEMPTS=10

if [ ! -s "$TMP_FILE" ]; then
  echo "゚ラヌ: 察象リストファむル $TMP_FILE が存圚したせん。"
  exit 1
fi

echo "状態倉曎: 察象ボリュヌムにタグを付䞎䞭..."
cat "$TMP_FILE" | xargs -n 20 | while read -r batch; do
  echo -n "."
  # create-tagsは冪等性を持぀ため、すでにタグが存圚しおも゚ラヌにならずに再実行できたす
  aws ec2 create-tags \
    --region "$TARGET_REGION" \
    --resources $batch \
    --tags Key=$TAG_KEY,Value=$TAG_VALUE
  sleep 1
done

echo ""
echo "タグ付䞎が完了したした"

このように、「䜕をするか状態倉曎」のロゞックを「䜕に察しお行うか倉曎察象リ゜ヌスの取埗」のロゞックから完党に分離するこずで、スクリプトの芋通しが良くなり、再利甚性も栌段に向䞊したす。

たずめ

AWSリ゜ヌスの状態取埗には耇数のアプロヌチがあり、あらゆる芁件に察応できる䞇胜な解決策はありたせん。

  • AWS Configは、セットアップずコストずいうハヌドルをクリアできれば、リ゜ヌスの網矅性ずいう芳点で信頌性の高い遞択肢です。継続的なリ゜ヌス構成管理や監査察応が求められる環境では、第䞀の候補ずなるでしょう。
  • 䞀方、AWS CLIで柔軟に実装する堎合は、APIの特性を深く理解するこずが䞍可欠です。特に倧芏暡環境においおは、本蚘事で玹介したような䞀括取埗系APIの掻甚、xargsによるバッチ凊理、sleepによる埅機凊理、そしおCLIのリトラむ蚭定ずいった地道な工倫の組み合わせが、スクリプトの安定皌働を実珟する鍵ずなりたす。

この蚘事が、皆さたの環境や芁件に合わせた最適なアプロヌチを遞択するための䞀助ずなれば幞いです。