Open10

インフラ触るならおすすめしたい設定たち

mozumasumozumasu

AWSのプロファイル切り替え

AWS CLIを使う上でプロファイルを切り替えるエイリアスや関数があると便利
というかこれなしじゃ生きられない

awslで今セットされているプロファイルを確認するエイリアス

~/.zshrc
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'
mozumasumozumasu

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
mozumasumozumasu

自分のIPを確認

自分のIPを知りたい時が結構ある
myipでサクッと確認できるようにしてる

abbr -S -qq myip='curl ifconfig.me'
mozumasumozumasu

ターミナルでVPNを切り替えたり切断したり

https://zenn.dev/mozumasu/articles/mozumasu-vpnstatus

設定ファイル
# ----------------------------------------------------
# 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
}


mozumasumozumasu

複数アプリケーションを開く

検証とかで複数ウィンドウでアプリケーションを開きたくなるので追加

# 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"
}
mozumasumozumasu

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'
mozumasumozumasu

サーバー接続情報の管理は.ssh/configで!

サーバー接続情報の管理は.ssh/configがおすすめ
設定しておくとssh接続時のタイプ数が減る

# before
ssh -i ~/.ssh/hoge-key hoge-user@203.0.113.25 -p 22
# after
ssh __hoge_prod # エイリアス名
~/.ssh/config
HOST __hoge_prod #エイリアス名
  HOSTNAME 203.0.113.25 # サーバーIP(記載しているやつは適当
  User hoge-user # ユーザー名
  Port 22
  IdentityFile ~/.ssh/hoge-key # 秘密鍵のパス

ファイルを爆速で開けるようにしておくとなおよし

~/.zshrc
abbr -S -qq dhosts='nvim ~/.ssh/config'

.ssh/configの分割

自分は.ssh/conf.d/hosts/を用意して.ssh/configを分割して管理している

.ssh/configを以下のように設定

~/.ssh/config
Include conf.d/hosts/*

.ssh/conf.d/hosts/を用意して、その中にファイル(案件1、案件2)をおく

├── config
└── conf.d
    └── hosts
        ├── 案件1
        └── 案件2

こちらもエイリアス設定しておくとヨシッ!

~/.zshrc
abbr -S -qq dhosts='nvim ~/.ssh/conf.d/hosts/'
mozumasumozumasu

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にしている

~/.zshrc
alias awsv='aws-vault'
mozumasumozumasu

AWS WorkSpacesのパブリックIPを取得

AWS WorkSpacesに割り当てられたパブリックIPを調べるのって実はめんどくさい


<WorkSpacesのパブリックIP取得手順>

  1. WorkSpacesのコンソールを開く
    https://console.aws.amazon.com/workspaces/

  2. WorkSpacesのプライベートIPを確認

  3. EC2のコンソールを開く
    https://console.aws.amazon.com/ec2/

  4. ネットワークインターフェースを選択

  5. WorkSpacesのプライベートIPで検索

  6. 検索結果のElastic Network Interfaceの項目パブリックIPv4アドレスの値からパブリックIPが確認できる


これを都度やるのは苦行である

関数化してwsipでWorkSpacesのパブリックIPを取得できるようにする

~/.zshrc
# 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
mozumasumozumasu

AWSサービスのIPアドレス確認

SG (セキュリティグループ) を設定する時に EC2 Instance Connect を使いたい時に許可するIPアドレスってどれだっけ? っていう時がある

AWSサービスが使用しているIPアドレスは以下のjsonから確認ができる

https://ip-ranges.amazonaws.com/ip-ranges.json

参照: AWS IP アドレスの範囲 - Amazon Virtual Private Cloud

ただ、このページはそこそこ重い

なのでこれもターミナルから確認できるようにするのが望ましい
あわよくば皆ターミナルオタクになって欲しい

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 で選択して確認できるようにしている

~/.zshrc
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'