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 CLI filterを理解する

curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
unzip -q awscliv2.zip
sudo ./aws/install --update 
aws --version
aws-cli/2.17.17 Python/3.11.8 Linux/5.10.218-208.862.amzn2.x86_64 exe/x86_64.amzn.2
#2024/07/25現在バージョンは、2.17.17のようです。日々更新されます。
インストール(update)すると
/usr/local/aws-cli/v2/にインストールされます。
(myapp) [v2]$pwd
/usr/local/aws-cli/v2
(myapp) [v2]$ls -al
total 0
drwxr-xr-x 11 root root 148 Jul 25 08:48 .
drwxr-xr-x 3 root root 16 Mar 2 2022 ..
drwxr-xr-x 4 root root 29 Jul 15 09:47 2.17.11
drwxr-xr-x 4 root root 29 Jul 16 08:40 2.17.12
drwxr-xr-x 4 root root 29 Jul 17 09:07 2.17.13
drwxr-xr-x 4 root root 29 Jul 19 09:04 2.17.14
drwxr-xr-x 4 root root 29 Jul 25 09:04 2.17.17
lrwxrwxrwx 1 root root 29 Jul 25 08:48 current -> /usr/local/aws-cli/v2/2.17.17
current 以外はいらないのでバージョンアップ後は、消去しまょう。
cd /usr/local/aws-cli/v2
sudo rm -rf 2.17.1[1-4]*
(myapp) [v2]$ls -al
total 0
drwxr-xr-x 3 root root 36 Jul 25 15:00 .
drwxr-xr-x 3 root root 16 Mar 2 2022 ..
drwxr-xr-x 4 root root 29 Jul 25 08:48 2.17.17
lrwxrwxrwx 1 root root 29 Jul 25 08:48 current -> /usr/local/aws-cli/v2/2.17.17
              図A AWS構成図
https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html
にあるように、filtersのformatをきちんと書かないと機能しません。
例 インスタンスタイプを指定
instance-type - The type of instance (for example, t2.micro ).
例 インスタンスの状態を指定
instance-state-name - The state of the instance (pending | running | shutting-down | terminated | stopping | stopped ).
コマンド実行例(コマンド実行結果のjson形式を jqで成形しています。
例1 インスタンスタイプ(t3a.micro)のみを出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3a.micro | jq .

例2 インスタンスタイプ(t3a.micro 又は t3.micro)を出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3a.micro,t3.micro | jq .

例3 インスタンスの状態(running 又は stopped)を出力
aws ec2 describe-instances \
--filters Name=instance-state-name,Values=running,stopped | jq .
コマンド実行結果
例1 インスタンスタイプ(t3a.micro)のみを出力
一部分のみ掲載
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-08a8688fb7eacb171",
"InstanceId": "i-05675b6cc326f4f74",
"InstanceType": "t3a.micro",
"KeyName": "xxxxxxxx",
"LaunchTime": "2024-04-02T05:17:12+00:00",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-northeast-1a",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-10-128-1-247.ap-northeast-1.compute.internal",
"PrivateIpAddress": "10.128.1.247"
"Tags": [$
{$
"Key": "Name",$
"Value": "kami_linux2023_private"$
}$
]


例2 インスタンスタイプ(t3a.micro 又は t3.micro)を出力
一部分のみ掲載
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-08a8688fb7eacb171",
"InstanceId": "i-05675b6cc326f4f74",
"InstanceType": "t3a.micro",
"KeyName": "xxxxxxxx",
"LaunchTime": "2024-04-02T05:17:12+00:00",
"Monitoring": {
"State": "disabled"
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-0310b105770df9334",
"InstanceId": "i-018e4c7f659184e7f",
"InstanceType": "t3.micro",
"KeyName": "xxxxxxx",
"LaunchTime": "2023-09-03T03:38:58+00:00",
"Monitoring": {
"State": "disabled"
},

例3 インスタンスの状態(running 又は stopped)を出力
一部分のみ掲載
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-0d7ed3ddb85b521a6",
"InstanceId": "i-0e94a2aa06d28736e",
"InstanceType": "t2.micro",
"ProductCodes": [],
"PublicDnsName": "",
"State": {
"Code": 80,
"Name": "stopped"
}
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-00293610a82b21a10",
"InstanceId": "i-02198703d20356dba",
"InstanceType": "t3a.micro",
"KeyName": "xxxxxxxx",
"LaunchTime": "2024-07-24T23:24:21+00:00",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-northeast-1a",
"GroupName": "",
"Tenancy": "default"
"State": {
"Code": 16,
"Name": "running"
},
コマンド実行例
例4 インスタンスタイプ(t3.micro) かつ stoppedのインスタンスを出力
aws ec2 describe-instances \
--filters Name=instance-type,Values=t3.micro \
Name=instance-state-name,Values=stopped | jq .

コマンド実行結果
例4 インスタンスタイプ(t3.micro) かつ stoppedのインスタンスを出力
一部分のみ掲載
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-004a6f4a292bb996e",
"InstanceId": "i-0e2c92ce760e2e474",
"InstanceType": "t3.micro",
"KeyName": "xxxxxxxx",
"LaunchTime": "2024-07-29T02:39:09+00:00",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-northeast-1a",
"GroupName": "",
"Tenancy": "default"
},
"PrivateIpAddress": "10.128.1.151",
"ProductCodes": [],
"PublicDnsName": "",
"State": {
"Code": 80,
"Name": "stopped"
}

EC2インスタンスの停止保護(無効化/有効化)をAWS CLIとプログラム(Python)で実行してみる

EC2インスタンスの停止保護無効化、有効化をAWS CLIとpythonで実行してみる
              図A AWS 構成図
    aws ec2 modify-instance-attribute \
        --instance-id i-xxxxxxxxxxyyyyyyy \
        --no-disable-api-stop
                 図Bインスタンスの停止保護(AWSコンソール)
    aws ec2 modify-instance-attribute \
        --instance-id i-xxxxxxxxxxyyyyyyy \
        --disable-api-stop
                  図C インスタンスの停止保護(AWSコンソール)
    #!/usr/bin/python3.8
    import sys
    import boto3
    import botocore
    import os
    import traceback
    def get_abc():
            try:
                    client = boto3.client('ec2')
                    response = client.modify_instance_attribute(
                    InstanceId='i-xxxxxxxxxxxyyyyyy',
                    DisableApiStop={
                            'Value': False,
                    },
                    )
                    return(response)
            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__':
            response = get_abc()
            print('status=',response['ResponseMetadata']['HTTPStatusCode'])
            print('date',response['ResponseMetadata']['HTTPHeaders']['date'])
            print('server=',response['ResponseMetadata']['HTTPHeaders']['server'])
    boto3を最新にupdateしないと、エラーになることがあります。
    pip3 install -U boto3 
    2023/12/07時点では boto3-1.33.8 のようです
    status= 200
    date Thu, 07 Dec 2023 04:56:22 GMT
    server= AmazonEC2
    response(実行結果)はdictで返却されます。HTTPStatusCode=200が返却されれば
    成功です。HTTPStatusCode,date,serverを出力しています。
    停止保護有効化したインスタンスを停止させようとすると、エラーになります。
    "botocore.exceptions.ClientError: An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxyyyyy' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.\n"] ClientError

    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で情報を出力しようRDS編(Linux版-その2)

     RDSってどんな製品(エンジン)が利用できるのだろうか。一覧とかだして、確認
    することができたらいいな。AWSコンソールから操作すると、もし、何かミスをし
    て、他のシステムに影響があったら困るし、課金されても困る。どんなエンジンが
    あるかどうかさえ分かれば、いいのに。こんな時には、AWS CLIを使いましょう。

    1.現在利用中のRDSの情報を出力しよう!

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

    aws rds describe-db-instances

    画像A RDSの情報
                    画像A RDSの情報

    json形式で沢山出力されます。

    2.現在利用中のRDSで出力する情報を絞り込んでみよう!

    オプションのqueryを使用することで絞り込みができます。
    以下の例は、ClassとId,Engine,Endpointのアドレスに絞った例です。
    トップレベルがDBInstanceで(画像C 階層と項目)DBInstanceIdentifer,
    DBInstanceClass,Engineをdict{}に配置し、{EndPoint.Address}を分けて配置
    させます。DBinstanceIdentiferと同列に書くと縦長に配置されて出力されます。

    aws rds describe-db-instances \
    --query "DBInstances[].[{ID:DBInstanceIdentifier,Class:DBInstanceClass,\
    Engine:Engine},{Endpoint:Endpoint.Address}]" \
    --out table

    画像B 項目を絞って出力
                   画像B 項目を絞って出力
                  画像C 項目と階層

    3.利用可能なRDSのEngineとVersion情報を出力しよう!

    利用中のリージョンで、利用可能なRDS一覧を見たい場合に以下のコマンドを実行します。

    aws rds describe-db-engine-versions

    画像D 出力結果
                    画像D 出力結果

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

    4 出力する情報を絞り込んでみよう!

    オプションのqueryを使用することで絞り込みができます。
    以下の例はDBParameterGroupFamilyとEngineversionのみに絞ったものです。
    DBParameterGroupFamilyが、このDBパラメータグループファミリー互換性のある名前で
    EngineVersion が、このエンジンのバージョンです。

    aws rds describe-db-engine-versions \
    --query "DBEngineVersions[*].[{FamiryName:DBParameterGroupFamily,Vesion:EngineVersion}]" \
    --out table

    画像E FamiryNameとVersion出力
                画像E FamiryNameとVersion出力

    queryオプションの設定は以下のようになります 結果は、Json形式で出力されます。
    これを踏まえて絞り込む内容を記述します。
    トップレベルが、DBEngineVersions[*]. (画像F 階層と項目)
    DBEngineVersions[*] .[{FamiryName:DBParameterGroupFamily,Vesion:EngineVersion}]
    下の階層(画像C 階層と項目)DBParameterGroupFamily項目)の値と、EngineVersion項目の値を
    {key1:value,key2:value}のdict形式でフォーマットして、項目名を出力するようにする

    画像F 階層と項目
                   画像F 階層と項目

    5 RDSのエンジンを指定してそのエンジン情報のみ出力しよう!

    5.1 エンジンにaurora-mysqlを指定

    aurora-mysqlのみ出力したい場合は、engineにaurora-mysqlを指定します。
    更にFamiryNameとVesionのみを出力するようにします。

    aws rds describe-db-engine-versions --engine aurora-mysql \
    --query "DBEngineVersions[*].[{FamiryName:DBParameterGroupFamily,Vesion:EngineVersion}]"\
    --out table

    画像G RDS aurora-mysql
                  画像G RDS aurora-mysql

    5.2 エンジンにoracle-eeを指定

    oracleの場合は、oracle-eeとoracle-seが利用可能です。–engineオプション にoracle-ee
    まで指定する必要があります。

    aws ds describe-db-engine-versions --engine oracle-ee \
    --query "DBEngineVersions[*].[{FamiryName:DBParameterGroupFamily,Vesion:EngineVersion}]"\
    --out table

    画像H oracle-ee
                    画像H oracle-ee

    6 VersionUp可能なエンジンを表示しよう!

    6.1 MariaDB 10.2.37からバージョンアップ可能なRDS一覧

    RDSを利用していると、現在利用しているエンジンのバージョンアップを要求される
    ことがあります。どのバージョンにアップしたら良いのか(可能なのか)が
    AWS CLIコマンドで確認できます。以下の例はmariadb 10.2.37からバージョンアップ
    可能なエンジンの一覧を出力するものです。

    echo 'mariadb 10.2.37 up'
    aws rds describe-db-engine-versions \
    --engine mariadb --engine-version 10.2.37 \
    --query "DBEngineVersions[].ValidUpgradeTarget[].[{Des:Description,Auto:AutoUp
    grade,Major:IsMajorVersionUpgrade,UpVersion:EngineVersion}]" \
    --out table

    画像J marriadb 10.2.37からバージョンアップ可能なRDS
         画像J marriadb 10.2.37からバージョンアップ可能なRDS

    queryオプションの指定はトップレベルが(画像K 階層と項目)DBEngineVersions 一つ下の
    レベルがValidUpgradeTargetそこを全て見るのでDBEngineVersions[*].ValidUpgradeTarget[*]
    その下の項目(画像L 指定項目)、Description,AutoUpgrade,IsMajorverVersion,EngineVersion
    をDict形式で指定する

    画像K 階層と項目
                     画像K 階層と項目
    画像L 指定項目
                     画像L 指定項目

    6.2 Oracle-ee 12.1.0.2.v2からバージョンアップ可能なRDS

    以下の例はoracle-ee 12.1.0.2.v2からバージョンアップ可能なエンジンの一覧を出力するものです。

    echo 'oracle-ee 12.1.0.2.v2 up'
    aws rds describe-db-engine-versions \
    --engine oracle-ee --engine-version 12.1.0.2.v2 \
    --query "DBEngineVersions[].ValidUpgradeTarget[].[{Version:EngineVersion,Auto:
    AutoUpgrade,Major:IsMajorVersionUpgrade}]" \
    --out table

    画像M oracle12.0.1.2V2からバージョンアップ可能なRDS一覧
    画像M oracle12.0.1.2.V2からバージョンアップ可能なRDS一覧 (画像を一部加工してます)

    7.感想

    RDSの情報でニーズがありそうな項目を出力するコマンドを実行してみました。
    今利用のバージョンからバージョンアップ可能な物は何があるかは、良く問い合わせがあります。
    何かのお役に立てば何よりです。

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

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

    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/