最近の私のブームである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$
コメント