PythonでAWSのIAMユーザ情報を取得しExcelに出力する

Gear AWS
Gear

やりたいこと

Python初心者だけど、
Pythonを使って以下実施したい。

  • PythonでAWS のIAMユーザ情報を取得
  • 取得した情報をExcelに出力

調べるとそれぞれ以下対応により実現できそう。

Excelは以下最低限の整形を想定していたので、
それぞれ参考になりそうなサイトを見つけました。

完成コード

つぎはぎを繋ぎ合わせて作成しました。

import boto3 as b3 # AWS SDK
import openpyxl # Excel操作
from openpyxl.styles.borders import Border, Side # 罫線
from openpyxl.utils import get_column_letter # セル指定
from openpyxl.styles import PatternFill # 背景色
import glob # ファイル操作

# IAMインスタンスオブジェクト作成
iam_client = b3.client('iam')

# IAMユーザ情報取得
iam_users = iam_client.list_users()

# 使用するExcelファイルを定義
excel_file_name = 'IAMユーザ情報.xlsx'

# 同じディレクトリのファイルを全取得
files = glob.glob("*.xlsx")

# 使用するExcelファイルが存在しない場合はファイル作成
if excel_file_name in files:
  pass
else:
  create_file = openpyxl.Workbook()
  create_file.save(excel_file_name)
  
# 使用するファイルを読み込み
excel_file = openpyxl.load_workbook(excel_file_name)

# ファイル内のシートを取得
sheet_list = excel_file.sheetnames

# シート名を定義
sheet_name = 'IAMユーザ一覧'

# シートが存在しない場合はシート作成
if sheet_name in sheet_list:
  pass
else:
  excel_file.create_sheet(title=sheet_name)
  
# 書き込むExcelシートを定義
sheet = excel_file[sheet_name]

# 行列の初期化
start_row = 1
start_col = 1

# 項目作成
fields = iam_users['Users'][0].keys()
for x, field in enumerate(fields):
  x += 1
  sheet.cell(
    1,
    x,
    field
  )

# IAM情報挿入
for user in iam_users['Users']:
  start_col += 1
  start_row = 1
  for item in user.values():
    sheet.cell(
      start_col,
      start_row,
      str(item)
    )
    start_row += 1

# 罫線設定
side = Side(style='thin', color='000000')
border = Border(top=side, bottom=side, left=side, right=side)
for row in sheet:
  for cell in row:
    sheet[cell.coordinate].border = border

# セルのサイズを自動調整
for col in sheet.columns:
  max_length = 0
  column = col[0].column
  
  for cell in col:
    # print(len(str(cell.value)))
    if len(str(cell.value)) > max_length:
      max_length = len(str(cell.value))
      
  just_width = (max_length + 2) * 1.2
  sheet.column_dimensions[get_column_letter(column)].width = just_width

# 背景色定義
back_fill = PatternFill(patternType="solid", fgColor="8DB4E2")

# 項目に背景色設定
for x, item in enumerate(fields):
  x += 1
  sheet.cell(1, x).fill = back_fill

# 保存
excel_file.save(excel_file_name)

改善・修正の余地が多分にあるコードですが、
やりたいことは最低限達成できました。

以下実行する環境の前提条件です。

・Windows環境
・Pythonがインストールされている
 参考サイト:Python公式
・下記コマンドで必要なライブラリがインストールされている
 pip install boto3
 pip install openpyxl
・AWS CLIが実行可能であること
 参考サイト:Configuration basics

つまづいたこと

セル幅を入力文字数に合わせて設定する際に、
下記エラーが発生し想定通り実行できませんでした。

TypeError: <class 'openpyxl.worksheet.dimensions.ColumnDimension'>.index should be <class 'str'> but value is <class 'int'>

下記サイトを参考にコードを修正してあげることで解決しました。
参考サイト:openpyxl – adjust column width size
      openpyxl.utils.cell module

【×】sheet.column_dimensions[column].width = just_width
【〇】from openpyxl.cell import get_column_letter # cellのモジュールなのでインポートしとく
   sheet.column_dimensions[get_column_letter(column)].width = just_width

終わりに

IAMユーザをマネジメントコンソール上で定期的に確認するのが面倒くさいなと思い、
今回はPythonを使った方法でIAMユーザ取得とExcel化を実現してみました。

あとは月に一回とかでバッチ処理をかけてあげれば楽できるかな、とか考えています。

Pythonの利用経験が少ないため冗長的なコードになっていますが、
どこかの誰かのお役に立てれば幸いです。

コメント

タイトルとURLをコピーしました