🦈

AWS開発におけるターミナル環境

2022/04/30に公開約5,000字

最近AWSによるシステム開発に携わっており、
特にターミナル周りの環境・ツールについて色々ブラッシュアップしたところがあるので、
ここで内容を共有したいと思います。

前提

シェルはzsh、AWS CLIはv2を前提としてこのテキストは記載してます。
シェルについては、bash等の他のシェルに読みかえてもらえれば使えるものが多いかと思います。

AWS CLI

公式ページより

AWS コマンドラインインターフェース (CLI) は、AWS サービスを管理するための統合ツールです。
ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから AWS の複数のサービスを制御し、スクリプトを使用してこれらを自動化することができます。

AWSサービスの確認や操作はマネジメントコンソールからすることも多いですが、
頻繁に発生する操作についてはAWS CLIを使用したほうが効率的に作業する事ができます。
例として、自分は以下のような操作でよくAWS CLIを使用しています。

  • Cloudformationのデプロイ・アップデート
  • デプロイされたリソースのパラメータ確認
  • AWS SDKを使った開発におけるAPI確認

認証情報の設定

まずはとにもかくにも認証情報の設定をする必要があります。
aws configureまたは、SSOを使用している人の場合はaws configure ssoコマンドを実行すると、
プロンプトが表示されるのでそのガイドのとおりに情報を入力します。

詳細はConfiguration basicsを参照してください。

環境変数を一時的に設定してAWS CLIを実行している人もいると思いますが、頻繁にAWS CLIを使用する人はこの設定をすると楽になると思います。

補完設定

補完設定をしておくと、AWS CLIのサブコマンドやオプションはもちろんですが、オプションの値(VPC ID, IAMロール名などリソースの情報全般) も補完してくれるので、
入力する値をいちいち調べずともコマンドを作ることができます。

zshの場合、以下のコマンドを.zshrcに記載するだけで補完を有効にすることができます。

autoload bashcompinit && bashcompinit
autoload -Uz compinit && compinit
complete -C '/usr/local/bin/aws_completer' aws

aws_completerは、AWS CLIをインストールした際に一緒にインストールされるとおもいます。
人によってはインストール場所を変えていることもあるかと思いますが、その場合は/usr/local/bin/の部分を書き換えてください。

詳細はCommand completionを参照してください。

ただ、zshを使っている場合は、後述するawsのプラグインを使用すると、この設定をせずとも補完機能を有効化することができます。

環境変数

AWS CLIの挙動の一部は環境変数を設定する事によって変更することができます。
詳細はEnvironment variables to configure the AWS CLIを見ていただくと詳細がわかると思います。
今回は1つだけ個人的におすすめの設定を紹介します。

自分は、.zshenvに以下のように記載しています。

export AWS_CLI_AUTO_PROMPT=on-partial

AWS CLIには自動プロンプトモードというものがあります。
AWS CLIのサブコマンドやオプション等を補完してくれるモードで、補完の内容的には上記の補完設定後の通常のAWS CLIと変わらないのですが、
補完候補のポップアップやマッチ方法が通常時よりも便利なので時々使っています。

AWS_CLI_AUTO_PROMPTは、その自動プロンプトモードに入るタイミングを設定するための環境変数で、
デフォルトでは空 (つまりは自動プロンプトモードに入らない) になっています。
それをon-partialにすると、awsコマンドを実行したときにそのコマンドが不完全だった場合は、自動プロンプトモードに入るようになります。

自分はこの設定を適用して、awsコマンドを引数無しで実行して、自動プロンプトモードを起動するということをやっています。

alias

AWS CLIにはaliasという機能が存在します。
詳細はCreating and using AWS CLI aliasを見ていただけるとわかると思いますが、
まずは以下のようにしてaliasファイルを作成します。

mkdir -p ~/.aws/cli  # aliasのファイルを配置するディレクトリを作成
echo '[toplevel]' > ~/.aws/cli/alias  # aliasファイルを作成して、必ず必要な`[toplevel]`を1行目に追記

あとはshellで好きな処理を記述すればaliasとして登録することができます。
例として、自分が使っているaliasの1つを下記に記載します。

aws cloneというコマンドで、実行時にCodeCommitのリポジトリ一覧を取得して、
fzfを使って特定のリポジトリを選択し、その選択されたリポジトリをクローンするコマンドになります。
自分はghqを使ってGitリポジトリの管理を普段しているので、もしghqのコマンドが存在する場合、
ghqを使ってクローンするようにしています。

clone =
  !f() {
    set -e

    if [ "$1" = "--ghq" ]
    then
      cmd="ghq get"
      repo_name="$2"
    elif [ "$1" = "--git" ]
    then
      cmd="git clone"
      repo_name="$2"
    else
      if ghq --version >/dev/null 2>&1
      then
        cmd="ghq get"
      else
        cmd="git clone"
      fi
      repo_name="$1"
    fi

    if [ -z $repo_name ]
    then
      repo_name=$(aws codecommit list-repositories |jq -r '.repositories[].repositoryName' |fzf --header="clone repository")
    fi

    info=$(aws codecommit get-repository --repository-name "$repo_name")
    account_id=$(echo "$info" |jq -r .repositoryMetadata.accountId)
    repo_arn=$(echo "$info" |jq -r .repositoryMetadata.Arn)
    grc_url=$(echo ${repo_arn} |sed -r 's/.+:codecommit:(.+):'${account_id}':(.+)/codecommit::\1:\/\/\2/')
    $cmd "${grc_url}"
  }; f

他にもいくつかaliasを作成して個人のdotfilesに格納しているので、
よろしければaliasファイルを参考にしてみてください。

zsh

AWS plugin

zshを使っている場合、Oh My Zshというフレームワークを知っている、使っている方は多いと思います。
自分はOh My Zshのプラグインのみを、zplugから使っています。

具体的には、Oh My ZshはAWS向けの以下のようなプラグインを提供しています。

https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/aws

これを使用すると、以下のような機能が使えるようになるので、個人的にはzshを使ってAWS開発をしている人は是非導入したいプラグインです。
プロファイルの切り替えは、AWS_PROFILE環境変数の値を設定すれば切り替えることができるのですが、このプラグインではシェルの補完も含めて機能を提供してくれるので普段の切り替えが少し楽になります。

  • AWS CLIの補完設定を自分で記載することなく有効化
  • asp等のコマンドによるAWSプロファイルの切り替え

AWS SDKを使ったツール作成

AWSサービスの操作の自動化は、AWS CLIからのコマンド入力だけでなく、より複雑な操作に対してはAWS SDKを使ってツールを作成することがあります。
ここでは、私が作成したツールを1つ紹介させていただきたいと思います。

awsdsc

私がAWSで開発をしているとき、デプロイされているリソースのパラメータ確認等をする場面が多々発生していました。
そのときに毎回マネジメントコンソールを使って確認したり、コマンドを調べつつAWS CLIを実行するといったことは面倒なので、
AWSの各リソースタイプに対して同じインタフェースでパラメータ確認ができるツールを作成しました。

Python Prompt Toolkitを使って、自動補完などに対応し、
複数のAWSリソースタイプに対して共通のインタフェースでパラメータ確認を行う事ができます。

AWS describe の短縮でawsdscと名付けています。
もし興味がある・詳しく知りたい方がいれば、こちらのリポジトリを見ていただければと思います。

Discussion

ログインするとコメントできます