【Excel改造】AWS環境定義書自動生成【EC2編】

298件のシェア(すこし話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS環境構成仕様書の作成

エンタープライズ向けにAWS環境を提供した場合、必ずAWS環境定義書、AWS構成仕様書等を作成する必要があります。みなさん例えば、下記のような仕様書を作成したことはありませんでしょうか?

AWS SDK Excel 02

従来、上記のような仕様書はAWS Management Consoleを凝視しながら、Excelに慎重に値をコピーペーストすることによって作成していました。

このような仕様書作成はAWSを利用したシステム開発で最も自動化されていない領域の一つです。実は、上記仕様書はボタンワンクリックで自動生成したものです。

今回は、EC2の仕様書を自動生成するためのアプリケーションとしてExcelアドインの作成を行ってみることにします。

開発環境

  • Windows 8
  • Visual Studio 2012(C#)
  • Excel 2013
  • AWS SDK for .NET

関連記事

実際のアプリケーション作成の前に、下記記事を読んでいない方は読んでおいて下さい:

Excelアドインプロジェクトの作成

まず、Excelアドインプロジェクトを作成します。次に、プロジェクトにAWS SDK for .NETの参照を追加し、プロジェクト構成ファイルも追加し、初期設定を行っておきます。

準備ができたら、下記のようなリボンを追加しておきます。

AWS SDK Excel 03

  • リボンクラスの名前はAWSRibbon.csとしています
  • タブのLabelをAWSとしています
  • グループのLabelをEC2としています
  • OfficeリボンコントロールのボタンをEC2グループに追加し、Labelをインスタンス一覧としています
  • インスタンス一覧ボタンのNameをdisplayEC2InstanceListButtonとします
  • displayEC2InstanceListButtonのイベントハンドラとしてdisplayEC2InstanceListButton_Clickを作成します(デザイナ上でボタンをダブルクリックでOKです)

 以下、displayEC2InstanceListButton_Clickイベントハンドラ内のコードの紹介と解説となります。

リボン内でのExcelオブジェクトの取得

まずは、リボンのコードビハインド内でExcelオブジェクトが利用できるようにしておきます。今回は下記のようなコードにしています:

            Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet);

            Excel.Range cell;

上記のコードをコンパイルするために、using句に はusing Excel = Microsoft.Office.Interop.Excel;を追加しています。

上記のcell変数は以後のコードで利用するExcelのセルを表す変数です。

シートヘッダーの作成

今回のプログラムではセルの罫線を引いたり、セルの背景を着色したりといった処理もコード側で実行しています。シートヘッダーの作成は下記のようになります。

            // シートタイトル
            cell = activeWorksheet.get_Range("B2");
            cell.Value2 = "システム名:";

            // シート名
            cell = activeWorksheet.get_Range("B4");
            cell.Value2 = "シート名:EC2インスタンス仕様書";

            // 作成日
            cell = activeWorksheet.get_Range("B6");
            cell.Value2 = "作成日:";

他のExcelに単純に値を設定し、セルの設定を変更しているようなコードは以後省略しています。

EC2インスタンス一覧の取得(DescribeInstancesの実行)

次に、本アプリケーションの中心処理であるEC2インスタンス一覧の取得を行います。プロジェクトにAWS SDK for .NETのライブラリを追加してありますので、Excelから通信を行ってEC2の情報を取得することが出来ます!

_人人 人人人人人_
> Excelで通信! <
 ̄Y^Y^Y^Y^Y^Y ̄

EC2インスタンス一覧取得のコードは下記のようになります:

            // DescribeInstancesの実行
            var ec2Client = new AmazonEC2Client(Amazon.RegionEndpoint.APNortheast1);

            var request = new DescribeInstancesRequest();

            DescribeInstancesResponse response = ec2Client.DescribeInstances(request);

            List<Reservation> reservationList = response.DescribeInstancesResult.Reservation;

            List<RunningInstance> runningInstanceList = new List<RunningInstance>();
            
            // インスタンス一覧の取得
            foreach (var reservation in reservationList)
            {
                runningInstanceList.AddRange(reservation.RunningInstance);
            }

上記で少しわかりづらい処理としてはReservationのリストからインスタンスを取得しているところです。「同時に起動したEC2インスタンス」はこのReservationにまとめられているようです。例えば、EC2のインスタンス起動ウィザードで起動する台数を2台として起動するとその2つのインスタンスは1つのReservationにまとめられています。

 コードの他の部分は非常にわかりやすいコードになっているかと思います。

EC2インスタンス一覧の描画

EC2インスタンス一覧が取得できたので、内容をExcelに展開していきます。まずはEC2インスタンス一覧を描画しています。

今回は下記のようにしています:

            // インスタンス一覧の描画
            foreach (var instance in runningInstanceList)
            {
                string name = (from tag in instance.Tag
                               where tag.Key == "Name"
                               select tag.Value).ToArray()[0];

                cell = activeWorksheet.get_Range("B" + rowNum);
                cell.Value2 = name;

                cell = activeWorksheet.get_Range("C" + rowNum);
                cell.Value2 = instance.InstanceId;

Tagは一つのインスタンスに複数関連付けられているので、そこからKeyがNameのものを取得し、インスタンス名を表示しています。

インスタンス詳細表示も上記コードと同様なものになります。

列幅を自動調整しておく

ExcelにEC2インスタンス一覧が描画し終わったら、列幅を自動調整して見やすいようにしておきます。

            // 列幅を自動調整する
            activeWorksheet.get_Range("B1:F" + rowNum).Columns.AutoFit();

上記の様なコードはVBA Excel 列幅調整などで検索するとVBAのコードが沢山出てくるので、それをコピペすれば殆ど動きます!!!

アプリケーションを実行し、仕様書を自動生成してみる!!!

 最後にアプリケーションを実行し、EC2の仕様書を自動生成してみます。

AWS SDK Excel 04

上記の様な仕様書が一瞬で完成しました。EC2インスタンス数が100個あっても一瞬で仕様書ができると思います。

まとめ

社内で仕様書を作成しているソリューションアーキテクトの方が多数いるので、その方々向けにプログラムを引き続きブラッシュアップしていきたいと思います!(まとめになってない。。。)