AWS CLI も楽しいです

Keyboard

こんにちは、システム開発一部の山下です。

Infrastructure as Code (IaC) いいですよね

AWS クラウド (Amazon Web Services) 楽しいですよね。昔は機材の発注から配線、セットアップなど何週間もかけて実施した試作や検証を、あっという間に実施できるクラウド環境、そしてそれを更に容易にする IaC (Infrastructure as Code) の概念は素晴らしいと思います。

AWS でリソースを操作するには大きく分けて以下の3つの手法があります。

  • Web画面 (AWS マネジメントコンソール) でGUI操作
  • ターミナル画面 (AWS CLI) でコマンド操作
  • プログラム (AWS SDK/CDK) から操作

システム構築時には以下も加わりますね。

  • CloudFormation などの設定ファイルを準備して構築実行

今回は AWS CLI の話です

まあタイトルや上にある写真から話の流れは見えていると思いますが。。私は古いタイプの技術者なので、ターミナル画面に親近感があります。なので今回は AWS CLI のご紹介をさせてください。

とはいえ、私も普段は Web ブラウザから、マネジメントコンソールを操作することがおおいです。楽ですし。ただリソースごとに画面がわかれているため全体の参照に時間がかかるな、ちょっと一覧が欲しいな、とか感じた時に、スポット的に CLI を用いたりします。

お使いの環境に AWS CLI をインストールしても良いですが、より手軽に、マネジメントコンソールの右上のメニューから、AWS CloudShell 環境を起動すると準備なしですぐ利用できます。

今回は AWS CLI を使ってリソースの一覧を作成して、それを CSV 形式に変換してみる操作をご紹介します。EXCEL資料に貼りつけたり、diff で差分を確認するなど、たまに便利です。

まずは基本操作

あ、そもそも、この投稿自体が初心者のメモといいますか、基本操作のカタマリなんですけどね。その中でも、最もわかりやすい例をご紹介します。

AWS CLI のコマンドの中で、簡単、かつ便利なのは list-XXXs describe-XXXs でリソースの一覧が取れる系です。例えば IAM でロールの一覧を取得する以下のコマンド:

aws iam list-roles

こんな感じで JSON フォーマット (設定により YAML の場合アリ) の結果が表示され参照できます。

aws iam list-roles 実行結果

ただこれだと長いので、必要な項目だけ抜き出して CSV 形式に変換することがお勧めで、その場合には jq コマンドがすごく便利。AWS CloudShell 環境でも最初からインストールされているようです。以下は必要な要素を抜き出して CSV 形式に変換する例:

aws iam list-roles | jq -r '.Roles|map([.Path, .RoleName, .MaxSessionDuration])|.[]|@csv'

結果はこんな感じ。実際には sort などで並びを整え、必要であれば uniq で重複を排除した後にファイルに落とすのが良い気がします。

jq で csv 形式に加工した例

EXCEL などで読み込む場合は、ヘッダがあると良いかもですね。以下のように sed にパイプを繋げて、最初のヘッダー行を追加するのは如何でしょうか。ただ、ここまでくると、そろそろシェルスクリプトにしたほうが良いかもしれませんね。

| sed -e '1i "Path","RoleName","MaxSessionDuration"'

もう少し複雑な例

さて、少しやっかいなのは、list-XXXs でリソースの arn の一覧しか取れない系でしょうか。例えば以下のようなコマンドです。

aws ecs list-task-definitions

このコマンドの場合、以下のように arn の一覧が表示されるだけです。

aws ecs list-task-definitions の実行結果

このコマンドで得られた arn を用いて、以下のように個々のリソースの情報を得る必要があります。

aws ecs describe-task-definition --task-definition XXXX

aws ecs describe-task-definition の実行結果

いろいろな方法があるとおもいますが、xargs を使うとワンラインで必要な情報を一覧できます。例えば以下はタスク定義の名前とステータスの一覧を CSV 形式で出力します。

aws ecs list-task-definitions | jq -r '.taskDefinitionArns|.[]' |
  xargs -n1 aws ecs describe-task-definition --task-definition |
  jq -r '[.taskDefinition.containerDefinitions[0].name,.taskDefinition.status]|@csv'

xargs を使った場合の実行結果

タグの値を出力してみる

AWS のリソース管理にタグがよく用いられます。特に Name キーは多用されているので、出力結果に加えたくなります。例えば以下のような感じで…

aws ec2 describe-vpcs |
  jq -r '.Vpcs|map([(.Tags|select(.Key=="Name").Value), .State, .IsDefault])|.[]|@csv'

ところがこの記述、残念ながらエラーが頻発します。調べてみると、これは利用している jq コマンドが実行エラーとなっていて、以下の場合に発生していました。

  • Tags 要素が存在しない
  • Tags 要素が存在するが空の配列である

私は jq あまり詳しくないのですが、とりあえず対応してみました。上記の場合に Name タグの値を "-" で表示するための記述がこちらです:

aws ec2 describe-vpcs |
  jq -r '.Vpcs|map([(.Tags|if length==0 then null else (.[]|select(.Key=="Name").Value) end//"-"), .State, .IsDefault])|.[]|@csv'

両パターンに対応するため、if 文まで使って、ちょっと冗長な記述になってしまいました… 今度、jq に詳しい人をみつけて、より簡潔な書き方を訊いてみたいと思っています…

というわけで

AWS CLI の使い方のほんの一部ですが、リソースの一覧をさっと表示して、必要であれば CSV 形式に整形する方法をご紹介してみました。

AWS CloudShell 環境ですと何もインストールせず、Web ブラウザ上で AWS CLI をさくっと利用できますので、普段はマネジメントコンソールをお使いの方も、よかったら試してみてください。

読んでいただきありがとうございました。マネックスグループの採用にご興味のある方は、ぜひ以下募集をご覧ください。

www.monexgroup.jp