インフラ触るならおすすめしたい設定たち
AWSのプロファイル切り替え
AWS CLIを使う上でプロファイルを切り替えるエイリアスや関数があると便利
というかこれなしじゃ生きられない
awsl
で今セットされているプロファイルを確認するエイリアス
abbr -S -qq awsl='aws configure list'
awsp
でプロファイル切り替えする関数とその関数をエイリアスに追加
# AWS
function set_aws_profile() {
local selected_profile=$(aws configure list-profiles |
grep -v "default" |
sort |
fzf --prompt "Select PROFILE. If press Ctrl-C, unset PROFILE. > " \
--height 50% --layout=reverse --border --preview-window 'right:50%' \
--preview "grep {} -A5 ~/.aws/config")
# Cancel settings if no profile is selected
if [ -z "$selected_profile" ]; then
echo "Unset aws profile!"
unset AWS_PROFILE
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
return
fi
# settings for the selected profile.
echo "Set the environment variable 'AWS_PROFILE' to '${selected_profile}'!"
export AWS_PROFILE="$selected_profile"
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
# Check your sso session and log in again if it has expired.
local AWS_SSO_SESSION_NAME="mozumasu"
check_sso_session=$(aws sts get-caller-identity 2>&1)
if [[ "$check_sso_session" == *"Token has expired"* ]]; then
echo -e "\n----------------------------\nYour Session has expired! Please login...\n----------------------------\n"
aws sso login --sso-session "${AWS_SSO_SESSION_NAME}"
aws sts get-caller-identity
else
echo ${check_sso_session}
fi
}
alias awsp='set_aws_profile'
EC2のパブリックIPを確認する
パブリックIPを固定するEIP(Elastic IP)には料金がかかるため、検証段階でEIPを使いたくないことがある
AWSコンソールでEC2のIPを確認するのは面倒なのでターミナルで確認したい
以下のコマンドでEC2のインスタンスID、インスタンス名、パブリックIPの一覧を確認できる
(echo -e "InstanceId\tName\tPublicIpAddress" && \
aws ec2 describe-instances \
--query "Reservations[*].Instances[*].[InstanceId, Tags[?Key=='Name'].Value | [0], PublicIpAddress]" \
--output text) | column -t
EC2のパブリックIPを確認するエイリアス
こんな長いコマンドをいちいち打つのは大変なのでエイリアス設定してec2ls
で確認できるようにしておく
alias ec2ls='(echo -e "InstanceId\tName\tPublicIpAddress" && aws ec2 describe-instances --query '\''Reservations[*].Instances[*].[InstanceId, Tags[?Key==`Name`].Value | [0], PublicIpAddress]'\'' --output text) | column -t'
実行すると以下のように返ってくる
$ ec2ls
InstanceId Name PublicIpAddress
i-0abcdef1234567890 example-instance-name 203.0.113.25
i-0abcdef1234567891 another-instance-name 203.0.113.26
i-0abcdef1234567892 no-name-instance None
自分のIPを確認
自分のIPを知りたい時が結構ある
myip
でサクッと確認できるようにしてる
abbr -S -qq myip='curl ifconfig.me'
ターミナルでVPNを切り替えたり切断したり
設定ファイル
# ----------------------------------------------------
# for Mac
# ----------------------------------------------------
# vpnutil
abbr -S -qq vpn='vpnutil'
alias vpns='check_vpn_status'
alias vpnc='vpn_connect_with_fzf'
alias vpnd='vpn_disconnect_if_connected'
# vpnutil functions
# https://github.com/Timac/VPNStatus
check_vpn_status() {
# Extract the output of vpnutil list as json.
vpn_data=$(vpnutil list)
# Extract connected vpn.
connected_vpns=$(echo "$vpn_data" | jq -r '.VPNs[] | select(.status == "Connected") | "\(.name) (\(.status))"')
if [[ -z "$connected_vpns" ]]; then
echo "No Connected"
else
echo "Connected VPN:"
echo "$connected_vpns"
fi
}
vpn_connect_with_fzf() {
# Extract the output of vpnutil list as json.
vpn_data=$(vpnutil list)
# Get the name and status of the VPN and select it with fzf.
selected_vpn=$(echo "$vpn_data" | jq -r '.VPNs[] | "\(.name) (\(.status))"' | fzf --prompt="choose a vpn: ")
# If there is no selected VPN, exit
if [[ -z "$selected_vpn" ]]; then
echo "VPN selection canceled."
return
fi
# Extract the vpn name
vpn_name=$(echo "$selected_vpn" | sed 's/ (.*)//')
# Connection place
echo "connection: $vpn_name"
vpnutil start "$vpn_name"
}
vpn_disconnect_if_connected() {
# Extract the output of vpnutil list as json.
vpn_data=$(vpnutil list)
# Extract connected VPN
connected_vpns=$(echo "$vpn_data" | jq -r '.VPNs[] | select(.status == "Connected") | .name')
if [[ -z "$connected_vpns" ]]; then
echo "No vpn connected."
else
echo "Disconnect the following VPN connections:"
echo "$connected_vpns"
# Turn off each connected VPN.
for vpn in $connected_vpns; do
echo "cutting: $vpn"
vpnutil stop "$vpn"
done
echo "Disconnected all vpn connections."
fi
}
複数アプリケーションを開く
検証とかで複数ウィンドウでアプリケーションを開きたくなるので追加
# Open the selected application with new window
function newapp() {
local app=$(find /Applications -name "*.app" -maxdepth 1 | sed 's|/Applications/||' | fzf \
--prompt="Select an application: " \
--height=20% \
--preview="echo '🍎 Application Name: {1}\n' && echo '' && mdls -name kMDItemDisplayName -name kMDItemVersion -name kMDItemKind /Applications/{1} || echo 'No metadata available'" \
--preview-window=right:40%)
if [[ -z "$app" ]]; then
echo "No application selected."
return 1
fi
echo "Opening $app..."
open -n "/Applications/$app"
}
Terraformのエイリアス
無難なやつ
abbr -S -qq tf='terraform'
abbr -S -qq tfi='terraform init'
abbr -S -qq tfp='terraform plan'
abbr -S -qq tfs='terraform state'
abbr -S -qq tfsl='terraform state list'
サーバー接続情報の管理は.ssh/configで!
サーバー接続情報の管理は.ssh/configがおすすめ
設定しておくとssh接続時のタイプ数が減る
# before
ssh -i ~/.ssh/hoge-key hoge-user@203.0.113.25 -p 22
# after
ssh __hoge_prod # エイリアス名
HOST __hoge_prod #エイリアス名
HOSTNAME 203.0.113.25 # サーバーIP(記載しているやつは適当
User hoge-user # ユーザー名
Port 22
IdentityFile ~/.ssh/hoge-key # 秘密鍵のパス
ファイルを爆速で開けるようにしておくとなおよし
abbr -S -qq dhosts='nvim ~/.ssh/config'
.ssh/configの分割
自分は.ssh/conf.d/hosts/
を用意して.ssh/configを分割して管理している
.ssh/config
を以下のように設定
Include conf.d/hosts/*
.ssh/conf.d/hosts/
を用意して、その中にファイル(案件1、案件2)をおく
├── config
└── conf.d
└── hosts
├── 案件1
└── 案件2
こちらもエイリアス設定しておくとヨシッ!
abbr -S -qq dhosts='nvim ~/.ssh/conf.d/hosts/'
aws-vault
これ無くなったら困るツール
「迷ったら入れな!」なやつ
プロファイル情報からAWSコンソール画面を開く
イチオシはこれ
これでプロファイルに対応したAWSコンソール画面を開くことができる
aws-vault login プロファイル名
他にもTerraformを実行するたびにMFAの値を入力しなくて良くなったりとメリットがある
が、導入方法が思い出せないので思い出したら追記する
導入方法
aws-valutのインストール
brew install --cask aws-vault
AWSのプロファイルがない場合は作成する
AWS CLI での設定と認証情報ファイル設定 - AWS Command Line Interface
aws configure --profile プロファイル名
すでにプロファイルが設定済みの場合は、以下のコマンドでaws-vaultに追加できる
aws-vault add プロファイル名
エイリアス
aws-vaultが長いのでawsv
にしている
alias awsv='aws-vault'
AWS WorkSpacesのパブリックIPを取得
AWS WorkSpacesに割り当てられたパブリックIPを調べるのって実はめんどくさい
<WorkSpacesのパブリックIP取得手順>
-
WorkSpacesのコンソールを開く
https://console.aws.amazon.com/workspaces/ -
WorkSpacesのプライベートIPを確認
-
EC2のコンソールを開く
https://console.aws.amazon.com/ec2/ -
ネットワークインターフェースを選択
-
WorkSpacesのプライベートIPで検索
-
検索結果の
Elastic Network Interface
の項目パブリックIPv4アドレス
の値からパブリックIPが確認できる
これを都度やるのは苦行である
関数化してwsip
でWorkSpacesのパブリックIPを取得できるようにする
# AWS
get_workspaces_ips() {
# Get private IP of WorkSpaces
local workspaces
workspaces=$(aws workspaces describe-workspaces \
--query "Workspaces[*].[WorkspaceId, UserName, IpAddress]" \
--output text)
# Output header
echo -e "WorkspaceId\tUserName\tPublicIpAddress" | column -t
# Find ENI for each WorkSpace
while read -r workspace_id username private_ip; do
local public_ip="None"
if [ "$private_ip" != "None" ]; then
# Get public IP by ENI
public_ip=$(aws ec2 describe-network-interfaces \
--filters "Name=private-ip-address,Values=$private_ip" \
--query "NetworkInterfaces[0].Association.PublicIp" \
--output text)
fi
echo -e "$workspace_id\t$username\t$public_ip" | column -t
done <<< "$workspaces"
}
alias wsip='get_workspaces_ips'
wsip
を実行すると以下のような情報が得られる
WorkspaceId UserName PublicIpAddress
ws-12345678 user1@example.com 203.0.113.10
ws-23456789 user2@example.com None
AWSサービスのIPアドレス確認
SG (セキュリティグループ) を設定する時に EC2 Instance Connect を使いたい時に許可するIPアドレスってどれだっけ? っていう時がある
AWSサービスが使用しているIPアドレスは以下のjsonから確認ができる
https://ip-ranges.amazonaws.com/ip-ranges.json
ただ、このページはそこそこ重い
なのでこれもターミナルから確認できるようにするのが望ましい
あわよくば皆ターミナルオタクになって欲しい
curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select(.region=="ap-northeast-1" and .service=="EC2_INSTANCE_CONNECT")'
コレを実行するとあら不思議、IPが出てくる!😳
{
"ip_prefix": "3.112.23.0/29",
"region": "ap-northeast-1",
"service": "EC2_INSTANCE_CONNECT",
"network_border_group": "ap-northeast-1"
}
自分はawsip
でエイリアスを設定している
下記の関数ではAWSのサービス名を fzf で選択して確認できるようにしている
aws_service_filter() {
# Get AWS IP ranges
local data
data=$(curl -s https://ip-ranges.amazonaws.com/ip-ranges.json)
# Get the service list and select with fzf.
local selected_service
selected_service=$(echo "$data" | jq -r '.prefixes[] | select(.region=="ap-northeast-1") | .service' | sort -u | fzf --prompt="Select AWS Service: ")
# Quit if no service is selected.
if [[ -z "$selected_service" ]]; then
echo "No service selected."
return 1
fi
# Displays IP ranges for selected services.
echo "Selected Service: $selected_service"
echo "IP Ranges for $selected_service in ap-northeast-1:"
echo "$data" | jq -r ".prefixes[] | select(.region==\"ap-northeast-1\" and .service==\"$selected_service\") | .ip_prefix"
}
alias awsip='aws_service_filter'