20150127 jawsug京王線 ec2_config
TRANSCRIPT
株式会社グラニ勤務ソーシャルゲーム開発・運用
C#, ASP.NET, Windows Server とOSから上はMicrosoft技術中心
インフラまわりの設計・構築・運用担当
個人活動Microsoft MVP for .NET (C#) (2013/07~)
Twitter: @tanaka_733
ブログ: (銀の光と碧い空) http://tech.tanaka733.net
Ec2上のWindowsを運用・監視するのに不可欠詳しいことはほぼほぼ、このページに書いてあります
EC2Config サービスを使用したWindows インスタンスの設定
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/UsingConfig_WinAMI.html#UsingConfig_Install
初回起動時管理者アカウントに暗号化パスワード生成
RDP用にホスト証明書生成・インストール
ユーザーデータの実行
起動時KMSによるWindowsのアクティベーション
ボリュームのマウントやドライブ文字列のマップ
そのほか、壁紙生成やsysprepの実行など
• ActivationSettings.xmlKMSを使った製品ライセンス認証を制御
• AWS.EC2.Windows.CloudWatch.jsonCloudWatchに送信するパフォーマンスカウンタと CloudWatch Logs に送信するログを制御
• BundleConfig.xmlEC2Config が AMI 作成のためにインスタンスを準備する方法
• Config.xml主要な設定
• DriveLetterConfig.xmlドライブ文字のマッピングを制御
• EventLogConfig.xmlコンソールに表示されるイベントログ情報を制御
• WallpaperSettings.xml壁紙の設定
Ver2.2.5以降の新機能• Windows EventLogの内容をCloudWatch Logsへ転送
• Performance Counterの値をCloudWatch Custom Metricsへ転送
転送できるのはWindowsEventLogに表示されるもの (+IISアクセスログ)
Excel VSTOで設定ファイル作成ツール新し目の機能で仕様変更とかがある気配も感じている
編集UIはExcelで手抜きしつつ、json生成部分だけC#で自動化
jsonおよびそのほかの設定ファイルはDSC経由の配布PowerShell DSC: WindowsにおけるChef的なもの
.NET であれば、(手はかかるけど)ライブラリ経由でEventLogに出力できるので、それを転送できます
{ip_address}が使えない既知の不具合らしいので、{hostname} などで代用
ログの送信で延々と例外が発生IndexOutOfRangeExceptionが出て一切ログが送信できない
Ec2Configのサービス起動のタイミングによるらしく、
スタートアップの種類を「自動(遅延開始)」にするとおさまった
Ec2Configの取得Webページから。リンク先はS3っぽい
インストーラーの実行
$ServiceName = 'Ec2Config'$exePath = "C:¥tmp¥Ec2Install.exe"
Stop-Service $ServiceName –Force# Ec2Install.exe はzipから解凍して自前のバケットに置いてある前提Read-S3Object -BucketName mybucket -Key Ec2Install.exe -File $exePath$param = @{
FilePath = $exePathargument = [string]@(
"/norestart","/quiet"
)}Start-Process @param -Wait# Configを編集してCloudWatch Logsへの送信を有効化しておくのを保証する$configXml = "$env:ProgramFiles¥Amazon¥Ec2ConfigService¥Settings¥Config.xml"[xml]$xml = Get-Content "$configXml"$xml.get_DocumentElement().Plugins.Plugin `| where Name -in "AWS.EC2.Windows.CloudWatch.PlugIn" `| %{
$_.State = "Enabled"$xml.Save($configXml)
}
Start-Service $ServiceName