t2.microインスタンスでWindowsは使い物になるのか?

ICDP(田舎クラウドデザインパターン)的なネタ再び。

概要

AWS EC2 t2.micro インスタンスのシステム資源は非常に乏しい。
AWS無料利用枠でウィンドウズも対象だけど、本当に使い物になるのか?

目的

t2.microインスタンスへWindows Server 2008R2をインストールしてソフトウェアを起動しようとしたところ、 Out of Memory で起動不能であった。
メモリ1GB、連続して演算できない制限付きのCPU能力で、ウィンドウズを使用するには厳しい。
動作させたいソフトウェアは必要メモリ500MBのため、なんとか使えるようにすることを目的とする。

要件

  • AMI
    Windows_Server-2008-R2_SP1-Japanese-64Bit-Base-2017.11.29 – ami-95d06bf3

  • ページファイル(スワップ)無しで使う。
    スワップが発生したら実用にならないためページファイルは無しとする。
    これはスワップ処理にはCPU時間を消費するため、CPU時間に制限があるt2系インスタンスでは動作が間欠的に停止したり、操作不能に陥ったりするからである。

現状

Windows Server 2008R2 をインストールして起動した状態はこのようになっている。
t2a.jpg

消費メモリは959MB。
メモリ1GBしか無いのに消費メモリがこの状況では無理もない。殆ど空きがない。
40MBではメモリ不足で起動不能となるのは当然であろう。

対処

タスクマネージャでメモリ使用状況を見て削減できそうなプロセスを調べる。
t2b.jpg

TrustedInstaller.exe が460MBも使用している。
これは何かと調べると、Windows Modules Installerサービスのようだ。
Windows Update関連のプログラムで、停止させると更新に失敗するが通常は問題無いので停止させてみた。

無効に設定したサービス

先の大物を含め、無効に設定したサービスは以下の通り。
ただしこれを行うとWindows Updateが失敗するので行う場合は手動で起動し対処すること。

  • Windows Modules Installer
  • Windows Update
  • WinHttp Web proxy Auto-Discovery Service

また、AWSオリジナルの制御機能を使わないのであれば以下も無効にできる。
こちらは計20MB程度の削減にしかならないのでお好みで。

  • Amazon SSM Agent
  • AWS Lite Guest Agent
  • Ec2Config

対処した結果

t2c.JPG

消費メモリが400MB程度となり、600MBの空きを確保できた。

結論

かろうじて要件を満たし動作可能な環境を構築できた。
しかし、リソースには余裕が無いためMackerel等で常時監視した方が良いと思われる。

続きを読む

AWS CloudWatch で、Amazon EC2 Windows インスタンスのパフォーマンスとログの監視をしてみる

0.はじめに

Amazon EC2 Windows インスタンスを利用していますが、
パフォーマンス監視は Zabbix を使って、
ログ監視は特に何も、
という感じでした。

CloudWatch のメトリクスの保存期間も長くなったみたいですし、
運用の手間やリスク、コスト削減も考慮して、
パフォーマンス監視を CloudWatch、
ログ監視を CloudWatch Logs、
にしようかと思います。

1.EC2Config の最新バージョンへのアップデート

  1. 以下のサイトの手順に従って、アップデートします。

2.Amazon EC2 Systems Manager (SSM) エージェントのインストール

  1. EC2 インスタンスに割り当てられている IAM Role に「AmazonEC2RoleforSSM」を付与します。

  2. 以下のサイトの手順に従って、アップデートします。

3.Amazon EC2 Systems Manager (SSM) エージェントを使っての CloudWatch の設定

  1. 以下のサイトを参考にしました。

  2. まず、以下の json ファイルを準備します。

    • 78 行目 : “NameSpace”: “System/Detail/Windows”

      • これが、カスタム名前空間になります。適当な名称に変更して下さい。
    • 44-69 行目 :
      • C ドラのメトリクスの設定になります。他のドライブを追加するのであれば、C を D に変えて、行を追加して下さい。
      • 85 行目にも追加するのを忘れずに。
    Sample-ConfigureCloudWatch-Windows.json
    {
        "EngineConfiguration": {
            "PollInterval": "00:00:15",
            "Components": [
                {
                    "Id": "CPULoadAverage",
                    "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "CategoryName": "System",
                        "CounterName": "Processor Queue Length",
                        "InstanceName": "",
                        "MetricName": "CPULoadAverage",
                        "Unit": "Percent",
                        "DimensionName": "InstanceId",
                        "DimensionValue": "{instance_id}"
                    }
                },
                {
                    "Id": "MemoryAvailable",
                    "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "CategoryName": "Memory",
                        "CounterName": "Available Bytes",
                        "InstanceName": "",
                        "MetricName": "MemoryAvailable",
                        "Unit": "Bytes",
                        "DimensionName": "InstanceId",
                        "DimensionValue": "{instance_id}"
                    }
                },
                {
                    "Id": "MemoryUtilization",
                    "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "CategoryName": "Memory",
                        "CounterName": "% Committed Bytes in Use",
                        "InstanceName": "",
                        "MetricName": "MemoryUtilization",
                        "Unit": "Percent",
                        "DimensionName": "InstanceId",
                        "DimensionValue": "{instance_id}"
                    }
                },
                {
                    "Id": "DiskAvailableMegabytesC",
                    "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "CategoryName": "LogicalDisk",
                        "CounterName": "Free Megabytes",
                        "InstanceName": "C:",
                        "MetricName": "DiskAvailableMegabytesC",
                        "Unit": "Megabytes",
                        "DimensionName": "InstanceId",
                        "DimensionValue": "{instance_id}"
                    }
                },
                {
                    "Id": "DiskFreeSpaceC",
                    "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "CategoryName": "LogicalDisk",
                        "CounterName": "% Free Space",
                        "InstanceName": "C:",
                        "MetricName": "DiskFreeSpaceC",
                        "Unit": "Percent",
                        "DimensionName": "InstanceId",
                        "DimensionValue": "{instance_id}"
                    }
                },
                {
                    "Id": "CloudWatch",
                    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters":
                    {
                        "AccessKey": "",
                        "SecretKey": "",
                        "Region": "ap-northeast-1",
                        "NameSpace": "System/Detail/Windows"
                    }
                }
            ],
            "Flows": {
                "Flows":
                [
                    "(CPULoadAverage,MemoryAvailable,MemoryUtilization,DiskAvailableMegabytesC,DiskFreeSpaceC),CloudWatch"
                ]
            }
        }
    }
    

  3. EC2 のマネジメントコンソールの左側ペインから、「SYSTEMS MANAGER 共有リソース」→「マネージドインスタンス」を選択します。対象となる EC2 インスタンスが表示されるはずなので選択し(表示されなければ、これまでの手順に何か問題があるのかも?)、「関連付けの作成」ボタンを押下します。

    • FireShot Capture 152 - EC2 Management C_ - https___ap-northeast-1.console.aws.amazon.com_ec2_v2_home.png

  4. 「関連付けの作成」画面が表示されるので、以下の項目を入力し、「関連付けの作成」ボタンを押下します。

    • 関連付けの名前 : Sample-ConfigureCloudWatch-Windows ※ 任意
    • ドキュメントを選択
      • ドキュメント : AWS-ConfigureCloudWatch
      • バージョンの説明 : –
    • ターゲット ※ 対象となる EC2 インスタンスが設定されれば OK。
      • ターゲットの選択 : インスタンスの手動選択 ※ 任意
      • インスタンスの選択 : 対象となる EC2 インスタンス
    • スケジュール
      • 指定 : Cron スケジュールビルダー ※ デフォルト
      • 関連付けの実行 : 30 分ごと ※ デフォルト
    • パラメーター
      • Status : Enabled ※ デフォルト
      • Properties : ※ json ファイルの内容をコピペ
    • 詳細設定
      • S3 への書き込み : □ ※ デフォルト

    • FireShot Capture 153 - EC2 Management C_ - https___ap-northeast-1.console.aws.amazon.com_ec2_v2_home.png

  5. 「関連付けの作成」の結果画面が表示されるので、「閉じる」ボタンを押下します。

    • FireShot Capture 158 - EC2 Management C_ - https___ap-northeast-1.console.aws.amazon.com_ec2_v2_home.png

  6. 元の一覧画面が表示されるので、関連付けがちゃんと作成されているか確認します。

    • ※しばらくすると、ステータスが「保留中」から「成功」に変わるはずです。

    • FireShot Capture 159 - EC2 Management C_ - https___ap-northeast-1.console.aws.amazon.com_ec2_v2_home.png

    • FireShot Capture 160 - EC2 Management C_ - https___ap-northeast-1.console.aws.amazon.com_ec2_v2_home_.png

  7. CloudWatch のマネジメントコンソールの左側ペインから、「メトリクス」を選択します。設定したカスタム名前空間と EC2 インスタンスの ID でフィルタをかけて、設定したメトリクスのデータがあるか確認します。

    • FireShot Capture 161 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws_.png

4.Amazon EC2 Systems Manager (SSM) エージェントを使っての CloudWatch Logs の設定

  1. CloudWatch Logs の設定も、CloudWatch の手順と同じです。違うのは、json ファイルの設定内容だけです。

  2. 以下、EventLog の json ファイルです。

    • 36 行目 : “LogGroup”: “Windows/EventLog”

      • ロググループです。適当な名称に変更して下さい。
    • 10,18,26 行目 :
      • 出力レベルです。適当な値に変更して下さい。
    Sample-ConfigureCloudWatchLogs-Windows_EventLog.json
    {
        "EngineConfiguration": {
            "PollInterval": "00:00:15",
            "Components": [
                {
                    "Id": "ApplicationEventLog",
                    "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "LogName": "Application",
                        "Levels": "7"
                    }
                },
                {
                    "Id": "SystemEventLog",
                    "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "LogName": "System",
                        "Levels": "7"
                    }
                },
                {
                    "Id": "SecurityEventLog",
                    "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                    "LogName": "Security",
                    "Levels": "7"
                    }
                },
                {
                    "Id": "CloudWatchLogs",
                    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "AccessKey": "",
                        "SecretKey": "",
                        "Region": "ap-northeast-1",
                        "LogGroup": "Windows/EventLog",
                        "LogStream": "{instance_id}"
                    }
                }
            ],
            "Flows": {
                "Flows":
                [
                    "(ApplicationEventLog,SystemEventLog,SecurityEventLog),CloudWatchLogs"
                ]
            }
        }
    }
    

  3. 以下、IIS ログの json ファイルです。

    • 22 行目 : “LogGroup”: “Windows/IisLog”

      • ロググループです。適当な名称に変更して下さい。
    • 5-14 行目 :
      • サイト毎の設定となります。W3SVC1 以外にも取得したのであれば、変更し行を追加して下さい。
      • 30 行目にも追加するのを忘れずに。
    Sample-ConfigureCloudWatchLogs-Windows_IisLog.json
    {
        "EngineConfiguration": {
            "PollInterval": "00:00:15",
            "Components": [
                {
                    "Id": "IISLogW3SVC1",
                    "FullName": "AWS.EC2.Windows.CloudWatch.IisLog.IisLogInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "LogName": "IISLogW3SVC1",
                        "LogDirectoryPath": "C:\inetpub\logs\LogFiles\W3SVC1",
                        "TimestampFormat": "yyyy-MM-dd HH:mm:ss",
                        "Encoding": "UTF-8"
                    }
                },
                {
                    "Id": "CloudWatchLogs",
                    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "AccessKey": "",
                        "SecretKey": "",
                        "Region": "ap-northeast-1",
                        "LogGroup": "Windows/IisLog",
                        "LogStream": "{instance_id}"
                    }
                }
            ],
            "Flows": {
                "Flows":
                [
                    "(IISLogW3SVC1),CloudWatchLogs"
                ]
            }
         }
    }
    

  4. 以下、カスタムログの json ファイルです。

    • 24 行目 : “LogGroup”: “Windows/CustomLog”

      • ロググループです。適当な名称に変更して下さい。
    • 5-16 行目 :
      • 取得したいログファイル毎の設定となります。適宜変更して下さい。
    • ※すいません。こちら未確認です…。
    Sample-ConfigureCloudWatchLogs-Windows_CustomLog.json
    {
        "EngineConfiguration": {
            "PollInterval": "00:00:15",
            "Components": [
                {
                    "Id": "CustomLogs",
                    "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "LogDirectoryPath": "C:\CustomLogs\",
                        "TimestampFormat": "MM/dd/yyyy HH:mm:ss",
                        "Encoding": "UTF-8",
                        "Filter": "",
                        "CultureName": "en-US",
                        "TimeZoneKind": "Local"
                    }
                },
                {
                    "Id": "CloudWatchLogs",
                    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "AccessKey": "",
                        "SecretKey": "",
                        "Region": "ap-northeast-1",
                        "LogGroup": "Windows/CustomLog",
                        "LogStream": "{instance_id}"
                    }
                }
            ],
            "Flows": {
                "Flows":
                [
                    "(CustomLogs),CloudWatchLogs"
                ]
            }
        }
    }
    

  5. 以下、ETW の json ファイルです。

    • 24 行目 : “LogGroup”: “Windows/ETW”

      • ロググループです。適当な名称に変更して下さい。
    • 5-16 行目 :
      • 取得したいログファイル毎の設定となります。適宜変更して下さい。
    • ※すいません。こちら未確認です…。
    Sample-ConfigureCloudWatchLogs-Windows_ETW.json
    {
        "EngineConfiguration": {
            "PollInterval": "00:00:15",
            "Components": [
                {
                    "Id": "ETW",
                    "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "LogName": "Microsoft-Windows-WinINet/Analytic",
                        "Levels": "4"
                    }
                },
                {
                    "Id": "CloudWatchLogs",
                    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                    "Parameters": {
                        "AccessKey": "",
                        "SecretKey": "",
                        "Region": "ap-northeast-1",
                        "LogGroup": "Windows/ETW",
                        "LogStream": "{instance_id}"
                    }
                }
            ],
            "Flows": {
                "Flows":
                [
                    "(ETW),CloudWatchLogs"
                ]
            }
        }
    }
    

  6. CloudWatch のマネジメントコンソールの左側ペインから、「ログ」を選択します。ロググループの一覧が表示されるので、設定したロググループと EC2 インスタンスの ID でフィルタをかけて、設定したログのデータがあるか確認します。

    • FireShot Capture 162 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws.png

    • FireShot Capture 163 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws.png

    • FireShot Capture 164 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws_.png

99.ハマりポイント

  • 今回も結構ハマりました…。毎回、何やってんだ…。

  • 最初、今回の手順ではなく「SYSTEMS MANAGER 共有リソース」にある「ドキュメント」を作成して対応しようと思ったんですが、ドキュメントの作成がうまくいかず…、断念…。サポートセンターに問い合わせ中です。
  • その後、今回の手順で設定を進めたんですが、json ファイルの設定内容でハマりました。特にディスクの空容量のメトリクスの取得とかがよくわからず、難儀しました。こちらのサイトで何とか解決しました。ありがとうございます。

XX.まとめ

これで、
何とか運用監視も AWS だけで事足りる様になるのではと。

CloudWatch の 15ヶ月のデータ保存じゃ短すぎる!!
という場合は、
こちらのサイトのやり方などもあるみたいです。

続きを読む

Poweshellでsshチックなことをする

経緯

aws で、最近 iam role の付け替えが出来るようになりました。
早速 windows の iam role を起動したまま切り替えたのですが、その際に ssm が connection timeout になってしまいました。
Restart-Service Ec2ConfigOnline になるのですが、対象サーバがそれなりにあったので、もう少し楽にできないかと思い、 powershell を使うことにしました。

方法

winrm を使用すれば、 powershell でリモート接続しコマンドを叩ける。
ざっくりと二通りあったのでメモしておきます。

wirm でリモート接続するためには、 Enable-PSRemoting で有効化する必要があるので、詳しくは参考 URL を見ていただければと。。。

方法其ノ一

セッションをはる

New-PSSession -ComputerName <Public DNS or Private DNS>
※ __Public DNS__ , __Private DNS__ どちらでも行けました。検証済み

下記でリモート接続しているサーバに対してコマンドを叩く

Invoke-Command -Session $sess -ScriptBlock {ls;}

添付画像のように、変数でうけるのがベターっぽいです。

jump.png

補足

New-PSSession を使用すると、サインアウトしても session は残るので、 Remove-Session してあげましょう。

方法其ノ弐

New-PSSession だけではなく、 Enter-PSSession でも出来るようです。

Enter-PSSession -ComputerName <Public DNS or Private DNS>

jump 2.png

ほぼ見えてませんが、下記のようになってます。
多段sshしている気分になります

[Public DNS]: PS C:¥Users¥hoge¥Documents>

まとめ
RDP したくないから、ssm使ってるのになんでやねん!ってなりました。
ただ、一つ知見が増えて良かったです。

参考

http://hensa40.cutegirl.jp/archives/677

続きを読む

SSMを用いたCloudWatchLogsへのイベントログ出力

WindowsServer2012のEC2Config Ver4.x以降とWindowsServer2016からはCloudWatchLogsへのログ出力設定方法が変わりました。

今回は東京リージョンにイベントログを出力する手順に絞って記載します。
※いままでEC2Config経由でログ出力設定をしていた方であれば、任意ログの設定方法もわかると思います。

EC2でWindowsインスタンス作成

  • 割愛

EC2インスタンスにアタッチしたIAMRoleの設定

  • AmazonEC2RoleforSSM を対象インスタンスのIAMRoleにアタッチする

ドキュメント作成

  1. 以下の画面で[Create Document]をクリック
    https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home#Documents:Owner=MeOrAmazon;sort=Name
  2. 以下を入力
    Name: [ドキュメント名]
    Content: 以下のjsonファイルの内容をコピペ
cloudwatchlogs_conf.json
{
    "schemaVersion": "1.2",
    "description": "Example CloudWatch Logs tasks",
    "runtimeConfig": {
        "aws:cloudWatch": {
            "settings": {
                "startType": "Enabled"
            },
            "properties": {
                "EngineConfiguration": {
                    "PollInterval": "00:00:15",
                    "Components": [
                        {
                            "Id": "ApplicationEventLog",
                            "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "LogName": "Application",
                                "Levels": "1"
                            }
                        },
                        {
                            "Id": "SystemEventLog",
                            "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "LogName": "System",
                                "Levels": "7"
                            }
                        },
                        {
                            "Id": "SecurityEventLog",
                            "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                            "LogName": "Security",
                            "Levels": "7"
                            }
                        },
                        {
                            "Id": "ETW",
                            "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "LogName": "Microsoft-Windows-WinINet/Analytic",
                                "Levels": "7"
                            }
                        },
                        {
                            "Id": "IISLog",
                            "FullName": "AWS.EC2.Windows.CloudWatch.IisLog.IisLogInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "LogDirectoryPath": "C:\inetpub\logs\LogFiles\W3SVC1"
                            }
                        },
                        {
                            "Id": "CustomLogs",
                            "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "LogDirectoryPath": "C:\CustomLogs\",
                                "TimestampFormat": "MM/dd/yyyy HH:mm:ss",
                                "Encoding": "UTF-8",
                                "Filter": "",
                                "CultureName": "en-US",
                                "TimeZoneKind": "Local"
                            }
                        },
                        {
                            "Id": "PerformanceCounter",
                            "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "CategoryName": "Memory",
                                "CounterName": "Available MBytes",
                                "InstanceName": "",
                                "MetricName": "Memory",
                                "Unit": "Megabytes",
                                "DimensionName": "",
                                "DimensionValue": ""
                            }
                        },
                        {
                            "Id": "CloudWatchLogs",
                            "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                            "Parameters": {
                                "AccessKey": "",
                                "SecretKey": "",
                                "Region": "ap-northeast-1",
                                "LogGroup": "Default-Log-Group",
                                "LogStream": "{instance_id}"
                            }
                        },
                        {
                            "Id": "CloudWatch",
                            "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                            "Parameters": 
                            {
                                "AccessKey": "",
                                "SecretKey": "",
                                "Region": "ap-northeast-1",
                                "NameSpace": "Windows/Default"
                            }
                        }
                    ],
                    "Flows": {
                        "Flows": 
                        [
                            "(ApplicationEventLog,SystemEventLog,SecurityEventLog),CloudWatchLogs"
                        ]
                    }
                } 
            }
        }
    }
}

3.[Create Document]をクリック

ドキュメント紐付け

  1. 以下の画面で[Create Association]をクリック
    https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home#ManagedInstances:sort=InstanceId
  2. Command documentで作成したドキュメントを選択
  3. Select Targets byでManually Selecting Instancesを選択後、対象インスタンスを選択
    ※インスタンス作成直後だと、表示されないことがあります。待ちましょう。
  4. [Create Association]をクリック

まとめ

ここまでの手順からわかるとおり、ログ出力設定はドキュメントとして外出しする形になりました。
インスタンス構築の度に同じログ出力設定を書く手間がなくなり、かつログインせずにログ出力設定ができるようになりました。
複数台に同じ設定を適用する場面ではうれしい機能ですね。

続きを読む

CloudWatch エージェントは SSM エージェントと呼ばれる別のエージェントに移行されましたとさ

ログは外に出しますよね

EC2 の Windows インスタンスでイベントログやアプリケーションログを CloudWatch Logs に転送して運用しています。
ログを見るためにいちいちインスタンスに入る必要もないし、必要なログがインスタンス外にあることで AutoScaling でインスタンスが勝手に破棄されても大丈夫という設計です。

これまで

ログ転送設定を C:Program FilesAmazonEc2ConfigServiceSettingAWS.EC2.Windows.CloudWatch.json に書いて EC2Config サービスを再起動することでインスタンスごとにログ転送の仕方を設定していました。
これを CodeDeploy の Hook スクリプトで行い、アプリケーションの配置と同時にログが指定した(アプリケーションごとの)ロググループにロストすることなく集めることができていました。
ちなみに Windows Server 2012 R2 です。

EC2Config ログ転送やめるってよ

あるとき、こんな記事を見つけました。
Windows ServerのCloudWatch LogsをSSMで行う | Developers.IO

従来のEC2 Configの設定を行っても、CloudWatch Logsへログの転送が行われないので注意してください。

え?まじで?
試しに新しい AMI で試してみましたがやっぱりログは転送されません。
今後は SSM で設定しなくちゃいけないのかと調べましたが、どうもやりたいことができません。
やりたいことって何よ?を書くと長くなりそうなんで書きませんが、とにかく、インスタンスに置いたローカルファイルからログ転送設定をしたいんです。

どうも SSMAgent です

EC2Config バージョン履歴的なドキュメント を確認したらなんだかローカル設定ファイルを使えそうな雰囲気が・・・

ローカル設定ファイル (AWS.EC2.Windows.CloudWatch.json) を使用して、インスタンスで CloudWatch の統合を有効にしている場合、SSM エージェントと連携して動作するようファイルを設定する必要があります。詳細については、「Windows Server 2016 インスタンスで CloudWatch 統合用のローカル設定ファイルを使用する」を参照してください。

お?・・・え? Windows Server 2016 だけなん?

結局、サポートに問い合わせて回答をいただきました。

CloudWatch Logsの設定方法

これまでと同様にローカルのファイルをお使い頂けますが、CloudWatchもしくはCloudwath Logsの設定変更が必要な場合には、下記の手順を実施頂くようお願いいたします。

  1. Amazonssmagent サービスを停止します。
    コマンドプロンプトで net stop amazonssmagent を実行することで停止できます。
  2. C:Program FilesAmazonSSMPluginsawsCloudWatchAWS.EC2.Windows.CloudWatch.json を削除いたします。
  3. C:Program FilesAmazonEc2ConfigServiceSettingAWS.EC2.Windows.CloudWatch.json の内容を編集いたします。
  4. Amazomssmagent サービスを開始します。
    コマンドプロンプトで net start amazonssmagent を実行することで開始できます。

新しい設定が反映されますと、AWS.EC2.Windows.CloudWatch.json の内容が C:Program FilesAmazonSSMPluginsawsCloudWatchAWS.EC2.Windows.CloudWatch.json に出力されます。
テキストファイルの改行コードが変わり、Headerが追加されますが、影響はございませんので、無視頂くようお願いいたします。

・・・ふむ。
これ通りに試したところ、無事にログ転送がされました。

極端なことを言ってしまえば僕のケースでは、再起動するサービスを EC2Config から SSMAgent に変えるだけで良かったと言う話です。(担当部署が変わったからそっちに聞いて的な)
でもあくまで設定ファイルの大本は今まで通り EC2Config の下にあるファイルで、それを読み込んで SSM の下のワークスペース的なところに保持するって感じなんですね。

まとめ

  • 新しい Windows AMI でも CloudWatch Logs のログ転送設定をローカルファイルで行える
  • ただし扱うサービスは SSMAgent
  • ファイルの置き場に注意
  • AWS のドキュメントはやっぱり追いつくのが遅い
  • AWS のサポートは丁寧で助かる

続きを読む

Windows + fluentd → CloudWatch Logs を諦めた話

この記事は2016年2月ぐらいに書いて、ずっと下書きのまま放置されてたものです。
確かあとでログとかキャプチャとかを貼ろうとしてて・・・。
現時点で Windows + fluentd → CloudWatch Logs が快適に使えるかどうかは分かりませんが、誰かがコメントくれたりする僅かな可能性もあるかと思い公開します。


AWSのEC2のWindowsにはEC2ConfigというServiceがあり、それを使うとEventLogやIISのログ、任意のアプリケーションログなどをCloudWatch Logsに送ることができます。
しかし現時点では、送信時の形式など柔軟性がいまひとつといった印象です。
Linuxではデータコレクタのfluentd(td-agent)を使ってCloudWatch Logsに送るということもよくやられてるようです。
2015年10月8日にfluentdがWindowsに正式対応したとのことなので、WindowsでもLinuxと同じようにできるか試してみました。
ちなみに僕はfluentdに初めて触りました。

Windowsへfluentdインストール

使用したのはAWSのWindows Server 2012 R2(EC2, Amazon AMI, 英語版)です。
基本的にはこのサイトに書かれている手順で行いました。
【参考】Fluentd が Windows を正式サポートしたので動かした
検証時のRubyバージョンは2.2.4でした。
起動して標準出力にログがポロポロ出てくるのが確認できました。

「お、なんかいい感じじゃん」

fluentdプラグインインストール

fluent-plugin-winevtlog

EventLogの収集もしたかったのでfluent-plugin-winevtlogも試しました。
gem install fluent-plugin-winevtlogでインストール。configにEventLogを収集するsourceディレクティブを書いて実行してみるとエラーになりました。

うーむ。なんだかエラー文の中のファイルパスがLinuxっぽい。
どうやらプラグインのインストールと同時にfluentdの別バージョンを参照するようになってしまったらしい。
【参考】人生楽しまなきゃもったいない!: fluentdをWindowsで使う
こちらの記事を参考にfluentdをアンインストールして再度実行すると無事EventLogを収集することができました。

「まぁ、うん。いいだろ」

fluent-plugin-cloudwatch-logs

CloudWatch Logsにデータを送るのが最終的な目的です。
fluent-plugin-cloudwatch-logsをインストールしました。
案の定、別バーションがインストールされてしまうのでアンインストール。
configにCloudWatch Logsへ送るmatchディレクティブを書いて実行!
エラーです。

僕はRubyはよくわかりません。
Fluent::SetTimeKeyMixinが初期化できないっぽいです。
僕はRubyはよくわかりません。
モジュールが足りてないっぽいです。
僕はRubyは(ry

いろいろ調べたりして最終的にはfluent-plugin-cloudwatch-logs-0.2.0libfluentpluginout_cloudwatch_logs.rbの1行目に以下を追記すると起動することができました。

out_cloudwatch_logs.rb
require 'fluent/mixin'

「ここまで手を加えないといけないもんか!?」

さらなるエラー、そして諦念

起動はできるようになったものの、肝心のCloudWatch Logsへの送信がうまくいってないようでエラーです。
fluentdもRubyも経験値が足りなすぎてここまで来るのに結構時間かかってしまったこともあり、もう調べる気力がなくなりました。

「もうEC2Configでいいかなー」

まとめ

サクッと「Windows + fluentd → CloudWatch Logs」をやるにはいろいろ時期尚早なのかも。

続きを読む