AWS CLIでAPIが提供されているAWSサービス名(サブコマンド名)を全て取得する方法の備忘録です。
はじめに
aws ec2やaws s3のように、aws XXXのXXX部分に当たるサービス名の全量を列挙したいケースがありました。
やり方をまとめます。
# AWS CLIバージョン $ aws --version aws-cli/2.11.2 Python/3.11.2 Darwin/23.6.0 exe/x86_64 prompt/off
The English translation of this post is here.
AWS CLIで利用可能な全サービス名を取得する
やり方
下記コマンドでAWS CLIで利用可能な全サービス名を取得可能です。
# サービス名一覧を取得する場合 aws help | col -bx | sed -n '/AVAILABLE SERVICES/,/SEE ALSO/p' | grep 'o ' | awk '{print $2}' # サービス名一覧をJSON配列で取得する場合 aws help | col -bx | sed -n '/AVAILABLE SERVICES/,/SEE ALSO/p' | grep 'o ' | awk '{print $2}' | jq -R . | jq -s .
パイプ|で繋がっているそれぞれの処理内容:
aws help
AWS CLIのhelpページには、利用可能なサービスの一覧が記載されています。 ここからサービス一覧の抽出を行っていきます。col -bx
これはAWS CLIのhelpページから制御文字(backspace)を取り除いた上で、タブをスペースに展開するコマンドです。 backspaceが入り込んだままだと、helpページ内容をうまくテキスト処理できません。 詳細は別記事にまとめたので、こちらをご覧ください: AWS CLIのhelp結果がgrepできない問題の対処法 - BioErrorLog Tech Blogsed -n '/AVAILABLE SERVICES/,/SEE ALSO/p'
sedでAVAILABLE SERVICESからSEE ALSOまでの範囲だけを抜き出します。 ここにサービス一覧が記載されています。grep 'o '
抽出したブロックから、文字oの後に半角スペースがある行('o ' を含む行)だけを拾います。 AWS CLIヘルプページのサービス一覧は、o acm-pcaのように'o 'を箇条書きマーカーとして使っているためです。awk '{print $2}'
各行を空白区切りでフィールド分割し、2番目のフィールドだけを出力します。 先述の通り各行はo <サービス名>なので、$1 がo、$2 がサービス名です。jq -R .
-Rは--raw-inputです。 これによって、各行を生の文字列として受け取り、JSONの文字列にそのまま変換します(フィルタ.は「そのまま出す」の意味)。jq -s .
-s(--slurp)は、すべての入力行をまとめて配列にするオプションです。 これによって、文字列がJSON配列で出力できます。
実行例
ではまず、一つ目のコマンドでサービス名一覧を取得します。
$ aws help | col -bx | sed -n '/AVAILABLE SERVICES/,/SEE ALSO/p' | grep 'o ' | awk '{print $2}' accessanalyzer account acm acm-pca alexaforbusiness amp amplify # ~中略~ workdocs worklink workmail workmailmessageflow workspaces workspaces-web xray
サービス名一覧が文字列で取得できました。
次に、二つ目のコマンドでサービス名一覧をJSON配列で取得します。
$ aws help | col -bx | sed -n '/AVAILABLE SERVICES/,/SEE ALSO/p' | grep 'o ' | awk '{print $2}' | jq -R . | jq -s . [ "accessanalyzer", "account", "acm", "acm-pca", "alexaforbusiness", "amp", "amplify", # ~中略 "worklink", "workmail", "workmailmessageflow", "workspaces", "workspaces-web", "xray" ]
このように、サービス名一覧がJSON配列で取得できたことがわかります。
おわりに
以上、AWS CLIで利用可能な全サービス名をコマンドで取得する方法をまとめました。
どなたかの参考になれば幸いです。
[関連記事]