CloudWatch Agentを大量導入する際の課題と感想

背景

  • 数十台のサーバーにCloudwatch Agentを導入する
  • Cloudwatch Agentの設定ファイルはCloudwatch Agent内臓のウィザードで生成できるが、カスタムメトリクスはテンプレート式で作成されるため、細かいカスタマイズは手動で行う必要がある。
  • 各サーバーが必要のカスタムメトリクスはWindows、Linuxそれぞれで統一されているが、転送するログファイルのパス・転送先が異なっている。

問題点

  1. Cloudwatch Agentのウィザードは対話式のため、転送対象ファイルが大量の場合、手動で作成することが難しい。
  2. Windowsの場合、ログファイル・Windowsイベントログそれぞれ、Cloudwatch Agent設定ファイル上の記載方法が異なる。
  3. Excel関数でシンプルに転送対象ログ一覧より設定ファイルを生成することができない。

解決してみた

  1. 転送対象ログ一覧よりある程度大量作成できるものを関数で作る(ログパス、転送先ロググループ、転送先ログストリームなどを読み込んで設定ファイルの1ブロックを作っておく)
  2. マクロで行ごとに判断し、同一サーバーなのか、同一サーバーの最初行なのか、最終行なのかを判定し、該当行の設定ファイル上の位置を判別する。
  3. 該当サーバーの環境グループ名とサーバー名で設定ファイルを一括作成する。

Windows

Attribute VB_Name = "CreatFileWin"
Sub CreatFileWin()
  Dim str As String, c
  Set s = CreateObject("Scripting.FileSystemObject")
  Dim maxRow As Long
  maxRow = Cells(Rows.Count, 4).End(xlUp).Row
  Dim i As Long
  For i = 10 To maxRow
' '一行のみで完結
'     If Cells(i - 1, 4) <> Cells(i, 4) Or Cells(i - 1, 5) <> Cells(i, 5) Then
'       If Cells(i + 1, 4) <> Cells(i, 4) Or Cells(i + 1, 5) <> Cells(i, 5) Then
'         c = Cells(i, 32).Value & Cells(i, 33).Value & Cells(i, 34).Value
'         'MsgBox c
'         str = Cells(i, 5).Value
'         str = Replace(str, "/", "・")
'         Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 2, True)
'         t.WriteLine c
'         t.Close
'         Set t = Nothing
'       End If
'     End If
'複数行、最初の一行
    If Cells(i - 1, 4) <> Cells(i, 4) Or Cells(i - 1, 5) <> Cells(i, 5) Then
      If Cells(i + 1, 4) = Cells(i, 4) And Cells(i + 1, 5) = Cells(i, 5) Then
        'イベントログ
        If Cells(i, 22) = "Application" Or Cells(i, 22) = "Security" Or Cells(i, 22) = "System" Then
          c = Cells(i, 40).Value & Cells(i, 50).Value
          str = Cells(i, 5).Value
          str = Replace(str, "/", "・")
          Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
          t.WriteLine c
          t.Close
          Set t = Nothing
        'ファイル
        Else
          If Cells(i + 1, 22) = "Application" Or Cells(i + 1, 22) = "Security" Or Cells(i + 1, 22) = "System" Then
            c = Cells(i, 32).Value & Cells(i, 33).Value & Cells(i, 34).Value & Cells(i, 49).Value
            str = Cells(i, 5).Value
            str = Replace(str, "/", "・")
            Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
            t.WriteLine c
            t.Close
            Set t = Nothing
          Else
            c = Cells(i, 32).Value & Cells(i, 33).Value
            str = Cells(i, 5).Value
            str = Replace(str, "/", "・")
            Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
            t.WriteLine c
            t.Close
            Set t = Nothing
          End If
        End If
      End If
    End If
'複数行、途中行
    If Cells(i - 1, 4) = Cells(i, 4) And Cells(i - 1, 5) = Cells(i, 5) Then
      If Cells(i + 1, 4) = Cells(i, 4) And Cells(i + 1, 5) = Cells(i, 5) Then
        'file、途中行
        If Cells(i - 1, 22) <> "Application" And Cells(i - 1, 22) <> "Security" And Cells(i - 1, 22) <> "System" Then
          If Cells(i + 1, 22) <> "Application" And Cells(i + 1, 22) <> "Security" And Cells(i + 1, 22) <> "System" Then
            c = "," & Cells(i, 33).Value
            str = Cells(i, 5).Value
            str = Replace(str, "/", "・")
            Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
            t.WriteLine c
            t.Close
            Set t = Nothing
          End If
        End If
        'file、最終行
        If Cells(i - 1, 22) <> "Application" And Cells(i - 1, 22) <> "Security" And Cells(i - 1, 22) <> "System" Then
          If Cells(i + 1, 22) = "Application" Or Cells(i + 1, 22) = "Security" Or Cells(i + 1, 22) = "System" Then
            If Cells(i, 22) <> "Application" And Cells(i, 22) <> "Security" And Cells(i, 22) <> "System" Then
              c = "," & Cells(i, 33).Value & Cells(i, 34).Value & Cells(i, 49).Value
              str = Cells(i, 5).Value
              str = Replace(str, "/", "・")
              Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
              t.WriteLine c
              t.Close
              Set t = Nothing
            End If
          End If
        End If
        'event、一行目
        If Cells(i - 1, 22) <> "Application" And Cells(i - 1, 22) <> "Security" And Cells(i - 1, 22) <> "System" Then
          If Cells(i, 22) = "Application" Or Cells(i, 22) = "Security" Or Cells(i, 22) = "System" Then
            c = Cells(i, 50).Value
            str = Cells(i, 5).Value
            str = Replace(str, "/", "・")
            Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
            t.WriteLine c
            t.Close
            Set t = Nothing
          End If
        End If
        If Cells(i - 1, 22) = "Application" Or Cells(i - 1, 22) = "Security" Or Cells(i - 1, 22) = "System" Then
          If Cells(i, 22) = "Application" Or Cells(i, 22) = "Security" Or Cells(i, 22) = "System" Then
            c = "," & Cells(i, 50).Value
            str = Cells(i, 5).Value
            str = Replace(str, "/", "・")
            Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
            t.WriteLine c
            t.Close
            Set t = Nothing
          End If
        End If
      End If
    End If
'複数行、最終行
    If Cells(i - 1, 4) = Cells(i, 4) And Cells(i - 1, 5) = Cells(i, 5) Then
      If Cells(i + 1, 4) <> Cells(i, 4) Or Cells(i + 1, 5) <> Cells(i, 5) Then
        If Cells(i, 22) = "Application" Or Cells(i, 22) = "Security" Or Cells(i, 22) = "System" Then
          c = "," & Cells(i, 50).Value & Cells(i, 34).Value & Cells(i, 36).Value
          str = Cells(i, 5).Value
          str = Replace(str, "/", "・")
          Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
          t.WriteLine c
          t.Close
          Set t = Nothing
        End If
        If Cells(i, 22) <> "Application" And Cells(i, 22) <> "Security" And Cells(i, 22) <> "System" Then
          c = "," & Cells(i, 33).Value & Cells(i, 34).Value & Cells(i, 36).Value
          str = Cells(i, 5).Value
          str = Replace(str, "/", "・")
          Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
          t.WriteLine c
          t.Close
          Set t = Nothing
        End If
      End If
    End If
  Next i
End Sub

Linux

Attribute VB_Name = "CreatFileLinux"
Sub CreatFileLinux()
  Dim str As String, c
  Set s = CreateObject("Scripting.FileSystemObject")
  Dim maxRow As Long
  maxRow = Cells(Rows.Count, 4).End(xlUp).Row
  Dim i As Long
  For i = 11 To maxRow
'一行のみで完結
    If Cells(i - 1, 4) <> Cells(i, 4) Or Cells(i - 1, 5) <> Cells(i, 5) Then
      If Cells(i + 1, 4) <> Cells(i, 4) Or Cells(i + 1, 5) <> Cells(i, 5) Then
        c = Cells(i, 32).Value & Cells(i, 33).Value & Cells(i, 34).Value
        'MsgBox c
        str = Cells(i, 5).Value
        str = Replace(str, "/", "・")
        Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 2, True)
        t.WriteLine c
        t.Close
        Set t = Nothing
      End If
    End If
'複数行、最初の一行
    If Cells(i - 1, 4) <> Cells(i, 4) Or Cells(i - 1, 5) <> Cells(i, 5) Then
      If Cells(i + 1, 4) = Cells(i, 4) And Cells(i + 1, 5) = Cells(i, 5) Then
        c = Cells(i, 32).Value & Cells(i, 33).Value & ","
        'MsgBox c
        str = Cells(i, 5).Value
        str = Replace(str, "/", "・")
        Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
        t.WriteLine c
        t.Close
        Set t = Nothing
      End If
    End If
'複数行、途中行
    If Cells(i - 1, 4) = Cells(i, 4) And Cells(i - 1, 5) = Cells(i, 5) Then
      If Cells(i + 1, 4) = Cells(i, 4) And Cells(i + 1, 5) = Cells(i, 5) Then
        c = Cells(i, 33).Value & ","
        'MsgBox c
        str = Cells(i, 5).Value
        str = Replace(str, "/", "・")
        Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
        t.WriteLine c
        t.Close
        Set t = Nothing
      End If
    End If
'複数行、最終行
    If Cells(i - 1, 4) = Cells(i, 4) And Cells(i - 1, 5) = Cells(i, 5) Then
      If Cells(i + 1, 4) <> Cells(i, 4) Or Cells(i + 1, 5) <> Cells(i, 5) Then
        c = Cells(i, 33).Value & Cells(i, 34).Value
        'MsgBox c
        str = Cells(i, 5).Value
        str = Replace(str, "/", "・")
        Set t = s.OpenTextFile("C:\Users\test\Desktop\CWconfigfile\" & Cells(i, 4).Value & "_" & str & ".json", 8, True)
        t.WriteLine c
        t.Close
        Set t = Nothing
      End If
    End If
  Next i
End Sub

備考

  • このツール自体を作成するために充てられる時間が少なく、コードを最適化する余裕も時間もありませんでした。
  • シンプルに簡単なロジックを羅列しているようダサイコードになっています。
  • ロジック、状況がかなり複雑のため、詳しく説明することが難しいため、メモ―程度の記事になってしまいましたが。実際の使い方、作成時の注意事項等、細かい話を聞きたい方はご連絡ください。
  • 余裕ができればこの記事とコードをきれいにしたい。
Last modified: 2021-03-16

Author