👋

ExcelからCloudFormationテンプレートを生成

2024/11/03に公開

概要

AWS EC2構築用のExcelパラメータシートをPythonでCloudFormationテンプレートに変換する方法について紹介します

使用するPythonライブラリ

  • Jinja
    変数やif、for文を使用して、HTMLやYAMLなどのファイルを動的に生成可能
    日本語の変数名が使用可能
  • OpenPyXL
    Excelファイルの読み書きが可能
    名前の定義 機能を使用

元のExcelパラメータシート

Jinjaテンプレート

  • if文
    • EBSのIOPSは、gp2の場合は指定できず、gp3の場合に指定可能です
  • for文
    • Tagの数は可変であるため、動的に処理できるようにしています

生成されるCloudFormationテンプレート

作成手順

  1. 普通にExcelパラメータシートを作成
  2. 読み取りたいセルに 名前の定義 を設定
  3. Jinjaテンプレートを作成
  4. ExcelパラメータシートとJinjaテンプレートを読み取り、CloudFormationテンプレートを生成するPythonコードを作成

名前の定義

ExcelをPythonで読み取る際に、セル番号(例: 「A1」)を直接参照すると、Excelファイルの構造が少しでも変わると正しく値を取得できなくなります

これを避けるために、名前の定義 を使用します

セルを範囲指定し、セル番号(例: 「A1」)が表示されているボックスに任意の名前を入力することで、セルの範囲に名前を設定できます

これにより、Pythonコード内でこの名前を使って安定したセル参照が可能になります

メリット

  • セルの移動や行の追加・削除による影響を受けずに、常に同じ値を取得可能
  • Tagなどの項目数が増減する場合でも、for文を用いることでPythonコードやJinjaテンプレートを変更せずに対応可能

設定例

タグAMI を移動しても影響ありません

空行を挿入して、セルの位置が変わっても影響ありません

読み取る値が増えても影響ありません

コード

サンプルのExcelパラメータシートとPythonコードを格納しているので参考にしてください
Pythonコードは、100行くらいです

https://github.com/Flupinochan/excel-to-cloudformation

※補足1
Excelファイルを読み込む際に、以下のように data_only=True を設定すること
これを設定しないと、= 等で値を参照している場合やExcel関数の式がそのまま取得されてしまいます

excel_file_name = "【EC2】パラメータシート.xlsx"
wb = openpyxl.load_workbook(excel_file_name, data_only=True)

※補足2
Jinjaのテンプレートを読み込む際に、autoescape=False を設定すること
「"」ダブルクォーテーションをそのまま出力するためです
設定しないと、ダブルクォーテーションがエスケープされ、「"」のように出力されてしまいます

jinja_env = Environment(loader=FileSystemLoader("."), autoescape=False)
GitHubで編集を提案

Discussion