I’m a Senior Software Engineer living in Berlin. Shifting limits based on quality and robustness. Cutting edge software development. Defining durable and flexible interfaces. Creating rich and intuitive user experiences.

AWS Context Switch with Tab Autocompletion

How to add tab autocompletion for a custom awsctx command in Zsh (like kubectx)

If you frequently switch between multiple AWS profiles, you’ve likely wished for a quicker, more intuitive way to manage them from the command line. Inspired by tools like kubectx for Kubernetes, this guide walks you through setting up a custom awsctx command with tab autocompletion using Zsh and Bash completion utilities.

By the end of this guide, pressing <Tab> after typing awsctx will autocomplete AWS profile names—dramatically improving speed and accuracy when working with the AWS CLI.

Step 1: Create the awsctx Function

In your ~/.zshrc, define the awsctx function. This will let you switch AWS profiles using either an argument or an interactive FZF-based selector:

function awsctx() {
  if [ -z "$1" ]; then
    profile=$(aws configure list-profiles | fzf)
    if [[ $profile != "" ]]; then
      export AWS_PROFILE=$profile
    fi
  else
    export AWS_PROFILE=$1
  fi
  echo -e "\033[32m$AWS_PROFILE\033[0m selected"
}
  • If no profile name is given, it launches fzf for fuzzy selection.
  • Otherwise, it sets AWS_PROFILE directly.
  • The selected profile is displayed in green for clarity.

Step 2: Enable Bash Completion in Zsh

To use traditional Bash completion utilities inside Zsh, you need to enable them:

autoload -Uz compinit && compinit
autoload -Uz bashcompinit && bashcompinit

Place these in your ~/.zshrc before sourcing the completion script.

Step 3: Write the Autocompletion Script

Create a file named ~/.zsh/completions/_awsctx_completion with the following contents:

#/usr/bin/env bash

_awsctx_completion() {
  if [ "${#COMP_WORDS[@]}" != "2" ]; then
    return
  fi

  local profiles=($(compgen -W "$(aws configure list-profiles)" "${COMP_WORDS[1]}"))

  if [ "${#profiles[@]}" == "1" ]; then
    local profile=$(echo ${profiles[0]/%\ */})
    COMPREPLY=("$profile")
  else
    COMPREPLY=("${profiles[@]}")
  fi
}

complete -F _awsctx_completion awsctx

Then make it executable:

chmod +x ~/.zsh/completions/_awsctx_completion

This script leverages compgen, a Bash builtin used to generate possible completion matches. It filters AWS profile names using the current partial input.

Step 4: Source the Script in .zshrc

Still in your ~/.zshrc, source the autocompletion script so it’s loaded into your shell session:

source $HOME/.zsh/completions/_awsctx_completion

Your final .zshrc additions should look like this:

function awsctx() {
  if [ -z "$1" ]; then
    profile=$(aws configure list-profiles | fzf)
    if [[ $profile != "" ]]; then
      export AWS_PROFILE=$profile
    fi
  else
    export AWS_PROFILE=$1
  fi
  echo -e "\033[32m$AWS_PROFILE\033[0m selected"
}

autoload -Uz compinit && compinit
autoload -Uz bashcompinit && bashcompinit
source $HOME/.zsh/completions/_awsctx_completion

Test It Out

Restart your terminal or reload your .zshrc:

source ~/.zshrc

Then type:

awsctx <Tab>

You should see all available AWS profiles populated dynamically!

How It Works

  • compgen dynamically generates matching profile names using your current input.
  • COMP_WORDS contains the current command-line arguments; this is used to determine context.
  • COMPREPLY returns the list of completion options to Zsh.
  • complete -F registers your function for the awsctx command.

Although written in Bash, this works in Zsh via bashcompinit, which bridges Bash-style completion scripts into Zsh environments. For more background, check out resources like:

Bonus Tips

  • Use a plugin manager like zinit, antidote, or oh-my-zsh to manage your custom functions and completions more cleanly.
  • For cross-shell compatibility (Bash, Zsh, etc.), abstract completion into reusable scripts.
  • Combine with tools like direnv to auto-load profiles per project directory.

With this setup, switching AWS profiles becomes just as easy as working with Kubernetes contexts using kubectx. Give it a try—and never mistype an AWS profile again.