S3に溜めたCloudTrailログを出力してみる

             図A システム構成図
#!/usr/bin/env python3.8
import boto3
import gzip
import io
import sys
import os
import traceback
import json

target_bucket = 'trail-test'
target_path = 'AWSLogs/123456789012/CloudTrail/ap-northeast-1/2024/07/22'

def main():
try:
s3 = boto3.resource('s3')
s3client = boto3.client('s3')
my_bucket = s3.Bucket(target_bucket)
f = open("22.json","w+")
decoder = json.JSONDecoder()
for object in my_bucket.objects.all():
if target_path in object.key:
obj = s3client.get_object(
Bucket=target_bucket,
Key=object.key)['Body'].read()
file = gzip.open(io.BytesIO(obj), 'rt')
for row in file.readlines():
str_t = decoder.raw_decode(row)
str_s = json.dumps(str_t,indent=2,ensure_ascii=False)
str_s = str_s[1:-1]
f.write(str_s)
f.close()

except json.decoder.JSONDecodeError as ex:
err_message = ex.__class__.__name__
t = traceback.format_exception_only(type(ex), ex)
except Exception as ex:
err_message = ex.__class__.__name__
t = traceback.format_exception_only(type(ex), ex)
print(t,err_message)
sys.exit(1)

if __name__ == '__main__':
main()
#!/usr/bin/env python3.8
import boto3
import gzip
import io
import sys
import os
import traceback
import json

target_bucket = 'trail-test'
target_path = 'AWSLogs/123456789012/CloudTrail/ap-northeast-1/2024/07/22'

def main():
try:
s3 = boto3.resource('s3')
s3client = boto3.client('s3')
my_bucket = s3.Bucket(target_bucket)
f = open("22.json","w+")
decoder = json.JSONDecoder()
for object in my_bucket.objects.filter(Prefix=target_path):
obj = s3client.get_object(
Bucket=target_bucket,
Key=object.key)['Body'].read()
file = gzip.open(io.BytesIO(obj), 'rt')
for row in file.readlines():
str_t = decoder.raw_decode(row)
str_s = json.dumps(str_t,indent=2,ensure_ascii=False)
str_s = str_s[1:-1]
f.write(str_s)
f.close()

except json.decoder.JSONDecodeError as ex:
err_message = ex.__class__.__name__
t = traceback.format_exception_only(type(ex), ex)
except Exception as ex:
err_message = ex.__class__.__name__
t = traceback.format_exception_only(type(ex), ex)
print(t,err_message)
sys.exit(1)

if __name__ == '__main__':
main()

AWS CLI filterとqueryを同時に指定する方法を理解する

          図A AWSシステム構成図
コマンド例 コマンド実行結果のjson形式を jqで成形します。

例1 インスタンスタイプ(t3a.micro)を抽出し,そのフィールドを出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3a.micro \
--query 'Reservations[*].Instances[*].{Type:InstanceType}' | jq .


例2 インスタンスタイプ(t3a.micro)のみ抽出し,インスタンスタイプ,Name Tagを出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3a.micro \
--query 'Reservations[*].Instances[*].{Type:InstanceType,Name:Tags[?Key==`Name`].Value}' | jq .


例3 インスタンスタイプ(t3a.micro 又は t3.micro)を抽出し,インスタンスタイプ,Name Tagを出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3a.micro,t3.micro \
--query 'Reservations[*].Instances[*].{Type:InstanceType,Name:Tags[?Key==`Name`].Value}' | jq .



例4 インスタンスの状態(running 又は stopped)を抽出し,インスタンスタイプ,Name Tag,状態(State)を出力
aws ec2 describe-instances \
--filters Name=instance-state-name,Values=running,stopped \
--query 'Reservations[*].Instances[*].{Type:InstanceType,Name:Tags[?Key==`Name`].Value,State:State.Name}' | jq .


例5 インスタンスの状態(running 又は stopped)を抽出し,インスタンスタイプ,プラットフォームOS,Name Tag,状態(State)を出力
aws ec2 describe-instances \
--filters Name=instance-state-name,Values=running,stopped \
--query 'Reservations[*].Instances[*].{Type:InstanceType,OS:PlatformDetails,Name:Tags[?Key==`Name`].Value,State:State.Name}' | jq .
例6 インスタンスタイプ(t3.micro)で,かつ,インスタンスがstopedを抽出し,インスタンスタイプ,Name Tag,状態(State)を出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3.micro \
Name=instance-state-name,Values=stopped \
--query 'Reservations[*].Instances[*].{Type:InstanceType,Name:Tags[?Key==`Name`
].Value,State:State.Name}' | jq .


例7 インスタンスタイプ(t3.micro)で,かつ,インスタンスがstopedを抽出し,インスタンスタイプ,プラットフォームOS,Name Tag,状態(State)を出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3.micro \
Name=instance-state-name,Values=stopped \
--query 'Reservations[*].Instances[*].{Type:InstanceType,OS:PlatformDetails,Name:Tags[?Key==`Name`].Value,State:State.Name}' | jq .


例1 インスタンスタイプ(t3a.micro)のみ抽出し,インスタンスタイプのフィールドのみ出力の実行結果 一部のみ掲載
[
[
{
"Type": "t3a.micro"
}
],
[
{
"Type": "t3a.micro"
}
]

例2 インスタンスタイプ(t3a.micro)のみ抽出し,インスタンスタイプ,Name Tagを出力の実行結果 一部のみ掲載
[
[
{
"Type": "t3a.micro",
"Name": [
"Ama-linux2-kami"
]
}
],
[
{
"Type": "t3a.micro",
"Name": [
"Ama_linux2_Redmine_MySQL"
]
}
]
例3 インスタンスタイプ(t3a.micro 又は t3.micro)を抽出し,インスタンスタイプ,Name Tagを出力の実行結果 一部のみ掲載
[
{
"Type": "t3.micro",
"Name": [
"kamishita-docker-python"
]
}
],
[
{
"Type": "t3a.micro",
"Name": [
"Ama_linux2_Redmine_MySQL"
]
}
]
例4 インスタンスの状態(running 又は stopped)を抽出し,インスタンスタイプ,Name Tag,状態(State)を出力の実行結果 一部のみ掲載
[
{
"Type": "t3a.micro",
"Name": [
"Ama_linux2_Redmine_MySQL"
],
"State": "running"
}
],
[
{
"Type": "t3a.micro",
"Name": [
"kamishita_linux2023_private"
],
"State": "stopped"
}
]

例5 インスタンスの状態(running 又は stopped)を抽出し,インスタンスタイプ,プラットフォームOS,Name Tag,状態(State)を出力の実行結果 一部のみ掲載
{
"Type": "t3a.micro",
"OS": "Linux/UNIX",
"Name": [
"Ama_linux2_Redmine_MySQL"
],
"State": "running"
}
],
[
{
"Type": "t3a.micro",
"OS": "Linux/UNIX",
"Name": [
"debug-docker-kami"
],
"State": "stopped"
}
]
例6 インスタンスタイプ(t3.micro)で,かつ,インスタンスがstopedを抽出し,インスタンスタイプ,Name Tag,状態(State)を出力の実行結果
[
[
{
"Type": "t3.micro",
"Name": [
"kamishita-docker-python"
],
"State": "stopped"
}
],
[
{
"Type": "t3.micro",
"Name": [
"kamishita_Public_AMA2023"
],
"State": "stopped"
}
]
]

例7 インスタンスタイプ(t3.micro)で,かつ,インスタンスがstopedを抽出し,インスタンスタイプ,プラットフォームOS,Name Tag,状態(State)を出力の実行結果
[
[
{
"Type": "t3.micro",
"OS": "Linux/UNIX",
"Name": [
"kamishita-docker-python"
],
"State": "stopped"
}
],
[
{
"Type": "t3.micro",
"OS": "Linux/UNIX",
"Name": [
"kamishita_Public_AMA2023"
],
"State": "stopped"
}
]
]

AWS ECSサービスを構築しよう(その2)

ECSサービス構築の二回目です。前回は,ECRに登録するdockerイメージをコンテナから作成するところまででした。今回は,ECRリポジトリーに登録,ECSサービスの構築手順です。
            図A 利用するAWSリソースと構成図

1. ECRにリポジトリ作成

作成したコンテナイメージを、コンテナレジストリのフルマネージドサービスである Amazon Elastic Container Registry (Amazon ECR) にアップロード(Push)します。
作成したコンテナイメージを、コンテナレジストリで一元管理することで、様々なコンテナ実行環境で利用しやすくなるメリットがあります。AWS コンソールにログインして,ECRリポジトリを作成します。
引用url ECRとは
               図B リポジトリ作成
このuriをコピーして,メモしておきます。後で、イメージのtag付けに必要になります。

1.2. EC2クライアントからECRにログインする

EC2クライアントから,ECRにpushする為に,ECRにログインする必要があります。ログイン用のスクリプトを作成します(login.sh)。そのスクリプトを利用してECRにログインします。
参照した URL AWS ECRにdockerイメージを登録する
aws ecr get-login --no-include-email --region ap-northeast-1 > login.sh ←一行です
[ec2-user@ip-10-128-1-19 ECR]$ bash ./login.sh
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded ← これが出ればログイン成功
前回作成したイメージから,ECR登録用のイメージtagを作成します。先ほど,コピーしておいた,uriが必要になります。
(123456789012はアカウントID)
docker tag redminesql:latest \
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/redmine6:latest
ECRにイメージをpushします
(123456789012はアカウントID)
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/redmine6:latest ← 一行です
これで,ECRのリポジトリにdockerイメージの登録が完了しました。
図AのECR Registoryです。

2. ECSサービスの構築

ECSサービスの構築は,ECSクラスターの作成,タスクの定義,サービスの作成という手順で行います。

2.1 ECSクラスターの作成

ECS クラスターは、コンテナを動かすための論理的なグループです。ECS を操作するために、まずは ECS クラスターを作成します。AWSコンソールから,クラスターの作成を行います。
ecs→クラスターの作成をクリックします。設定内容は,クラスター名,実行するVPC,サブネットです。
引用url ECSクラスターの作成
            図C ECSクラスターの作成1
              図D ECSクラスターの作成2

2.2. タスク定義

タスク定義とは、アプリケーションを動かすために、どのようにコンテナを動かすか、コンテナの動作を定義したものです。 例えば、コンテナイメージの種類、アプリケーションが利用するポート、コンテナが利用するデータボリュームなどを指定できます。
コンテナを動かす際のブループリントとして機能します。タスク定義をawsコンソールから行います。設定内容は,タスク定義名,ECRのuri,コンテナのlistenポート番号,動作させるサーバ(今回はFargate)です。
引用 URL タスク定義
              図E タスク定義1
              図F タスク定義2
              図G タスク定義3
              図H タスク定義4

2.3. サービスの作成

サービスとは、ECS 上でコンテナを動かすときに利用する概念の一つです。
サービスを使用すると、 Amazon ECS クラスターで、指定した数のコンテナ群(タスク)を維持できます。作成するサービスの定義をします。設定内容は,タスク定義の選択,サービス名,実行するVPC,サブネット,セキュリティグループ,ALBです。
引用url サービスとは
              図I サービス作成1
              図J サービス作成2
              図K サービス作成3
              図L サービス作成4
              図M サービス作成5
                 図N サービス作成6

3.サービスの実行

サービスの作成に成功したら,サービスを実行します。作成したサービスを選択する。ネットワーキングをクリック。オープンアドレス(ALBのアドレス)をクリックです。
              図O サービスの実行1
              図P サービスの実行2
              図Q サービスの実行3
              図R サービスの実行4
ALB経由で,Fargateコンテナのredmineログイン画面が出れば作成完了です。

AWS ECSサービスを構築しよう(その1)

Redmine4.2と,依存関係でDBが必要なので,mariaDB(10.11.2)(MySQL系)2つのdockerコンテナを作成します。Redmineコンテナ起動後にwebhookというpluginをインストール,更にDBをRDS(mySQL)に変更後,作成したコンテナからイメージを作成し,ECRに登録します。そのイメージからECSサービスをデプロイします。今回は,ECRに登録するイメージを作成するまでの手順です。

1. 利用するAWSのリソースと作成するシステム構成図

             図A システム構成図

2. Docker環境構築

EC2(図AのDockerコンテナ)にdocker,docker-composeをインストールして,dockerが動作する環境を構築します。
#Dockerのインストール
sudo yum install -y docker
sudo systemctl start docker
sudo usermod -a -G docker ec2-user
#自動起動を有効にする
sudo systemctl enable docker
#docker-composeのインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose  ←一行です
sudo chmod +x /usr/local/bin/docker-compose

#Docker Composeが使用できるか確認
/usr/local/bin/docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f

コマンド docker ps とすると以下のメッセージ出力
#Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containe
rs/json": dial unix /var/run/docker.sock: connect: permission denied
###対策 dockerグループにec2-userを追加
sudo usermod -g docker ec2-user

3. docker-compose.ymlファイルを作成して、docker コンテナを作成

作成するコンテナの設計図ですね。今回は,redmineとそのDBのコンテナを作成して,webhookというPluginを入れ、更にDBをRDS(Mysql)に変更します。
version: '3.8'
services:
  redmine:
    image: redmine:4.2
    container_name: redmine
    ports:
      - 80:3000
    environment:
      REDMINE_DB_MYSQL: redmine-db
      REDMINE_DB_PASSWORD: xxxxxx
    depends_on:
      - redmine-db
    restart: always

  redmine-db:
    image: mariadb
    container_name: redmine-db
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxx
      MYSQL_DATABASE: redmine
    volumes:
      - ./data/db:/var/lib/mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    restart: always

4. Docker コンテナの作成と起動

docker-compose.ymlファイルのあるディレクトリで以下のコマンドを実行します。完了したら,docker ps -a コマンドで動作しているかどうか確認します。
sudo su
cd /usr/local/src/redmine
/usr/local/bin/docker-compose  up -d
$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                       NAMES
9e7f0be2bc5b   redmine:4.2   "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:80->3000/tcp, :::80->3000/tcp       redmine
3cd27d886b4f   mariadb       "docker-entrypoint.s…"   8 seconds ago   Up 6 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   redmine-db

docker コンテナが作成されて起動されているのがわかります。Webでアクセスして確認しましょう。アドレスは、EC2のグローバルアドレスです。http://xx.xx.xx.xx/ログイン出来ればOKです。
               図B redmineログイン画面

5. webhook pluginをコンテナにインストール

作成したコンテナ(図AのDockerコンテナ)にwebhookというpluginをインストールします。
#Docker コンテナの中に入ります
docker container exec -it redmine bash
# pluginsディレクトリに移ります
root@f3baf480c406:/usr/src/redmine# cd plugins/
root@f3baf480c406:/usr/src/redmine/plugins# git clone https://github.com/suer/redmine_webhook.git ← 一行
root@f3baf480c406:/usr/src/redmine/plugins#  cd redmine_webhook
root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# bundle install
rake redmine:plugins:migrate RAILS_ENV=production
#docker コンテナから抜けます
root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# exit

redmine コンテナを再起動します。
docker stop redmine
docker start redmine
ブラウザでアクセスして、管理タブをクリックプラグインが表示されればOKです。
            図C webhook pluginインストール後

6. RDSと接続

privateサブネットに作成したRDS(Mysql)に接続させるように変更していきます。
#database接続定義(database.yml)の作成

production:
  adapter: "mysql2"
  host: "databasexxx.xxxxxx.ap-northeast-1.rds.amazonaws.com"
  port: "3306"
  username: "Admin"
  password: "xxxxxx"
  database: "redmine_db"

database.ymlをdockerコンテナ内にコピー
sudo docker cp database.yml redmine:/usr/src/redmine/config/

#redmine  migrate実行
#docker コンテナ内部に入ります
docker container exec -it redmine bash
/usr/src/redmin/# bundle exec rake generate_secret_token
/usr/src/redmine# bundle exec rake db:migrate RAILS_ENV=production
これで,ECSサービスとして起動可能なredmineコンテナが作成できました。
このコンテナを利用してECRに登録するimageを作成します。

7. ECR登録用のイメージ作成

作成したDockerコンテナからECRに登録するイメージを作成します。
#コンテナからイメージの作成
$ docker commit redmine redminesql

#イメージの確認
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
redminesql        latest    304ab9ccde49   8 seconds ago   554MB
fortune-whale     latest    0df1bdab20e2   2 days ago      280MB
redmine           4.2       d4ea63462562   2 days ago      531MB
mariadb           latest    4a632f970181   2 weeks ago     401MB
docker/whalesay   latest    6b362a9f73eb   7 years ago     247MB
これで登録するdockerのイメージが作成できました。次回は、ECRにログインしてimageの登録,ECSのデプロイ,ECSタスクの実行する手順です。

AWS CLIで情報を出力しよう 色々編(Linux版その4)

1. AWS CLIコマンドのヴァージョンアップをしよう

$curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
$unzip awscliv2.zip
$sudo ./aws/insstall --update
$aws --version
aws-cli/2.9.10 Python/3.9.11 Linux/5.10.157-139.675.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

2022/12/27 時点で最新バージョンです 詳しくは、以下を参照 AWS CLI 最新バージョンをインストールまたは更新する
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

2. 前回の復習 InternetGW情報を出力しよう

InternetGWの情報を必要な項目のみ出力してみよう

$aws ec2 describe-internet-gateways \
--query "InternetGateways[].[{VPC_id:Attachments[0].VpcId,Name:Tags[0].Value}]" --out table

             図 A InternetGWの情報

3. AWSが保持しているグルーバルアドレスCIDRを表示しよう

3.1 AWSが保持している東京リージョンのグローバルCIDRの表示

AWSが保持しているグルーバルアドレスのCIDRが公開されています。(json形式)その内容から東京リージョンのIPレンジのみを出力します。

$curl https://ip-ranges.amazonaws.com/ip-ranges.json | \
jq -r '.prefixes[] | select(.region=="ap-northeast-1") | .ip_prefix'

curl コマンドでjsonファイルを取ってきます。 jp コマンドでリストになっているprefix[]からreginがap-northeast-1(東京)のもので、ip_prefix項目のみ出力させます

jq コマンドは以下でインストールしてみてください

$sudo yum install jq

            図B 東京リージョンのIPアドレスレンジ

3.2AWSが保持している東京リージョンでEC2のグルーバルアドレスCIDRを表示

東京リージョンでEC2のIPレンジのみを出力します。

$curl https://ip-ranges.amazonaws.com/ip-ranges.json | \
jq -r '.prefixes[] | select(.service=="EC2" and .region=="ap-northeast-1") | .ip
_prefix'

curlコマンドでjsonファイルを取ってきます。jpコマンドでリストになっているprefix[]からreginがap-northeast-1(東京)かつ serviceがEC2のip_prefixのみを出力させます

           図C 東京リージョンEC2のIPアドレスレンジ

4. AWS Health イベントで使用されるサービス名の一覧を出力

HealthイベントをEventBridge経由で監視するイベントルールの対象を特定のサービスとする場合に、対象のサービス名は、”A2I”、”SSM”と選択可能である、これがなんのサービスかわかりたい

$aws health describe-event-types

             図D Health サービス名一覧

Health イベントで使用されるサービス名の一覧は、aws health describe-event-types コマンドで出力できます。json形式で出力されます。沢山出力されるのである程度絞り込みを行います。

$aws health describe-event-types | \
jq -r '.eventTypes[] | select(.service=="SSM" or .service=="A2I") | .code'

   図E Health A2IとSSMに絞り込み出力

Health イベントで使用されるサービス名の一覧は、aws health describe-event-types コマンドで出力できます。これでは、沢山出力されるので、対象を絞ります。 jqコマンドのselectを利用して SSMとA2Iに絞ります。そして、codeの部分のみを出力します。A2IはAmazon Augmented AI(AmazonA2I)のことだそうです。「A2I aws」で検索するとヒットします。

5. AWS WindowsのAMI一覧を出力しよう

Windows-serverのAMIはどのような物があるか、質問が良くあります。AWS CLIコマンドを使って出力できます。(Windows-server2019の例です)

$aws ec2 describe-images \
--owners amazon \
--filters "Name=name,Values=Windows_Server-2019-*" \
--query "sort_by(Images,&Name)[].[Name,ImageId]" \
--out table

           図F  windows-server-2019 AMI情報

imageは、aws ec2 describe-imageコマンドで出力します。filterオプションで windows_Server-2019-*のみを対象にします。更に、queryで ImagesNameとImageIdをsortして出力します。

6. routeテーブルを見て、publicサブネットかどうか判断しよう

publicサブネットかどうかは、routeテーブルを見ないとわかりません。ルートテーブルの(0.0.0.0/0)があるかどうかで判断できます。

$aws ec2 describe-route-tables \
--query "RouteTables[].{Sub:Associations[].SubnetId,Id:RouteTableId,rou:join('<->',Routes[].DestinationCidrBlock),INgw:Routes[].GatewayId}"\
--out text

            図G ルートテーブルと0.0.0.0/の関係

routeテーブルを出力します。queryで出力項目を絞り込みます。Associations[].SubnetIdとRouteTableId,join(‘<->’)で文字列を加え、Routes[].DestinationCidrBlock,Routes[].GatewayIdを出力します。<->0.0.0.0/0があるサブネットがpublicサブネットです。

Linux版その1 EC2の情報出力 https://opt-p.co.jp/blog/aws/post-1633/

Linux版その2 RDSの情報出力 https://opt-p.co.jp/blog/aws/post-1718/

Linux版その3 VPCの情報出力 https://opt-p.co.jp/blog/aws/post-2080/

AWS CLIで情報を出力しようVPC編(Linux版-その3)

VPCにはどの様な情報があるのだろうか?。一番気になるのは,CIDR,サブネット,どのようにしたら見れるのだろうか?

             図A VPCの一覧を図で書いてみる

1.利用中のリージョンのVPC情報を出力しよう

利用中のVPC一覧を出力する場合は、以下のコマンドを実行します。

aws aws ec2 describe-vpcs

              図B VPC一覧出力

json形式で出力されます。

2.必要な情報のみ出力するようにしましょう

オプションのqueryを使用することで絞り込みができます。
以下の例は、CIDRとVPC名に絞った例です。トップレベルがVpcs,で(画像B 階層と項目)
CidrBlockとtags[0]をdict{}に配置させます。

aws ec2 describe-vpcs \
--query "Vpcs[].[{CIDR:CidrBlock,Name:Tags[0].Value}]" \
--out table

オプションのqueryを使用することで絞り込みができます。
–query オプションの順番を変えても出力順序は変わりません。CIDRが先に出力されます

aws ec2 describe-vpcs \
--query "Vpcs[].[{Name:Tags[0].Value,CIDR:CidrBlock}]" \
--out table

           図C 項目を絞って出力

VPCのCIDRとVPC名を出力できました。

3.必要な情報(追加)出力するようにしましょう

オプションのqueryを使用することで絞り込みができます。
以下の例は、CIDRとVPCIdにVPCの名前を追加した例です。トップレベルがSubnets,で
(画像D 階層と項目)CidrBlockとVpcIdをdict{}に配置させます。

aws ec2 describe-vpcs \
--query "Vpcs[].[{CIDR:CidrBlock,Name:Tags[0].Value,VpcId:VpcId}]" \
--out table

            図D CIDRとVPC名とVPCID

VPCのCIDRとVPC名とVPCIDを出力できました。

4.サブネット情報を出力してみましょう

VPCの情報出力では、サブネットの情報は出力されないので、サブネット情報
を出力するコマンドでサブネット情報を出力しましょう。

aws ec2 describe-subnets

             図E サブネット情報

サブネットの情報がjson形式で出力されます。

5.必要な情報のみ出力するようにしましょう

オプションのqueryを使用することで絞り込みができます。
以下の例は、CIDRとVPCIdに絞った例です。トップレベルがSubnets,で(画像E サブネット情報)
VPCid,CidrBlock,Nameを出力させます。

aws ec2 describe-subnets --query "Subnets[].[VpcId,CidrBlock,Tags[0].Value]" \
--out table

              図F サブネットのCIDRとVPCID

サブネットのCIDRとVPCIDが出力されます。

6.VPCとサブネットの情報を出力しよう

VPCの情報出力では、サブネットの情報は出力されないので、サブネット情報
を出力するコマンドとVPC-Idをfilterに指定してサブネット情報を出力しましょう。

aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=vpc-0e628XXXXXXXXYYYY" \
--query "Subnets[].{CIDR:CidrBlock,VpcId:VpcId,Name:Tags[?Key=='Name'].Value}" \
--out table

         図G サブネットとVPCID

VPCIDをフィルターして、このVPCにどんなサブネットがあるのかがわかります。

7.VPC CIDRとサブネット CIDRを出力しよう

サブネットの情報(CIDR)とVPCのCIDRを出力したい。これにはちょっと工夫が必要です。
コマンド一発というわけにはいかないのです。他に方法があるかもしれません。

aws ec2 describe-subnets --query "sort_by(Subnets[].{VpcId:VpcId,SubnetCIDR:Cidr
Block,AZ:AvailabilityZone},&VpcId)" \
--out table > subnet.txt
aws ec2 describe-vpcs \
--query "Vpcs[].[{CIDR:CidrBlock,VpcId:VpcId}]" \
--out text > vpc.txt
./replace.py

more replace.py
#!/usr/bin/env python3
import textfile
list_from_vpcs = []
with open('vpc.txt') as f:
	reader = csv.reader(f, delimiter='\t')
	list_from_vpcs = [rows for rows in reader]
for vpc in list_from_vpcs:
	textfile.replace('subnet.txt',vpc[1],vpc[0])
textfile.replace('subnet.txt','VpcId','VpcCIDR')
            図H サブネットCIDRとVPCCIDR

先ず,サブネットの情報をサブネットのCIDRでソートしてsubnet.txtに出力させます。次に,vpc.txtにvpc情報を出力させます。そして、subnet.txtのファイルの中身を、vpc.txtのvpcIDと一致する項目をCIDRに置き換えています。また、表示名をVpcIdからVpcCIDRに変更しています。これで、サブネットとVPCの関係がわかります。

8.InternetGWの情報を出力しよう

InternetGWの情報を必要な項目のみ出力してみましょう

aws ec2 describe-internet-gateways \
--query "InternetGateways[].[{VPC_id:Attachments[0].VpcId,Name:Tags[0].Value}]" --out table

オプションのqueryを使用することで絞り込みができます。
上記の例は、InternetGatewaysがトップレベル次にVpcIdとTagsのValue情報を出力させています


            図J InternetGateway情報

次回はInternetGWとVPC,サブネットCIDRを一緒に出力させる方法を書きます


Linux版その1 EC2の情報出力 https://opt-p.co.jp/blog/aws/post-1633/

Linux版その2 RDSの情報出力 https://opt-p.co.jp/blog/aws/post-1718/

Linux版その4 色々な情報出力 https://opt-p.co.jp/blog/aws/post-2421/

AWS CLIで情報を出力しようEC2編(Linux版-その1)

1. AWS CLIを利用すると色々なリソース情報が見れます!

AWS EC2をコンソールから作成し、管理するサーバが多くなったら、一覧が欲しいですよね。
コンソールでは、分かり難いし、一覧を管理したい。そこで、AWS CLIコマンドを利用すると
EC2のリソース情報を取得し、且つ、必要な情報に絞って出力するように出来ます。
今回はEC2の情報を出力してみます。

2. まずはAWS CLIをインストールしよう!

Linuxのコンソール画面で以下のコマンドを実行してインストールします

$curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
$unzip awscliv2.zip
$sudo ./aws/install

3. AWS CLIを使ってみよう!

3.1 AWS CLI のバージョンを確認する!

aws --version
aws-cli/2.4.15 Python/3.8.8
 
最新でなかった場合はバージョンアップしましょう
バージョンアップ方法は以下です

3.2 AWS CLIのバージョンアップ方法!

curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update 
aws --version
aws-cli/2.4.29 Python/3.8.8

2022/03/28時点で最新バージョンです
詳しくは、以下を参照 AWS CLI 最新バージョンをインストールまたは更新する https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

3.3 利用中のリージョンでec2 インスタンスの情報をすべて出力してみよう!

利用中のリージョンに存在するEC2インスタンスのすべての情報を出力するには以下のように記述します SQLの  select * from ec2 みたいなものです

aws ec2 describe-instances

画像A 出力結果
                 画像A 出力結果

Json形式で どばーっと出力されます

3.2 出力する情報を絞りこんでみよう!

上記コマンドでは沢山の情報が出力されるのでqueryオプションを使用して情報を絞り込みます
Sqlの select name,OS from EC2 みたいなものです。EC2名とOSに絞り込みます

aws ec2 describe-instances \
--query "Reservations[*].Instances[*].[{OS:PlatformDetails,Name:Tags[0].Value}]" \
--out table 

画像B 2項目出力
                画像B2項目出力

queryオプションの設定は以下のようになります
Json形式で出力されるので、これを踏まえて絞り込む内容を記述します
まず、Reservations[*].Instances[*]   (画像C 階層) トップレベルがReservations
一つ下の階層がInstances これがリスト[]になっているので、
すべてを対象にする為に、Reservations[*].Instances[*] と指定します
更に下の階層(画像D PlatformDetails項目)の値と、
同じ階層にある(画像E Name項目)Tags:[0]リストの最初の項目Value値 を指定します
.[{OS:PlatformDetails,Name:Tags[0].Value}]
{key1:value,key2:value}のdict形式にフォーマットして、項目名と値を出力するようにする
--out table テーブル形式にすることで見た目が分かり易すくなります

画像C 階層
                  画像C 階層
画像D PlatformDetails項目
              画像D PlatformDetails項目
画像E Name項目
                 画像E Name項目

2.3 出力項目を増やしてみよう!(インスタンスタイプ)

aws ec2 describe-instances \
--query "Reservations[*].Instances[*].[{OS:PlatformDetails,Name:Tags[0].Value,Type:InstanceType}]" \
--out table

画像F 3項目出力
                 画像F 3項目出力

追加したqueryオプションの設定は以下のようになります
[{OS:PlatformDetails,Name:Tags[0].Value,Type:InstanceType}]"
下の階層の (画像G Instancetype項目) の値を追加して、出力するようにする

画像G InstanceType項目
               画像G InstanceType項目

2.5 出力形式をTEXTに変更してみよう!

aws ec2 describe-instances \
--query "Reservations[*].Instances[*].[{OS:PlatformDetails,Name:Tags[0].Value,Type:InstanceType}]" \
--out text

画像H Text形式
                 画像H text形式

Text形式で出力して、情報を加工し易くすることが可能になります

4 応用してみよう!

利用可能なインスタンスタイプ、アーキテクチャ、仮想化、プロセッサー、Hypervisorを
出力しよう。インスタンスタイプの変更可否(互換性)を確認したい場合に重宝します。

aws ec2 describe-instance-types \
--query "InstanceTypes[*].[{InstanceType:InstanceType,Hypervisor:Hypervisor, \
CPU:ProcessorInfo.SupportedArchitectures[0], \
Clock_Ghz:ProcessorInfo.SustainedClockSpeedInGhz}]" \
--out table

                 画像I 出力結果

5 感想

query を利用することで、必要な項目を絞ることができました。 jqを利用しても可能ですが、こちらを利用しても、同様のことができそうです。最初は書き方に悩みましたが、pythonのlist[],dict{}を連想すると、分かり易いです。次回はRDSの情報出力についてです。

参考URL AWS CLI の query による絞り込み
https://qiita.com/draco/items/fa09ae0c2f51de9de449

Linux版その2 RDSの情報出力  https://opt-p.co.jp/blog/aws/post-1718/

Linux版その3 VPCの情報出力  https://opt-p.co.jp/blog/aws/post-2080/

Linux版その4 色々な情報出力 https://opt-p.co.jp/blog/aws/post-2421/