CM re:Growth 2014 TokyoでAWS SDK for .NETを用いたExcel魔改造の話をしてきた #cmdevio

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

こんにちは、福田です。2014年12月16日(火)に昨年に続きCM re:Growth 2014 TokyoでExcel魔改造の話をして来ました。


わたしのExcelのリボン

わたしのExcelのリボンは下記のようにAWSタブが追加されています。このAWSタブの各ボタンの動作でもが今回の発表になります。

regrowth2014_fukuda_00

re:Growth 2013のおさらい

最初にセピア色のスライドスクリーンショットを用い、昨年のおさらい。AWS案件完了時に作成するケースの多い「AWS環境定義書/AWS仕様書」に関して、自動生成するツールをExcelアドオンとして作成し、その自動生成デモを行った事をおさらいしました。

regrowth2014_fukuda_01 regrowth2014_fukuda_02 regrowth2014_fukuda_03

3つのExcel/Word魔改造デモ

今年は下記デモ3つを実施して終了な感じでした。

  • AWS仕様書自動作成
  • AWS監査資料作成
  • お客様向けPDF資料自動作成

あまり各デモの解説やコードの紹介はやれなかったので、以後それぞれのデモの簡単な解説をしていきたいと思います。

AWS仕様書自動作成

今年はAWS仕様書自動作成Excelアドオンに下記のような機能を追加してみました:

  • 各サービスへの出力精度を向上
    • それぞれ最新のDescribe結果を表示するように修正
  • Security Group、Route 53など頻出AWSサービスへの追加対応
  • Credentials管理機能強化

具体的には下記AWSサービスの仕様書作成を行いました:

  • EC2仕様書作成
  • Security Group仕様書作成
  • ELB仕様書作成
  • RDS仕様書作成

(Route 53仕様書は当日までよさ気な出力の環境を用意出来なかったで割愛しました)

AWS仕様書のサンプルスクリーンショット

EC2仕様書

regrowth2014_fukuda_04

Security Group仕様書

regrowth2014_fukuda_05

ELB仕様書

 

regrowth2014_fukuda_06

RDS仕様書

regrowth2014_fukuda_07

AWS仕様書自動作成アドオンC#コード抜粋

Excelを制御するコードの一部を下記に抜粋してみました。Excelの部分はVBAのコードとほぼ同じなので簡単ですね。AWSアクセス部分もコードを呼んでいただければ直感的に理解できる内容のものになっていると思います。

EC2インスタンス一覧の取得

            #region ■AWSアクセスクライアントの作成

            var ec2Client = new AmazonEC2Client(Amazon.RegionEndpoint.APNortheast1);

            #endregion

            #region ■EC2インスタンス一覧の取得

            DescribeInstancesRequest request = new DescribeInstancesRequest();

            DescribeInstancesResponse response = ec2Client.DescribeInstances(request);

            List<Reservation> reservationList = response.Reservations;

            List<InstanceInReservation> instanceList = new List<InstanceInReservation>();

            foreach (var reservation in reservationList)
            {
                for(int index = 0; index < reservation.Instances.Count; index++)
                {
                    instanceList.Add(new InstanceInReservation() { Instance = reservation.Instances[index], ReservationId = reservation.ReservationId , AmiLaunchIndex = index}); 
                }
            }

            #endregion
[/csharp]
<p>※独自のInstanceオブジェクトとReservationIdとAmiLaunchIndexをもったモデルを用意しています。</p>
<h3>アクティブシートの取得とシート名の変更</h3>

            #region ■アクティブシート参照の取得とセル変数の宣言
            
            // using Excel = Microsoft.Office.Interop.Excel;
            Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet);

            Excel.Range cell;

            if (activeWorksheet == null)
            {
                return;
            }

            #endregion

            #region ■シート名の変更

            try
            {
                activeWorksheet.Name = "EC2";
            }
            catch (Exception)
            {
            }

            #endregion

インスタンス一覧の描画

           #region ■EC2インスタンス一覧の描画

            foreach (var instanceWirhReservation in instanceList)
            {
                var instance = instanceWirhReservation.Instance;

                string name = (from tag in instance.Tags
                               where tag.Key == "Name"
                               select tag.Value).ToArray()[0];

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

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

                cell = activeWorksheet.get_Range("D" + rowCounter);
                cell.Value2 = instance.InstanceType.Value;

                cell = activeWorksheet.get_Range("E" + rowCounter);
                cell.Value2 = instance.Placement.AvailabilityZone;

                cell = activeWorksheet.get_Range("F" + rowCounter);
                cell.Value2 = instance.PublicIpAddress;

                rowCounter++;
            }

            int instanceListEnd = rowCounter - 1;

            // インスタンス一覧に罫線を引く
            activeWorksheet.get_Range("B" + instanceListStart + ":" + "F" + instanceListEnd).Borders.LineStyle = true;

            // 1行開ける
            rowCounter++;

            #endregion

AWS監査資料の作成

次にAWS監査資料の作成を行ってみました。といっても、単にまずはAWS Configの内容をExcelで表示するというところまでやっただけのデモになります。

今回はSecurity Groupの設定変更状況をExcelに出力しています。監査資料とまでは全然行きませんでしたが、ちょっとそれらしい感じにするために、Security Groupの注意すべきエントリー(0.0.0.0/0)を赤字表示させてみています。

regrowth2014_fukuda_08 regrowth2014_fukuda_09

AWS監査資料自動作成アドオンC#コード抜粋

AWS Configのデータ出力処理としては下記のようにGetResourceConfigHistoryを呼び出しています。

(処理を簡易にするためにResourceIdを直書きしています)

            #region ■AWSアクセスクライアントの作成

            var configClient = new AmazonConfigServiceClient(Amazon.RegionEndpoint.USEast1);

            #endregion

            #region ■ResourceConfigHistoryの取得

            var getResourceConfigHistoryRequest = new GetResourceConfigHistoryRequest();
            getResourceConfigHistoryRequest.ResourceType = ConfigResourceType.AWSEC2SecurityGroup;
            getResourceConfigHistoryRequest.ResourceId = "sg-ddc034b9";

            var getResourceConfigHistoryResponse = configClient.GetResourceConfigHistory(getResourceConfigHistoryRequest);

            var configItems = getResourceConfigHistoryResponse.ConfigurationItems;

            // 念のためリソースを古い順に並べ替える
            configItems = (from configItem in configItems
                           orderby configItem.ConfigurationItemCaptureTime
                           select configItem).ToList();

            #endregion

Wordの改造

PDFの資料を毎日のように作成しているのですが、その元になるのはWordドキュメントです。

お客様にIAMユーザーの情報を送ったりする場合、AWS Management Consoleが出力するCSVファイルをそのまま送ったのでは味気ないですよね。

そこでPDFのアカウント通知書を作成してお客様に送っています。

今回は下記テンプレートからその次の完成品を作成するWordアドオンを作成しました。

regrowth2014_fukuda_10 regrowth2014_fukuda_11

Wordの改造はやってみるとExcelと全く同じ感じで、やりたいことをどうやってコードにするかはExcel同様Word VBAの資料を漁れば簡単に実現できました。

まとめ

まとめという名の2015年の目標:

  • インストーラー
  • 仕様書自動生成の他サービスへの展開
    • DynamoDB、Redshift、ElastiCashe、S3等
  • AWS監査資料の強化
    • AWS Config、AWS CloudTrail
  • AWS Lambda連携
  • Amazon Cognito認証