AWS CLI を使いこなそう !
~ 2 種類の補完機能 / aws sso / yaml-stream の紹介
Author : 杉本 圭太
こんにちは!テクニカルトレーナーの杉本圭太です!
最近読んで面白かった漫画は「思えば遠くにオブスクラ」と「一級建築士矩子の設計思考」です。
いきなりですがみなさん、AWS コマンドラインインターフェース (AWS CLI) を使用していますか ? ブラウザで操作できる AWS マネジメントコンソールはもちろん便利ですが、ちょっとした操作を自動化したい時やリソースの情報をテキスト形式で取得したいような場合に AWS CLI はとても役に立ちます !
しかし AWS CLI を使ったことはあるけれど「いつも決まったコマンドを実行するだけ」や「必要最低限の作業のみ」で、使いこなせているとは言えないなと感じる方も多いのではないでしょうか ?
そこで今回はそういった「AWS CLI をなんとなく使っている」状態を打破して「AWS CLI を活用してます !」と自信を持って言えるようにしていくため、私が便利だと感じる AWS CLI の以下の機能を紹介していきます !
- 2 種類あるコマンド補完とその特徴
- aws sso で IAM ユーザーのアクセスキー発行や credentials ファイルの手動管理を不要にする
- --output yaml-stream でデータサイズの大きい実行結果を効率的に取得
なお --query を使って出力をフィルタする機能も便利で使いこなしてほしいのですが、それだけを 1 つの記事にまとめたものとして別途出す予定です。お楽しみに !
それでは一緒により良い AWS CLI 生活を送ることで日々の業務を効率化していきましょう ! ポチッとな (*б_б)ヘ_/ < aws help
AWS CLI の基本
まずは使い方を確認しておきましょう。AWS CLI を使用する前提条件やインストール方法は 開始方法 を確認してください。また AWS Skill Builder の Introduction to AWS Command Line Interface (CLI) のコースでインストール、設定、使用方法の基本を学べますので併せて参考にしてください !
※ AWS CLI は 2023年 5 月時点でバージョン 1 とバージョン 2 がありますが、この記事では現在使用を推奨しているバージョン 2 の機能や使い方を紹介します。
使い方
AWS CLI のコマンド構造 は <command> に AWS のサービス、<subcommand> にサービスに対する操作、[option and parameters] に共通のオプションや操作に必要なパラメータを指定します。
aws <command> <subcommand> [options and parameters]
▼ セキュリティグループを作成するコマンド例
aws ec2 create-security-group —group-name my-sg —description "My security group"
認証情報
AWS の API には リクエスト署名の解説記事 にも書いた通り、認証情報が必要です。AWS CLI を使用する場合は 認証情報の設定と優先順位 が決まっており、個人の端末からであれば OS のホームディレクトリに以下のファイルを使用して設定することがあります。
Linux もしくは macOS の場合の配置場所 | Windows の場合の配置場所 | 役割 | |
AWS CLI 設定ファイル (config ファイル) | ~/.aws/config | C:\Users\USERNAME\.aws\config | IAM Identity Center を使用して認証情報を扱う場合の設定、デフォルトで使用するリージョンや出力形式などを記載。 |
AWS CLI 認証情報ファイル (credentials ファイル) | ~/.aws/credentials | C:\Users\USERNAME\.aws\credentials | IAM ユーザーや IAM ロールのアクセスキーなどを記載。IAM Identity Center を使用する場合、credentials ファイル自体は無くても良い。 |
詳細は ファイルのフォーマット を見ていただきたいのですが、config ファイルのポイントと記載例を紹介します。
- aws s3 ls のように AWS CLI を実行すれば、config ファイルの [default] に記載された認証情報が使用される
- config ファイルで [profile xxx] のように「名前付きプロファイル」を用意し、aws s3 ls --profile xxx といった形式で --profile オプションを指定して AWS CLI を実行すれば、デフォルトとは別のアカウントや別のロールを実行時に切り替えられる
▼ config ファイルの記載例
[default]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = readOnly
region = us-west-2
output = text
[profile user1]
sso_session = my-sso
sso_account_id = 444455556666
sso_role_name = Team3Developer
output = yaml
[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access
config ファイルや credentials ファイルは こちら にある通り aws configure コマンドで設定できます。aws configure は サブコマンドもいくつか用意 されており、 aws configure list-profiles でプロファイル名の一覧を表示する機能などがあります。
基本をおさらいしたところで、今回の本題である AWS CLI を使う上で役立つ情報を見ていきましょう !
2 種類あるコマンド補完とその特徴
AWS CLI を使っている多くの方は「サブコマンドやパラメーター名を全部覚えていられない」や「覚えていても、そもそも入力する文字数が長くて大変」と感じていませんか ?
これらを楽にするために AWS CLI にはコマンド補完の機能があるのですが、ユーザーガイドを読み込んでみると「Tab キーを使ったコマンド補完」と「自動プロンプト」があります。つまり、
コマンド補完は「2 種類」あったッ !
ということに気づきます。片方だけ使うでも併用するでも良いのですが、それぞれの特徴と個人的なおすすめポイントを紹介していきます !
Tab キーを使ったコマンド補完
こちらはバージョン 1 でも使用できた機能で、Linux や macOS の場合はシェルの complete コマンド (bash や zsh など使用しているシェルによって設定方法が少し異なります)、Windows の場合は Register-ArgumentCompleter で設定します。それぞれの設定方法は こちら を確認してください。
Linux や macOS で AWS CLI をインストール時にパス指定しなかった場合であれば、/usr/local/bin/ にパスが通っていることを確認して以下の通りに設定します。
▼ bash の場合、以下を ~/.bashrc に追加する
complete -C '/usr/local/bin/aws_completer' aws
▼ zsh の場合、以下を ~/.zshrc に追加する
autoload bashcompinit && bashcompinit
autoload -Uz compinit && compinit
complete -C '/usr/local/bin/aws_completer' aws
設定をした後に新たにシェルを開けば、AWS CLI のコマンドを入力している途中に Tab キーを押すとサービス名やサブマンド、オプションやパラメーターなど、残り部分の自動入力やその後に続く可能性のある入力値の一覧を表示してくれます。
AWS CLI 以外でもコマンドライン操作をされている方は、他と同じ慣れた使い方でコマンド補完ができます。
▲ Tab キーを使いながら、最終的に「aws dynamodb list-tables --profile xxx」を実行する
(画像をクリックすると拡大します)
そしてバージョン 2 では、サブコマンドによってはパラメーターで AWS リソースを指定する場合に扱えるリソース名の一覧も Tab キーを押せば表示してくれます !
▲ 「describe-table --table-name」の後に Tab キーを押してリソース名の候補を表示する
(画像をクリックすると拡大します)
リソースを指定してコマンドを実行する必要がある場合、その前にリスト系の操作をしてからリソース名の正しい値を確認する手間が省けますね !
自動プロンプト
こちらはバージョン 2 で使用できる機能で、使用したい場合は環境変数や AWS CLI のオプション、config ファイルのいずれかで設定します。それぞれの設定方法は こちら を確認してください。
自動プロンプトを使用したい場合はどの OS やどのシェルを使用しているかは気にせず、config ファイルに cli_auto_prompt = on-partial を追加するだけでもすぐに使い始められます !
この設定をした場合は AWS CLI のコマンドの構文が完成していない状態で Enter キーを押すと、コマンドを入力していた行の下にプロンプトが現れます。そのプロンプトの中で残り部分の自動入力やその後に続く可能性のある入力値の一覧を表示させながら、最終的に実行したいコマンドを作り上げていくような使い勝手です。
▲ 補完を使いながら aws dynamodb list-tables --profile dev を実行する
Tab キーを使ったコマンド補完より便利だなと私が感じる部分はこのあたりです !
- プロンプトで候補のパラメーター名の横に (required) を表示してくれるので、入力が必須のパラメーターがわかる
- オプションやパラメーターの提案に、その役割の簡潔な説明も表示される
- 完全一致ではなくてもいくつか候補が表示される
- パラメーターの説明に [boolean] , [list] , [map] , [string] のように型を表示してくれる
- --query の補完では、サブコマンドを入力していればそのレスポンスに含まれる要素を候補として表示してくれる (ネストされている要素も . を使えば表示可能)
「aws dy」など AWS CLI のコマンドとして実行できない途中状態で Enter を押すと、その時点からプロンプトが現れて続きを補完しながら入力していけます。
▲「describe-table --table-name」の後にスペースを入力するとリソース名の候補が表示される
ただしこの機能を使用して AWS CLI のコマンド実行した後に Linux の history コマンドで履歴表示を使った場合、Enter を押してプロンプトを出した段階のコマンドが履歴に残ることは知っておきましょう。
例えば aws dy で Enter キーを押すとプロンプトが現れ、最終的にプロンプト上で完成させた aws dynamodb describe-table --table-name comic --query Table.KeySchema を実行したとします。そしてその後、同じコマンドを実行するためにコマンド履歴を辿った時には aws dy の履歴しか残っていません。そのため Ctrl + r や上ボタンを押して同じコマンドをよく再実行される方は、自動プロンプトの場合そういった使い方はできません。
ちなみに環境変数か config ファイルで自動プロンプトを設定する場合は、on もしくは on-partial の 2 つのモードがあります。
- on-partial : Enter キーを押すと、AWS CLI のコマンドが文法として不完全の場合だけプロンプトが現れる。コマンドが文法として成立している場合に Enter キーを押すと、そのままコマンドが実行できる。
- on : Enter キーを押すと、AWS CLI のコマンドが文法として完全化不完全に関わらず、必ずプロンプトが現れる。コマンドが文法として成立している場合であっても、Enter キーを押すとプロンプト画面でさらに Enter キーを押す作業を挟む必要がある。
個人的にはある程度 Tab キーで補完をしていってコマンドが完成したらそのまま Enter で実行したいので、on-partial を設定しています。また、シェルスクリプトを実行する場合に 自動プロンプトのモードが on になっていると、途中で処理が止まってしまうので気をつけましょう !
これで毎回 コマンドリファレンス を確認したり、help コマンドを実行する手間を減らせますね !
aws sso で IAM ユーザーのアクセスキー発行や credentials ファイルの手動管理を不要にする
個人の端末からAWS CLI を使うときは IAM ユーザーのアクセスキーを発行しないといけないと思っている方はいませんか ?
なんと AWS IAM Identity Center (AWS Single Sign-On の後継) を使用すれば、できるだけ避けるように案内されている IAM ユーザーのアクセスキー (長期的な認証情報) の発行や、credentials ファイルの手動管理からおさらばできます !
この機能を使用するには config ファイルに設定をするのですが、2023 年 5 月現在では以下の 2 種類の設定方法 があります。
- 取得した認証トークンの期限が切れると自動で更新してくれる「SSO トークンプロバイダー設定」(推奨)
- 取得した認証トークンの期限が切れると再ログインを手動でする必要がある「レガシー設定」
今回は現時点で推奨されている「SSO トークンプロバイダー設定」を簡潔に紹介します。
まずは AWS CLI で AWS IAM Identity Center の認証を使えるように設定します。
- AWS CLI のバージョンを最新 にする。
- AWS IAM Identity Center のユーザーポータルにログインできるユーザーを用意する。
- aws configure sso を実行し、設定に必要な情報 (使用するユーザーポータルの URL や AWS アカウント、IAM ロールなど) が求められるので入力していく (途中でブラウザを開いての入力も求められます)。
すると config ファイルに以下のような内容が書き込まれます。
▼ aws sso を使用する場合の config ファイルの記載例
[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json
[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://example-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access
- プロファイルの中は、AWS アカウント番号や IAM ロールの名前などを設定します
- さらにプロファイルの中に sso_sessin = xxx を用意し、[sso-session xxx] の部分と同じ値を入れます
- [sso-session xxx] の中には、AWS IAM Identity Center のユーザーポータルの URL などを設定します
- sso_registration_scopes = の値は、自分のアカウント番号などは関係なく sso:account:access を固定値として入れて OK です
設定した認証情報で AWS CLI を使用したい場合は、まず aws sso login を実行しましょう !
aws sso login --profile my-dev-profile
するとデフォルトのブラウザでログインなどが求められます。 ブラウザが使えない環境でも、別端末でブラウザを開いて入力するための情報が表示されるので、リモートのサーバー上からでも config ファイルさえあればシングルサインオンができるのは嬉しいですね !
あとはいつも通り AWS CLI を使用するだけです ! これで AWS CLI のためのアクセスキーを用意するなど、必要以上に認証情報を自分で管理する必要が無くなりました !
aws s3 ls --profile my-dev-profile
IAM Identity Center を使っている場合は、AWS CLI のためだけに IAM ユーザーのアクセスキーを発行するなんてことをしなくて済むのでおすすめです !
※ aws sso login を実行して認証が成功すると、.aws ディレクトリ内に一時的に認証情報が配置されるので、そのファイルを漏洩させないようには注意してください。
--output yaml-stream でデータサイズの大きい実行結果を効率的に取得
AWS CLI で実行結果のサイズが大きい場合に「PC が固まってしまった !」という経験をされたことはありませんか ?
そんな時、AWS CLI の 出力形式 の設定で解決できるかもしれません !
AWS CLI の出力形式は以下の 5 つがあります。config ファイルでデフォルトの設定ができ、--output オプションで実行時に指定もできます。
- json
- yaml
- yaml-stream
- text
- table
この中でも yaml-stream は他の出力形式とは大きく異なる特徴を持っています。yaml-stream 以外はコマンドの実行すると、AWS 側の実行結果をまとめて 1 つのレスポンスで受け取ります。しかし yaml-stream は名前にもあるようにストリームで実行結果を受け取る、つまり 1 つの実行結果を複数のレスポンスで分割しながら受け取ります。
簡略図ではありますが、それぞれの動きが想像しやすいように図を描いてみました 〆(・д・。)
▲ API の実行結果を一度で受け取る場合 (yaml-stream 以外)
(画像をクリックすると拡大します)
▲ API の実行結果をストリームで受け取る場合 (yaml-stream)
(画像をクリックすると拡大します)
これの何が嬉しいかというと、大量のデータ (例えば Amazon S3 のバケットの中に大量のオブジェクトが入っていて、そのオブジェクトキーの一覧) を取得したい場合、ストリームで実行結果を受け取らない場合、レスポンスを受け取るまでの時間が遅くなったり、PC やサーバーのメモリを大量に消費してしまう可能性があります。
そういったコマンドを実行する時は --output yaml-stream を使ってあげると「PC が固まった !」といった問題を改善できるかもしれないので、困っていた方は試してみてください ! デフォルトに設定しておけば、意図せずに大きなデータを受け取るときも安心ですね !
まとめ
今回は AWS CLI を使う時に役立つ 3 つ紹介しましたが、他にも よく使うコマンドを簡潔に実行できる aliases や、一部のコマンドで使用できる、AWS CLI で UI が用意された wizard なども面白いので興味があれば調べてみてください !
筆者プロフィール
杉本 圭太
アマゾン ウェブ サービス ジャパン合同会社
トレーニングサービス本部 テクニカルトレーナー
新しいことを知るのが好きなので、多くの人に「AWS を知るのは面白い ! もっと学んでみよう ! 活用しよう !」と思っていただけるよう工夫しながらテクニカルトレーナーをしています。
最近は面白い漫画が増えすぎていて、時間が足りなくて困っています。
AWS を無料でお試しいただけます