こんにちは。あやかです。

友達がターミナルでexport AWS_PROFILE=って打ったときに、Tabキーでプロファイル名がサクッと補完されるのを見て「いいなぁ」と思っていたんです。でも、設定するのが面倒で後回しにしていました。

今回、思い切って記事にすることで自分を追い込んで、実際に設定してみることにしました。

やりたかったこと

私はAWS CLIで複数のプロファイルを使い分けています。具体的には、hinatato-RO(ReadOnly権限)とhinatato-PU(PowerUser権限)をスイッチロールで切り替えて使う構成です。

毎回export AWS_PROFILE=hinatato-ROとか手打ちするのは面倒なので、以下の2つを補完できるようにしたいと思っていました。

  1. export AWS_PROFILE=の後でプロファイル名を補完
  2. aws s3などのサブコマンドを補完

実装前の環境確認

まず、現在の環境を確認しました。

AWS CLIのバージョン

aws --version
aws-cli/2.33.17 Python/3.13.12 Darwin/25.2.0 source/arm64

Homebrew経由でインストールしたAWS CLI v2を使っています。

プロファイル構成

~/.aws/configはこんな感じです。

[default]
region = ap-northeast-1

[profile hinatato-RO]
region = ap-northeast-1

[profile hinatato-PU]
region = ap-northeast-1

シンプルに3つのプロファイルがある状態です。

既存の.zshrc

補完機能を設定する前の.zshrcはこんな感じでした。

# Created by `pipx` on 2026-02-07 01:11:12
export PATH="$PATH:/Users/ayaka/.local/bin"
# Added by LM Studio CLI (lms)
export PATH="$PATH:/Users/ayaka/.lmstudio/bin"
# End of LM Studio CLI section
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
# zsh-autosuggestions
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
eval "$(starship init zsh)"
TMOUT=1
TRAPALRM() {
    zle reset-prompt
}

AWS関連の設定は何も入っていませんでした。

実装手順

1. aws_completerの場所を確認

まず、AWS CLIの補完ツールがどこにあるか確認しました。

which aws_completer
/opt/homebrew/bin/aws_completer

Homebrewでインストールしたので、/opt/homebrew配下にありました。

2. zsh用の補完ファイルを探す

Homebrew版のAWS CLIには、zsh専用の補完ファイルが用意されていることが分かりました。

find /opt/homebrew/Cellar/awscli -name "_aws" 2>/dev/null
/opt/homebrew/Cellar/awscli/2.33.17/share/zsh/site-functions/_aws

このファイルを使うのが一番確実そうです。

3. .zshrcに設定を追加

.zshrceval "$(starship init zsh)"に、以下を追加しました。

# ===== AWS CLI補完設定 =====
# zsh補完システムを有効化
autoload -Uz compinit && compinit

# Homebrew管理下の補完ファイルのパスを追加
fpath=(/opt/homebrew/share/zsh/site-functions $fpath)

# AWS CLI補完を有効化(Homebrew版のzsh補完ファイルを使用)
if [ -f /opt/homebrew/Cellar/awscli/2.33.17/share/zsh/site-functions/_aws ]; then
    source /opt/homebrew/Cellar/awscli/2.33.17/share/zsh/site-functions/_aws
fi

# AWS_PROFILE環境変数の補完を追加
_aws_profiles() {
    local profiles
    profiles=($(grep -E '^\[profile' ~/.aws/config | sed 's/\[profile \(.*\)\]/\1/' | tr '\n' ' '))
    profiles+=(default)
    _describe 'aws profiles' profiles
}

# export AWS_PROFILE= の後で補完を有効化
compdef _aws_profiles -value-,AWS_PROFILE,-default-
# ===== AWS CLI補完設定ここまで =====

4. 設定を反映

source ~/.zshrc

エラーが出なければOKです。

動作確認

AWS_PROFILEの補完

export AWS_PROFILE=

ここまで入力してTabキーを押すと…

AWS_PROFILEの補完候補
AWS_PROFILEの補完候補

ちゃんとdefaulthinatato-ROhinatato-PUが候補として表示されました!

aws s3サブコマンドの補完

aws s3 

ここまで入力してTabキーを押すと…

aws s3サブコマンドの補完候補
aws s3サブコマンドの補完候補

lscpmbsyncなどのサブコマンドがずらっと表示されました。

ハマったポイント

実装中にいくつかハマったポイントがありました。

bash用のcompleteコマンドが使えない

最初、ネットで見つけたサンプルをそのまま使おうとしたら、こんなエラーが出ました。

/Users/ayaka/.zshrc:18: command not found: complete

これはbash用のcompleteコマンドをzshで使おうとしたのが原因でした。zshでbashの補完を使う場合は、autoload bashcompinit && bashcompinitを先に実行する必要があります。

ただ、今回はHomebrew版のAWS CLIにzsh専用の補完ファイル(_aws)が用意されていたので、そちらを使う方がスマートでした。

aws_completerが直接動かない

試しにaws_completerを直接実行してみたら、何も出力されませんでした。

aws_completer "aws s3 "

これは環境変数COMP_LINECOMP_POINTを指定する必要があったからです。

COMP_LINE="aws s3 " COMP_POINT=7 aws_completer

こうすると、ちゃんとサブコマンド一覧が出力されました。でも、結局はzsh専用の補完ファイルを使ったので、この問題は解消されました。

まとめ

zshでAWS CLIの補完機能を有効化してみました。

特にexport AWS_PROFILE=の後でプロファイル名を補完できるようになったのが便利です。

設定自体は.zshrcに10行ちょっと追加するだけなので、同じようにAWS CLIを使っている人は試してみるといいかもしれません。

ようやく重い腰を上げて設定しましたが、もっと早くやっておけばよかったなと思いました。こういう小さな効率化の積み重ねって、地味に大事ですよね。

それでは、また。