[shell-common] Update AWS commands

This commit is contained in:
2025-12-28 20:38:05 +00:00
parent 2e7ee17412
commit 2182b879c3

View File

@@ -87,31 +87,24 @@ function awslogin() {
return 2 return 2
fi fi
echo "AWS login successful. Credentials exported." echo "AWS login successful. Credentials exported."
export AWS_PROFILE_ACTIVE="$profile" export AWS_PROFILE="$profile"
if [[ -n "$profile" ]]; then
export AWS_PROFILE_DISPLAY="[aws: $profile]"
else
export AWS_PROFILE_DISPLAY=""
fi
} }
# Clear AWS credentials from environment
function awslogout() { function awslogout() {
unset AWS_PROFILE_ACTIVE aws sso logout --profile "${AWS_PROFILE:-default}" 2> /dev/null
unset AWS_ACCESS_KEY_ID unset AWS_PROFILE AWS_PROFILE_ACTIVE AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_CREDENTIAL_EXPIRATION
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
unset AWS_CREDENTIAL_EXPIRATION
export AWS_PROFILE_DISPLAY=""
echo "AWS profile and credentials cleared." echo "AWS profile and credentials cleared."
} }
# Check if AWS credentials have expired and clear the env variables if so
function _aws_creds_expiration_check() { function _aws_creds_expiration_check() {
if [[ -n "$AWS_CREDENTIAL_EXPIRATION" ]]; then if [[ -n "$AWS_CREDENTIAL_EXPIRATION" ]]; then
local expiration_epoch local expiration_epoch
local current_epoch local current_epoch
# Convert expiration time to epoch (handles ISO 8601 format) # Convert expiration time to epoch (handles ISO 8601 format)
if command -v gdate &> /dev/null; then if [[ -x $(command -v gdate) ]]; then
# macOS with GNU coreutils installed # macOS with GNU coreutils installed
expiration_epoch=$(gdate -d "$AWS_CREDENTIAL_EXPIRATION" +%s 2>/dev/null) expiration_epoch=$(gdate -d "$AWS_CREDENTIAL_EXPIRATION" +%s 2>/dev/null)
current_epoch=$(gdate +%s) current_epoch=$(gdate +%s)
@@ -130,119 +123,14 @@ function _aws_creds_expiration_check() {
fi fi
} }
# easy access to SSH # Hook the expiration check to each prompt display
function awsssh() { if [[ $(command add-zsh-hook 2>/dev/null) ]]; then
local profile="" # Zsh
local region="" if ! [[ -n "$PERIOD" ]]; then
local username="ansible" export PERIOD=300
local search=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
search="$1"
shift
;;
esac
done
if [[ -z "$search" ]]; then
echo "Usage: awsssh [--profile prof] [--region reg] [user@]search-term"
return 1
fi fi
add-zsh-hook periodic _aws_creds_expiration_check
# Extract username if provided as user@search else
if [[ "$search" == *@* ]]; then # Bash
username="${search%@*}" PROMPT_COMMAND="_aws_creds_expiration_check; $PROMPT_COMMAND"
search="${search#*@}" fi
fi
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Get matching instances
local instances
instances=$(aws ec2 describe-instances \
--filters "Name=tag:Name,Values=*$search*" \
--query 'Reservations[].Instances[].{
Name: Tags[?Key==`Name`].Value | [0],
IP: PublicIpAddress,
InstanceId: InstanceId
}' \
--output json \
"${aws_opts[@]}")
if [[ $? -ne 0 || -z "$instances" || "$instances" == "[]" ]]; then
echo "Failed to retrieve instances or no match found."
return 2
fi
# Select instance using fzf
local selection
selection=$(echo "$instances" | jq -r '.[] | "\(.Name): \(.IP // "no-ip") (\(.InstanceId))"' |
fzf -1 -0 --header "Select an instance")
if [[ -z "$selection" ]]; then
echo "No valid instance selected."
return 3
fi
# Extract IP and InstanceId from selection
local ip instance_id
ip=$(echo "$selection" | sed -E 's/.*: (.*) \(.*/\1/')
instance_id=$(echo "$selection" | sed -E 's/.*\((i-[a-z0-9]+)\).*/\1/')
if [[ "$ip" != "no-ip" ]]; then
echo "Connecting to $username@$ip via SSH..."
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${username}@${ip}"
else
echo "No public IP found. Falling back to AWS Session Manager..."
aws ssm start-session --target "$instance_id" "${aws_opts[@]}"
fi
}
function instances() {
local profile=""
local region=""
# Parse optional arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: list_ec2_instances [--profile prof] [--region region]"
return 1
;;
esac
done
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Query EC2 for names and instance IDs
aws ec2 describe-instances \
--query 'Reservations[].Instances[].{Name: Tags[?Key==`Name`].Value | [0], InstanceId: InstanceId}' \
--output table \
"${aws_opts[@]}"
}