(AWS CLI)Perlでサブコマンドの一覧を抽出する

最近の私のブームであるAWS CLIで遊んでみます。

AWS CLIのインストールについては省略します。

使用するバージョンはこちら。

ec2-user@ip-abc-abc-abc-abc$ aws --version
aws-cli/2.2.23 Python/3.8.8 Linux/4.14.193-113.317.amzn1.x86_64 exe/x86_64.amzn.2018 prompt/off
ec2-user@ip-abc-abc-abc-abc$

まず、ヘルプをみてみます。

ec2-user@ip-abc-abc-abc-abc$ aws help

AWS()                                                                    AWS()



NAME
       aws -

DESCRIPTION
       The  AWS  Command  Line  Interface is a unified tool to manage your AWS
       services.

SYNOPSIS
          aws [options] <command> <subcommand> [parameters]

       Use aws command help for information on a  specific  command.  Use  aws
       help  topics  to view a list of available help topics. The synopsis for
       each command shows its parameters and their usage. Optional  parameters
       are shown in square brackets.

OPTIONS
       --debug (boolean)

       Turn on debug logging.

       --endpoint-url (string)

       Override command's default URL with the given URL.

       --no-verify-ssl (boolean)

       By  default, the AWS CLI uses SSL when communicating with AWS services.
       For each SSL connection, the AWS CLI will verify SSL certificates. This
       option overrides the default behavior of verifying SSL certificates.

       --no-paginate (boolean)

       Disable automatic pagination.

       --output (string)

       The formatting style for command output.

SYNOPSISが概略ってことで、書式となります。

aws オプション コマンド サブコマンド パラメータ

スペースキーを叩いて、ヘルプを読み進めると、

--no-cli-auto-prompt (boolean)

Disable automatically prompt for CLI input parameters.

AVAILABLE SERVICES
o accessanalyzer

o acm

o acm-pca

o alexaforbusiness

o amp

AVAILABLE SERVICESという見出しがあり、ここからコマンドの一覧が並んでいます。

さらにスペースキーを叩いていくと、最後にSEE ALSOがあり、ここでヘルプは終了です。

       o workmailmessageflow

       o workspaces

       o xray

SEE ALSO
       o aws help topics



                                                                         AWS()

さて、このhelpの出力から、awsのコマンド一覧を抽出してみます。コマンドはサービス名になっているので、サービス一覧にもなりますね。

Perlで抽出スクリプトを書いてみましょう。

ec2-user@ip-abc-abc-abc-abc$ cat aws-help.pl
1	open(IN,"aws help |");
2	foreach(<IN>){
3		print if(/o / and $sts == 1);
4		$sts = 1 if(/AVAILABLE SERVICE/);
5		$sts = 0 if(/SEE ALSO/);
6	}
7	close(IN);
ec2-user@ip-abc-abc-abc-abc$

aws helpの出力からAVIALABLE SERVICEを4行目のif文で発見したら、状態変数stsを1にして、3行目のif分でサービス名を抽出します。

実行してみましょう。

ec2-user@ip-abc-abc-abc-abc$ perl aws-help.pl | head -20
       o accessanalyzer
       o acm
       o acm-pca
       o alexaforbusiness
       o amp
       o amplify
       o amplifybackend
       o apigateway
       o apigatewaymanagementapi
       o apigatewayv2
       o appconfig
       o appflow
       o appintegrations
       o application-autoscaling
       o application-insights
       o applicationcostprofiler
       o appmesh
       o apprunner
       o appstream
       o appsync
ec2-user@ip-abc-abc-abc-abc$

サービス名の上から20個分抽出してみました。

全部で何行あるのでしょうか? wcコマンドで算出します。

ec2-user@ip-abc-abc-abc-abc$ perl aws-help.pl | wc -l
278
ec2-user@ip-abc-abc-abc-abc$

278個もサービス(コマンド)があります。ものすごい数ですね。

s3、EC2、RDSについて、一覧内に存在しているか確認してみましょう。

ec2-user@ip-abc-abc-abc-abc$ perl aws-help.pl | grep 's3\|ec2\|rds'
       o ec2
       o ec2-instance-connect
       o rds
       o rds-data
       o s3
       o s3api
       o s3control
       o s3outposts
ec2-user@ip-abc-abc-abc-abc$

次は、サブコマンドの一覧を抽出してみます。
一覧抽出するためにヘルプ出力の書式を確認します。とりあえずs3のヘルプで確認。

ec2-user@ip-abc-abc-abc-abc$ aws s3 help
S3()                                                                      S3()



NAME
       s3 -

DESCRIPTION
       This  section  explains  prominent concepts and notations in the set of
       high-level S3 commands provided.

   Path Argument Type
       Whenever using a command, at least one path argument must be specified.
       There are two types of path arguments: LocalPath and S3Uri.

(中略)

       SYNOPSIS
                 aws s3 <Command> [<Arg> ...]

       OPTIONS
              None

              See 'aws help' for descriptions of global parameters.

       AVAILABLE COMMANDS
              o cp

              o ls

              o mb

              o mv

              o presign

              o rb

              o rm

              o sync

              o website



                                                                                 S3()
ec2-user@ip-abc-abc-abc-abc$

サブコマンドについても、コマンドと同じく、AVAILABLEほにゃららという見出し以降に一覧が書いてあります。
これを踏まえて、抽出スクリプトを書き換えてみます。

ec2-user@ip-abc-abc-abc-abc$ cat aws-help.pl
1	$cmd=shift @ARGV;
2	open(IN,"aws $cmd help |");
3	foreach(<IN>){
4		print if(/o / and $sts == 1);
5		$sts = 1 if(/AVAILABLE/);
6		$sts = 0 if(/SEE ALSO/);
7	}
8	close(IN);
ec2-user@ip-abc-abc-abc-abc$

1行目で、引数配列から1要素取り出し、サブコマンドの指定があれば、2行目で「aws」と「help」という文字の間にサブコマンドを指定するようにしています。
5行目のAVAILABLE SERVICEについては、AVIALABLE COMMANDにも対応できるように、「AVAILABLE」だけにしました。

s3を指定して実行してみましょう。

ec2-user@ip-abc-abc-abc-abc$ perl aws-help.pl s3
      o cp
      o ls
      o mb
      o mv
      o presign
      o rb
      o rm
      o sync
      o website
ec2-user@ip-abc-abc-abc-abc$

s3のサブコマンドの一覧が表示されました。さきほどaws s3 helpで表示された一覧と一致しています。

今度は、「sns」を指定してサブコマンドを抽出してみます。

ec2-user@ip-abc-abc-abc-abc$ perl aws-help.pl sns
       o add-permission
       o check-if-phone-number-is-opted-out
       o confirm-subscription
       o create-platform-application
       o create-platform-endpoint
       o create-sms-sandbox-phone-number
       o create-topic
       o delete-endpoint
       o delete-platform-application
       o delete-sms-sandbox-phone-number
       o delete-topic
       o get-endpoint-attributes
       o get-platform-application-attributes
       o get-sms-attributes
       o get-sms-sandbox-account-status
       o get-subscription-attributes
       o get-topic-attributes
       o help
       o list-endpoints-by-platform-application
       o list-origination-numbers
       o list-phone-numbers-opted-out
       o list-platform-applications
       o list-sms-sandbox-phone-numbers
       o list-subscriptions
       o list-subscriptions-by-topic
       o list-tags-for-resource
       o list-topics
       o opt-in-phone-number
       o publish
       o remove-permission
       o set-endpoint-attributes
       o set-platform-application-attributes
       o set-sms-attributes
       o set-subscription-attributes
       o set-topic-attributes
       o subscribe
       o tag-resource
       o unsubscribe
       o untag-resource
       o verify-sms-sandbox-phone-number
ec2-user@ip-abc-abc-abc-abc$

さて、サービス一覧、サブコマンド一覧を作ることができるようになったので、次は、すべてのサービスについてサブコマンドの一覧を作りたいと思います。
すべてのサブコマンド一覧を作るにあたり、スクリプトを少し改造します。

ec2-user@ip-abc-abc-abc-abc$ cat -n aws-help.pl
     1	$cmd=shift @ARGV;
     2	open(IN,"aws $cmd help |");
     3	foreach(<IN>){
     4		if(/o (.*)/ and $sts == 1){print "$1\n"};
     5		$sts = 1 if(/AVAILABLE/);
     6		$sts = 0 if(/SEE ALSO|END/);
     7	}
     8	close(IN);
ec2-user@ip-abc-abc-abc-abc$

変更したのは、4行目。各行の「o 」という文字列を削除して、名称のみ抽出するようにしました。

では実行してみます。最初のaws-help.plスクリプト実行結果で得たコマンド一覧をforで、
次のaws-help.plを繰り返し実行します。
実行時間がかかると思うので、timeコマンドも指定しておきます。

ec2-user@ip-abc-abc-abc-abc$ time for i in `perl aws-help.pl`;do perl aws-help.pl $i>>list.txt;done
<string>:: (ERROR/3) Anonymous hyperlink mismatch: 1 references but 0 targets.
See "backrefs" attribute for IDs.

real	3m48.481s
user	3m27.933s
sys	0m19.356s
ec2-user@ip-abc-abc-abc-abc$

3分以上かかりました。
何かエラーが出ましたが、細かいことは気にせず、実行結果を確認してみましょう。
まずは、行数。

ec2-user@ip-abc-abc-abc-abc$ wc -l list.txt
10536 list.txt
ec2-user@ip-abc-abc-abc-abc$

1万行以上ありました。

内容を確認してみます。ランダムに10行みてみます。

ec2-user@ip-abc-abc-abc-abc$ shuf list.txt | head
list-deployment-groups
delete-sql-injection-match-set
delete-disk
search-entities
list-resolver-query-log-configs
help
update-ca-certificate
list-ml-transforms
put-app-instance-retention-settings
update-gateway
ec2-user@ip-abc-abc-abc-abc$

ん〜。これだと、サブコマンドしか表示されていないので、何のサービスのサブコマンドかわかりません。

スクリプトを改造してみます。

ec2-user@ip-abc-abc-abc-abc$ cat -n aws-help.pl
    1	$cmd=shift @ARGV;
    2	open(IN,"aws $cmd help |");
    3	foreach(<IN>){
    4		if(/o (.*)/ and $sts == 1){print "$cmd	$1\n"};
    5		$sts = 1 if(/AVAILABLE/);
    6		$sts = 0 if(/SEE ALSO|END/);
    7	}
    8	close(IN);
ec2-user@ip-abc-abc-abc-abc$

4行目の出力書式を変更してサービス名(コマンド)も表示するようにしました。

出力先をlist2.txtに変えて、同じコマンドを実行してみます。

ec2-user@ip-abc-abc-abc-abc$ time for i in `perl aws-help.pl`;do perl aws-help.pl $i>>list2.txt;done
<string>:: (ERROR/3) Anonymous hyperlink mismatch: 1 references but 0 targets.
See "backrefs" attribute for IDs.

real	3m48.319s
user	3m28.066s
sys	0m19.103s
ec2-user@ip-abc-abc-abc-abc$

同じぐらいの実行時間でした。
生成したファイルのサイズを確認します。

ec2-user@ip-abc-abc-abc-abc$ wc list2.txt
10536  21079 331213 list2.txt
ec2-user@ip-abc-abc-abc-abc$

ファイル行数は、10536行、バイト数は331213Byteでした。

先頭10行を確認してみます。

ec2-user@ip-abc-abc-abc-abc$ head list2.txt
accessanalyzer	apply-archive-rule
accessanalyzer	cancel-policy-generation
accessanalyzer	create-access-preview
accessanalyzer	create-analyzer
accessanalyzer	create-archive-rule
accessanalyzer	delete-analyzer
accessanalyzer	delete-archive-rule
accessanalyzer	get-access-preview
accessanalyzer	get-analyzed-resource
accessanalyzer	get-analyzer
ec2-user@ip-abc-abc-abc-abc$

ランダムに表示。

ec2-user@ip-abc-abc-abc-abc$ shuf list2.txt | head
sesv2	delete-suppressed-destination
iam	tag-mfa-device
lexv2-models	update-slot
customer-profiles	delete-domain
iam	list-mfa-devices
route53-recovery-readiness	update-resource-set
codecommit	create-approval-rule-template
sesv2	get-suppressed-destination
globalaccelerator	update-custom-routing-accelerator
iot	create-topic-rule-destination
ec2-user@ip-abc-abc-abc-abc$

s3のみサブコマンドのみ抽出します。

ec2-user@ip-abc-abc-abc-abc$ grep '^s3\b' list2.txt
s3	cp
s3	ls
s3	mb
s3	mv
s3	presign
s3	rb
s3	rm
s3	sync
s3	website
ec2-user@ip-abc-abc-abc-abc$

これをbash関数にしておけば、いつでも手軽に使うことができます。

ec2-user@ip-abc-abc-abc-abc$ cat -n awshelp.sh
    1	function awshelp(){
    2		grep "^$1\b" list2.txt
    3	}
ec2-user@ip-abc-abc-abc-abc$. awshelp.sh
ec2-user@ip-abc-abc-abc-abc$

logsのサブコマンド一覧を生成してみましょう。

ec2-user@ip-abc-abc-abc-abc$ awshelp logs
logs	associate-kms-key
logs	cancel-export-task
logs	create-export-task
logs	create-log-group
logs	create-log-stream
logs	delete-destination
logs	delete-log-group
logs	delete-log-stream
logs	delete-metric-filter
logs	delete-query-definition
logs	delete-resource-policy
logs	delete-retention-policy
logs	delete-subscription-filter
logs	describe-destinations
logs	describe-export-tasks
logs	describe-log-groups
logs	describe-log-streams
logs	describe-metric-filters
logs	describe-queries
logs	describe-query-definitions
logs	describe-resource-policies
logs	describe-subscription-filters
logs	disassociate-kms-key
logs	filter-log-events
logs	get-log-events
logs	get-log-group-fields
logs	get-log-record
logs	get-query-results
logs	help
logs	list-tags-log-group
logs	put-destination
logs	put-destination-policy
logs	put-log-events
logs	put-metric-filter
logs	put-query-definition
logs	put-resource-policy
logs	put-retention-policy
logs	put-subscription-filter
logs	start-query
logs	stop-query
logs	tag-log-group
logs	tail
logs	test-metric-filter
logs	untag-log-group
ec2-user@ip-abc-abc-abc-abc$

コメント

タイトルとURLをコピーしました