背景
なぜこの記事を書くのか?
AWS環境の管理をしていると、調査などのために一覧作成が必要なことがあります。
例えば、何らかの問題(脆弱性の発見など)が発生した際に、調査対象のリソース(EC2など)を抽出して一覧を作成する、といった場合などです。
普段からAWS CLI を使い慣れているなら問題ないのですが、
たまに(年に1、2回とか)しか使わない場合、使い方を忘れて毎回調べ直したりして、地味に労力を費やすことになっていました...。
そこで、自分自身の備忘の意味も含めて、先日利用したコマンドを、ざっくりとした解説とともに記載します。
結論
EC2の一覧取得コマンド
まず結論から・・・
aws ec2 describe-instances --region ap-northeast-1 \
--query "Reservations[].Instances[]" \
| jq -r \
'.[] | select(.LaunchTime >= "2025-12-01T00:00:00Z" or .State.Name == "running") | [ .InstanceId, .LaunchTime, "ap-northeast-1", .PublicIpAddress, .PrivateIpAddress, (.Tags[]? | select(.Key=="Name") | .Value // "-") ] | @tsv'
↑のコマンド(aws cli v2)で・・・
- 以下のEC2の一覧を取得できます。
- 東京リージョン
かつ - LaunchTime(※)が2025年12月1日以降、または、現在実行中
- 東京リージョン
- また、出力形式は、以下の項目をタブ区切りで出力します。
- LaunchTime
- ap-northeast-1(べた書き文字列)
- パブリックIP
- プライベートIP
- Name
※EC2のLaunchTimeは、EC2の最新の開始時刻と同じ時刻を指します。
初期と最新の起動時間を確認
解説
コマンドの構成
前半部分
前半部分が、AWS CLI の処理で、
aws ec2 describe-instances --region ap-northeast-1 \
--query "Reservations[].Instances[]"
後半部分
後半部分は、AWS CLI の結果を受け取った jq コマンドの処理になります。
| jq -r \
'.[] | select(.LaunchTime >= "2025-12-01T00:00:00Z" or .State.Name == "running") | [ .InstanceId, .LaunchTime, "ap-northeast-1", .PublicIpAddress, .PrivateIpAddress, (.Tags[]? | select(.Key=="Name") | .Value // "-") ] | @tsv'
説明
もう少し詳細を説明します。
describe-instances
aws ec2 describe-instances --region ap-northeast-1
東京リージョンを指定して、インスタンスの情報を出力する。
--query
--query "Reservations[].Instances[]"
出力結果から、Reservations配列の各要素を取得し、その中のInstances配列の各要素を取得する。
jq
| jq -r
AWS CLI の出力結果(JSON形式)を、パイプを通してjqコマンドへ渡す。
'.[] |
jqコマンドへ渡った配列の各要素を取得し、パイプで次へ渡す。
select
select(.LaunchTime >= "2025-12-01T00:00:00Z" or .State.Name == "running") |
- LaunchTimeが2025年12月1日以降、または、EC2が実行中のもののみを取得し、
パイプで次へ渡す。 -
selectは条件に一致するものだけを取り出すjqコマンドの機能です。
出力項目の絞り込み
[ .InstanceId, .LaunchTime, "ap-northeast-1", .PublicIpAddress, .PrivateIpAddress, (.Tags[]? | select(.Key=="Name") | .Value // "-") ]
出力対象の項目を以下に絞り込む。
.InstanceId.LaunchTime-
"ap-northeast-1"-
""で囲んで、べた書きの文字列として出力
-
.PublicIpAddress.PrivateIpAddress-
(.Tags[]? | select(.Key=="Name") | .Value // "-")-
Tagsのうち、Nameタグ(Key=Nameのタグ)のValueを出力 - 空の場合は
-を出力
-
出力形式
| @tsv'
タブ区切りで出力する。
補足
- 今回は、サーバー側のフィルタリング機能(
filters)は利用せず、クライアント側でフィルタリングを行っています。 -
filtersを使ってLaunchTimeの範囲指定をできるかどうか分からなかったので...