この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
背景
- 数十台のサーバーにCloudwatch Agentを導入する
- Cloudwatch Agentの設定ファイルはCloudwatch Agent内臓のウィザードで生成できるが、カスタムメトリクスはテンプレート式で作成されるため、細かいカスタマイズは手動で行う必要がある。
- 各サーバーが必要のカスタムメトリクスはWindows、Linuxそれぞれで統一されているが、転送するログファイルのパス・転送先が異なっている。
問題点
- Cloudwatch Agentのウィザードは対話式のため、転送対象ファイルが大量の場合、手動で作成することが難しい。
- Windowsの場合、ログファイル・Windowsイベントログそれぞれ、Cloudwatch Agent設定ファイル上の記載方法が異なる。
- Excel関数でシンプルに転送対象ログ一覧より設定ファイルを生成することができない。
解決してみた
- 転送対象ログ一覧よりある程度大量作成できるものを関数で作る(ログパス、転送先ロググループ、転送先ログストリームなどを読み込んで設定ファイルの1ブロックを作っておく)
- マクロで行ごとに判断し、同一サーバーなのか、同一サーバーの最初行なのか、最終行なのかを判定し、該当行の設定ファイル上の位置を判別する。
- 該当サーバーの環境グループ名とサーバー名で設定ファイルを一括作成する。
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
備考
- このツール自体を作成するために充てられる時間が少なく、コードを最適化する余裕も時間もありませんでした。
- シンプルに簡単なロジックを羅列しているようダサイコードになっています。
- ロジック、状況がかなり複雑のため、詳しく説明することが難しいため、メモ―程度の記事になってしまいましたが。実際の使い方、作成時の注意事項等、細かい話を聞きたい方はご連絡ください。
- 余裕ができればこの記事とコードをきれいにしたい。