AWS CLIとは、AWSが提供しているコマンドラインツールです。AWSの各種サービスをコマンドラインから操作できます。AWSマネジメントコンソールを使わずに、文字ベースでAWSの操作ができるようになります。AWS CDKなどを使う際にはAWS CLIが必要ですし、最近ではAIエージェントにAWS CLIを操作してもらうのも便利なので、インフラ作業には欠かせない道具です。
しかし弊社では他に使っている人が少ないようなので、AWS CLIについてドキュメント代わりに書きます。
AWS CLIを使うと…
- AWSマネジメントコンソールを触らずに作業できる
- AWS CDKやAWS SAM、Amplify CLI、ECS Execなどを使うために必要
- AIエージェントとの相性も良い
- 環境を作ればプロファイルの切り替えも楽
準備:WSL 2を導入する(Winのみ)
WindowsのコマンドプロンプトやPowershellでもAWS CLIを使うことはできます。できるのですが、Linux環境の方が何かと便利なのでWSLを導入するのがおすすめです。業務でLinuxサーバーを扱うことが多いエンジニアであれば、bashやその他を使う方が便利だと思います。WSL 2はMicrosoftが提供するWindows向けのLinux環境なので、かなり応用が効きます。
WSLでは色んな種類のLinuxをインストールして共存させられますが、Ubuntuが無難でおすすめです。2025年現在、WSLのインストール方法はとても簡単で、管理者権限のPowershellで wsl --install -d Ubuntu
と入力するだけです。詳しくは公式ドキュメントをご覧ください。
https://learn.microsoft.com/ja-jp/windows/wsl/install
それに、最新のWindowsであればWindows Terminal(”ターミナル”っていう名前)が標準で入っています。ターミナルからUbuntuにアクセスすればLinuxの開発環境の出来上がりです。
AWS CLIのインストール
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
Windows にインストールする
「WSLでAWS CLIを使う方がおすすめです」とは書きましたが、後述する saml2aws の都合で Windows にも AWS CLI をインストールしておくと便利です。そのため、私は WSL を使う場合でも Windows に導入しておきます。
WinGetを使って簡単にインストールできます。インストーラーを使う方法もあるので、詳しくは公式ドキュメントを参照してください
winget install -e --id Amazon.AWSCLI
Ubuntu (WSL) にインストールする
WSLのUbuntuに導入するので、WindowsではなくLinux向けのインストールを実施します。こちらも、AWSの公式ドキュメントにある方法そのままでOKです。
なお、 Ubuntuにはunzipが入っていないのでインストールしておきます。ついでに、後ほど必要なfzfや合わせて使うのに便利なjqもここでインストールしておきます。
sudo apt update -y
sudo apt install -y unzip fzf jq
その後は公式ドキュメントを見ながら、適当なディレクトリでインストール手順を実施します。
cd /tmp
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
最後に、WSL環境の場合、AWS CLIを設定する前にシンボリックリンクを作成しておくと便利です。Linux側の設定ディレクトリを、Windows側のフォルダーのシンボリックリンクにすることで、認証やプロファイルの設定を共有できます。パス名の your-user-name
は自分のWindowsのユーザー名に置き換えてください。
ln -s ~/.aws /mnt/c/Users/your-user-name/.aws
プロファイルの追加
AWS CLIをインストールしただけではアカウントの設定などができません。弊社、e2infoではプロジェクトごとにAWSアカウントが色々あるため、認証情報を追加します。
AWS CLIの認証形式は大きく分けて、IAMユーザーと、IAM Identify Center(SSO)の2種類があります。前者のIAMユーザーを使う方法は、権限が強力で有効期限が長い認証情報を保存することになるため、セキュリティ的に非推奨です。ここでは弊社、e2infoでのAWS運用に合っているIAM Identify Center(SSO)を使う方法を紹介します。
自社管理アカウントのプロファイルを追加
AWS アクセスポータルの画面で「アカウント」タブにあるAWSアカウント、つまり自分の所属しているAWS Organizationが管理しているAWS アカウントであればログインが簡単です。
設定は aws configure sso
を実行して、項目を入力してブラウザで認証を行います。なお、URLやリージョンを入力するのは初回のみで、次回以降は SSO session name で “e2info” を指定すると、
SSO session name
: 任意の名前でOKですが、会社名 “e2info” がおすすめですSSO start URL
: AWS アクセスポータルのURL “https://your-org.awsapps.com/start” を入力しますSSO region
: リージョンを指定します。弊社では “ap-northeast-1” ですSSO registration scopes
: 空欄のままでOKです
$ aws configure sso
SSO session name (Recommended): e2info
SSO start URL [None]: https://e2info.awsapps.com/start/#/
SSO region [None]: ap-northeast-1
SSO registration scopes [sso:account:access]:
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open, open the following URL:
https://oidc.ap-northeast-1.amazonaws.com/authorize?response_type=code&client_id=...(略)...
ここまで入力するとブラウザが開き、アクセスを許可の確認画面が表示されます。WSLの場合はブラウザが開かないことがあるので、そのときはターミナルに表示されるURLに自分でアクセスします。
アクセスを許可するとAWS CLIの認証が完了し、続いて使いたいアカウントを選択する画面になります。
カーソルキーでアカウントを選び、エンターキーで決定できます。
その次は “AWSPowerUserAccess” などのロールを選択します。こちらもカーソルキーで選択し、エンターキーで決定します。
最後に、保存するプロファイル名を聞かれます。デフォルトだと分かりづらいので、プロジェクト名などわかりやすい名前をつけるとよいです。
これでAWSのプロファイル追加が完了しました。試しに、提示されている aws sts get-caller-identity --profile profile-name
を実行してみると、AWS CLIで現在使っている認証情報を表示できます。
$ aws sts get-caller-identity --profile AWSPowerUserAccess-123456789012
{
"UserId": "ABCDEFGHIJKLMNOPQRSTU:hoge_fuga@e2info.com",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_AWSPowerUserAccess_xxxxxxxxxxxxxxxx/hoge_fuga@e2info.com"
}
他のアカウントを使いたい場合は、同様の手順で aws configure sso
を実行して別のプロファイルを追加すればOKです。
外部アカウントのプロファイルを追加
AWS アクセスポータルの画面で「アプリケーション」タブにあるAWSアカウント、つまり自分の所属組織が管理していないAWSアカウントの場合、少し面倒な接続手順が必要になります。
管理者にお願いしてIAMユーザーを作ってしまうのが最初は楽ですが、やはりセキュリティ面で望ましくありません。そこで、saml2awsを使ってSSOのまま接続します。
saml2aws をインストール
注意点として WSL に saml2aws をインストールすると、Googleへのログインなど手間が面倒になってしまいます。そのため、WSLを使っている場合でも saml2aws はホストの Windows 側にインストールするのがおすすめです。WSLからでも saml2aws.exe
で Windows 側の saml2aws を実行できます。
Windows では Chocolatey を使って簡単にインストールできます。
https://github.com/Versent/saml2aws
choco install saml2aws
saml2aws の設定
saml2aws の設定は saml2aws configure -a profile-name
で行います。項目は以下の通りです。profile-name
は適当な分かりやすい名前に置き換えてください。
- Please choose a provider: “Browser” を選びます
- AWS Profile: AWS CLIでのプロファイル名を入力します。
profile-name
と同じでもOKです - URL: マネジメントコンソールにログインするURL(後述)を入力します
- Username: 空欄でOKです
- Password: 空欄でOKです
$ saml2aws.exe configure -a profile-name
? Please choose a provider: Browser
? AWS Profile (saml) profile-name
? AWS Profile profile-name
? URL https://e2info.awsapps.com/start/#/saml/default/HogeFuga/ins-xxxxxxxxxxxxxxxx
? URL https://e2info.awsapps.com/start/#/saml/default/HogeFuga/ins-xxxxxxxxxxxxxxxx
? Username
? Username
? Password No password supplied
No password supplied
URLは、AWS アクセスポータルの「アプリケーション」タブにあるログインしたいAWSアカウントのURLをコピーします。
“Configuration saved for IDP account: profile-name” と表示されれば設定はOKです。続いて saml2aws login -a profile-name
で、設定したプロファイルにログインします。UsernameやPasswordは空欄のままEnterキーを押せば、ブラウザが開きます。弊社の場合はGoogleのログイン画面になるので、そこでログインすればsaml2awsで認証できます。
$ saml2aws.exe login -a profile-name
Using IdP Account test to access Browser https://e2info.awsapps.com/start/#/saml/default/HogeFuga/ins-xxxxxxxxxxxxxxxx
To use saved password just hit enter.
? Username
? Password
Authenticating as ...
認証が成功すると、AWS CLIのプロファイルに認証した情報が追加されます。試しに aws sts get-caller-identity --profile profile-name
を実行してみると、AWS CLIで現在使っている認証情報を表示できます。
デフォルトだと認証の有効期限が1時間です。1時間ごとにログインしなくてはならないのは不便なので、設定ファイル C:\Users\username\.saml2aws
(Windowsの場合) を編集して、 aws_session_duration = 3600
の値を 28800 (8時間) などに変更しておくと便利です。設定可能な有効期限はAWS IAMの設定によるので、各アカウントの管理者に確認してください。
(余談) 手動で認証を通す方法
saml2aws を使わずにAWS CLIで外部アカウントのロールを利用したい場合、面倒な手順が必要です。saml2aws が何をやっているのか確かめるためにも実際にやってみると、こんな感じの手順になります。
https://repost.aws/ja/knowledge-center/aws-cli-call-store-saml-credentials
まず、アクセスポータルのページでChromeの開発者ツールを開き、ネットワークタブにしておきます。
そして、利用したいアプリケーションを開き、マネジメントコンソールにログインします。そのときのネットワークタブに表示されるリクエストボディのパラメータから SAMLResponse を探し、値をコピーして samlresponse.txt などのテキストファイルに保存します。
そのSAMLレスポンスを利用して AWS CLI で assume-role-with-saml します。以下のコマンドの role-arn
と principal-arn
は適宜置き換えてください
$ aws sts assume-role-with-saml --role-arn "arn:aws:iam::123456789012:role/YourRoleName" --principal-arn "arn:aws:iam::123456789012:saml-provider/YourProviderName" --saml-assertion file://samlresponse.txt
{
"Credentials": {
"AccessKeyId": "ABCDEFGHIJKLMNOPQRST",
"SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SessionToken": "VERY_VERY_LONG_TOKEN",
"Expiration": "2025-09-22T07:51:04+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "ABCDEFGHIJKLMNOPQRSTU:hoge_fuga@e2info.com",
取得した認証情報で AWS CLI を利用できます。~/.aws/credentials
に記載するか、次のようにして環境変数で設定します。すると、 aws sts get-caller-identity
で正しく認証できていることを確認できます
$ export AWS_ACCESS_KEY_ID="ABCDEFGHIJKLMNOPQRST"
$ export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$ export AWS_SESSION_TOKEN="VERY_VERY_LONG_TOKEN"
$ aws sts get-caller-identity
{
"UserId": "ABCDEFGHIJKLMNOPQRSTU"
...略
とはいえ、AWS CLIを使うためにブラウザの開発者ツールを開いてファイルを作成して……と毎回実施するのは現実的ではありません。外部ツールの saml2aws を使うのがおすすめです。
WSLでAWS CLIを使いやすくするためのTips
BROWSER環境変数を設定する
WSLでは aws sso login
したときにブラウザが開かないことがあります。BROWSER環境変数を設定しておくと、Windowsのブラウザを開くようにできます。.bashrc に次の行を追加しておくのがおすすめです。
export BROWSER='/mnt/c/Program Files/Google/Chrome/Application/chrome.exe'
AWS CLIの補完を有効にする
AWS CLIの補完を有効にしておくと、プロファイル名やコマンド名の補完ができて便利です。環境変数と同じく .bashrc に次の行を追加しておきます。
complete -C '/usr/local/bin/aws_completer' aws
fzfでプロファイルを選択できるようにする
AWS CLIでは AWS_PROFILE
環境変数で使うプロファイルを切り替えられます。複数のアカウントを使い分けるために環境変数を切り替えるのは手間なので、プロファイルをfzfで選択できるようにしておくと便利です。 .bashrc に次の関数を追加しておきます。
function awsp() {
local profile
profile=$(aws configure list-profiles | fzf --prompt='AWS Profile> ' --height 10 --layout=reverse --border) && export AWS_PROFILE=$profile
if [ -n "$profile" ]; then
echo "AWS_PROFILE: $profile"
else
echo "AWS_PROFILE: <未選択>"
fi
}
“AWS CLI プロファイル fzf” で検索すればもうちょっと便利な関数を公開されているブログ記事があるので、それを使うのがおすすめです。
実際に使ってみる
AWS CLIをインストールするといろいろなことができるようになります。
例えば、起動中のEC2インスタンスについて、インスタンスID、名前、パブリックIPアドレスを確認したいときは次のコマンドになります。
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value | [0],PublicIpAddress,State.Name]' --filters 'Name=instance-state-name,Values=running' --output table
-------------------------------------------------------------------------------------------
| DescribeInstances |
+----------------------+-------------------------------------+-----------------+----------+
| i-xxxxxxxxxxxxxxxxx | Dev/OWASP ZAP/Windows2019 | 99.999.999.999 | running |
| i-yyyyyyyyyyyyyyyyy | Prod/Chatbot/AL2/PHP7/MariaDB | None | running |
| i-zzzzzzzzzzzzzzzzz | Test/Chatbot/AL2/PHP7/MariaDB | None | running |
+----------------------+-------------------------------------+-----------------+----------+
別の例としては、 aws s3 cp
を使うとローカルに保存されているファイルをS3にアップロードしたり、逆にダウンロードしたりできます。
$ aws s3 cp ./local-file.txt s3://your-bucket-name/remote-file.txt
upload: ./local-file.txt to s3://your-bucket-name/remote-file.txt
$ aws s3 cp s3://your-bucket-name/remote-file.txt ./downloaded-file.txt
download: s3://your-bucket-name/remote-file.txt to ./downloaded-file.txt
また別の例として、RDSのDBインスタンスの空き容量を確認するには、次のようにCloudWatchのメトリクスを取得することで可能です。
$ aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name FreeStorageSpace \
--dimensions Name=DBInstanceIdentifier,Value=DATABASE_ID \
--start-time $(date -u -d '5 minutes ago' +"%Y-%m-%dT%H:%M:%SZ") \
--end-time $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
--period 60 \
--statistics Average \
--unit Bytes \
--query 'Datapoints[0].Average' \
--output text | awk '{printf "%.2f GiB\n", $1 / 1073741824}'
12.34 GiB
こういったコマンドはパラメータが多かったり、クエリ(EC2の例)が複雑で難しかったりするのですが、GeminiやGitHub Copilot CLIを活用すれば簡単にできます。
まとめ
現状としてはAIエージェントがAWS APIを直接操作するのはリスキーなので、人間もAIも読み書きしやすいAWS CLIを使うのが一番ベターだと思います。AI関係なくとも、いろいろ便利なので一通りAWS CLIを使えるようにしておくのがおすすめです。