1時間ごとにlogrotateする方法
ログファイル管理はlogrotateを使って週1回または1日1回ローテートするように仕掛けたらひとまずOK。だいたいのケースでは。
が、普通に設定したら最短で1日1回しかローテートできないので、ログファイルが数百MB、数GBと大きくなる場合にはOKとは言えない。 できれば1時間に1回ローテートできないものか。
単純な発想だが、1時間に1回、cronで強制的にローテート実行させることで可能である。 以下、logrotateの基本的な設定方法の確認の意味も込めて、手順をメモっておく。
1.アーカイブ先(olddir)作成
アーカイブ先を分けるのは必須ではないが、分けておくとログディレクトリ直下には常に最新のログのみが書き出されているのですっきりする。
# mkdir -p /var/log/nginx/archives
2.logrotate設定
毎時ローテートさせたいログファイル専用の設定ファイルを用意する。
# mkdir -p /etc/logrotate.hourly # vi /etc/logrotate.hourly/nginx
気をつけるのはローテートさせる回数とファイル名(日付・タイムスタンプ付にする)。 あとは好みに応じて設定。
/var/log/nginx/huge_access.log { create 0644 nginx nginx daily # cronで実行するため、実質的に意味なし rotate 720 # 1ヶ月保持出来るローテート回数(24回/日 × 30日) missingok notifempty compress dateext # ファイル名に日付を付ける dateformat -%Y%m%d-%s # 毎時生成されるためタイムスタンプを付ける olddir /var/log/nginx/archives sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript }
※dateext, dateformatの "%s" は、logrotateのバージョンによって使えない場合もある。
3. 設定テスト
-d デバッグモード(dry-runされて、ローテートされない)で実行し、設定エラーが出ないか確認
# logrotate -dv /etc/logrotate.hourly/nginx
4. 初回実行
新規にローテート対象となったファイルは、初回実行時に /var/lib/logrotate.status にエントリ追加されるだけでローテートされないので、cronでスケジュール実行される前に1回手動で実行する
# logrotate -v /etc/logrotate.d/logrotate.hourly/nginx
※1回目は、いずれのログも /var/lib/logrotate.status にエントリがない、または既に毎時ローテートされているファイル のどちらかのため、 dailyローテートのテストとしては、ローテート対象外(log does not need rotating)という結果になる。
5.ローテート履歴(logrotate.status) 確認
対象のログが、logrotate.status エントリに本日日付で入っていることを確認。
# cat /var/lib/logrotate.status logrotate state -- version 2 ・ ・ (略) "/var/log/nginx/huge_access.log" 2015-8-29 #←これ
6. cron設定
5までで、毎日3:00以降の任意のタイミング(cron.dailyの実行タイミング)でローテートが実施されるようにはなった。 ただ、これだけでは日次ローテートしかされないため、cronで毎時実行させる。
# logrotate -f で強制ローテート実行 0 * * * * /usr/sbin/logrotate -f -s /var/lib/logrotate.status /etc/logrotate.hourly/nginx
これで設定完了。
・・・と、これを書いている最中、既に3.8.5からhourly設定可能になっているという情報を見かけ。今度使ってみよ。
https://fedorahosted.org/logrotate/browser/tags/r3-8-8/CHANGES
参考
タイトルとか決めてないけどこのままでもいいかもしんない: logrotateでnginxのログを1時間ごとにローテートをする
Gitでリモートブランチをローカルにチェックアウトする
今のところ頻繁にやる作業ではないため、忘れがち。 なんだっけ・・・とググってたらドンピシャだったので備忘録代わりに貼らせて頂きます。
新人アドテクエンジニア向け学習コンテンツ
インターネット広告の会社に勤めているのですが、5月に配属されてきた新卒のエンジニアの卵に、「どうやって勉強すればいいですか?」と聞かれたのと、以前何人かに「どうやって情報収集していますか?」と聞かれた経験があったので、まずは参考になるサイトをジャンルごとにピックアップしてみました。
業務(広告、マーケティング)系
- Markezine
アドテクに関わる人は、特に下記コンテンツは役に立つと思います。
- ここからはじめよう!アドテクノロジー基礎講座一覧
- Web担当者Forum
エンジニア向けの技術コンテンツではありませんが、広告効果指標の用語説明など、 ネット広告運用の業務知識として役立つ記事が満載です。
- 業界人間ベム
これは何気に自社で運営しているブログで、ネット広告業界の著名人、横山隆治 氏が書いています。 このブログも結構この界隈では有名らしいです。
また、こんなふうにまとめてくれているところもありました。
- NAVERまとめ 新人webマーケティング担当者にオススメのサイトまとめ
僕はNAVERまとめでまとめたことはありません。。
ITニュース、技術ポータル系
エンジニア向けの技術系コンテンツが豊富なポータルサイトがよく使えます。 IT系出版社が運営してるのが多いです。
- gihyo.jp
上記3つは実装系の話題が多いサイトでかなり使えます。
- ITPro
エンタープライズ系のニュース、コンテンツが多いですが、 ここは技術情報(コマンドリファレンスなど)も多いです。
- TechCrunch
Webスタートアップ系のニュースが多いとこです。
ニュース系の話題や個別の記事は、自分から行って色々見るのももちろんいいですが、 だいたい検索流入するか、FB、Twitter、メルマガから気になるのを見るという使い方が良いような気がします。
ブログ系
- Qiita
アカウント含め基本的に個人ですが、今や技術系の話題はググると高確率で当サイトがヒットします。 個人の技術ネタのストック先は普通のブログよりこっちに書く方が反応が良いくらい。 かなりの数のエンジニアが寄ってきていると思ってよいです。
* Web系企業の公式ブログ
各社のエンジニア達が書いているブログがここに集まっています。 気になるものをブックマーク、いいね!、フォローなどしてください。
Q&Aサイト
プログラムに関するあれこれを聞くと、「お、知ってるぜ」と思ったエンジニアが返してくれるQ&Aサイト。
- stack overflow
技術Q&Aサイトの有名どころです。 英語が本家ですが、日本語版もいつからかできたみたいです。
- teratail
stack overflowの日本語版の代わり?と思いましたが、 目指しているところは「勉強会」だそうで、ちょっと違うコンセプトのようです。
回答が最速52秒で返ってきたとか。
動画学習コンテンツ
- ドットインストール
動画でプログラミングの学習ができるありがたいサイトです。
フォローしておくべき人
ここまで挙げたのはサイトですが、情報収集は書いてある場所よりも「良い情報を知っている人」を知っていること、いわゆる "know who" が重要という側面もあるので、その参考に少しだけ以下もメモっておきます。
- 2015年新米エンジニアがフォローすべきツイッターアカウント50選
- Web担当者必見!今すぐフォローすべきWebマーケティング界隈の著名人Twitterアカウント51選
- 今すぐフォローすべきAWS界隈の素晴らしきエンジニア達 #jawsug | Developers.IO
http://dev.classmethod.jp/cloud/aws/lets-follow-aws-engineers-now-2014/
JAWS DAYS 2015 参加レポート
JAWS DAYS 2015 に参加してきました。
昨年は都合が悪く行けなかったので、初めての参加。
会場の雰囲気はこんな感じ。
人気のセッションは立ち見だったので簡単になってしまったけど、以下、備忘のためメモアップします。
※後日資料が公開されたりするので随時更新しようと思います。
スマートニュースの世界進出を支えるログ解析基盤 on AWS
立ち見で途中から入ったのであまり全体の流れがメモできず。 気になったところ+考察という形で。
インフラ構成について
・ストレージとアプリケーション層は分離すべき ・分離することでクラウドらしい設計になる
Azkaban
[特徴]
- ジョブ管理がしやすい
- ジョブをコードで定義
[デメリット]
- Azkabanのexecuterは一代しか持てない
http://sstd-bigdata.blogspot.jp/2014/09/azkaban.html
http://d.hatena.ne.jp/wyukawa/20150110/1420889758
初めて聞いた。ジョブ管理ツールはこれというものがなかったので、使ってみたい。
Presto
Facebookで開発されたクエリ実行エンジン。 今はTreasuredataなどでも使える。 自分も会社で使ってます。
クエリ実行エンジンでDBそのものではないから、 複数のデータソース(MySQL&Hiveなど)のjoinができる →以下のスライドが理解の助けになるはず。
Chatio
バックエンドが切り替えられるダッシュボード。 フロントエンドの作り込みが不要 見やすい、キレイなので毎日見る気が起きる。
BigQuery
すごい。あまり深いこと考えずにクエリ投げても返ってくるが、 データを扱う技術は追いかける必要があると思うので、使い分けが必要と思う
所感
成長とともにインフラもちゃんと成長してきているのが分かり、尊敬。 設計思想などは現場の実感が込められているのが伝わってきました。
まる見え、AWS!! ~CloudTrailとConfigからわかるAWSオペレーションのすべて~
CloudTrailはまだちゃんと使えていないので、ノウハウなど得られるといいなと思い。
Cloud trail
AWS APIの呼び出し履歴が取得出来るいわゆる監査ログ記録・管理のためのログ送信ツール。
AWSセキュリティ編~CloudTrailの活用~ – ナレコムAWSレシピ
Management Consoleの操作などNon API call のイベントも取れる JSON形式での出力でどうするか?というのは使い方次第。
「現在有効にしていない人は今すぐ有効化してください!」というほど大事なサービス。
使い道
- アラート検知
- 文字列検索
- 可視化
Cloud trail のログをcloud watch logs に連携 メトリックフィルタを作って特定インスタンスタイプが作られたらアラート飛ばすなど クラウドformationでメトリック作れるのが出来た。楽にできるはず。
CloudSearchに入れてログを検索したい!
例えばあらかじめ拾いたいメトリックスをフィルタにして、SNS,SQSを使って Elastic searchにいれてKibanaで見るなどの仕組み
Aws config
設定変更がどのインスタンスやセキュリティグループと紐付いてるかを一気に取れる 既にLog strageなどいくつかの製品と連携している 例えば古いAMIから上がっているインスタンスはどれか?などもわかる
所感
CloudTrailって監査ログってイメージだったのだけど、積極的に可視化するという思想はあまりなかったんだけど、やっぱりちゃんと検知・分析できる仕組みを構築しないと、と思いました。
www.slideshare.net
「OpsworksでDevOpsを感じよう」、「OpsWorkの仕組みと活用方法の紹介」
続けて聞いたのでこちらはまとめてメモ。
OpsWork
- 2013年2月よりローンチしたサービス
- プロビジョニング、設定管理、デプロイメント、監視及びアクセス制御など
- 複雑なアプリケーションライフサイクルのための管理ソリューション
OpsWorksで設定管理に関係するaws項目
EC2,VPC,ELB,EBS,RDS,IAM
スタック
OpsWorksのトップエンティティ、全体の設定を行うところ
スタック作成の準備
- リージョン
- VPC
- EC2 などなど
上記ができていれば、コンソールからポチポチ デフォルト設定をする (詳細作成の際に変更していくことは可能】
最初にNWを作って、OpenにしておかないとOpsWorksのエージェントが通信できない
レイヤー
OpsWorksには「レイヤー」が必要。なんすかそれ。。 (例) * HA Proxy * App Rails App Server, PHP AppServer * DB ** MySQL などなど
インスタンス、スケールタイプを指定
OpsWorksを使うと良くなるところ
EC2起動、ソフトウェアインストール、デプロイの自動化
Capistranoなどのツールを使えば自動化出来るが、AWSのマネージド機能ではできないので利用価値はある
OpsWorksで起動したインスタンス内部で起動するOpsWorksエージェントがChefレシピを実行可能
OpsWorksエージェントからOpsWorksエンドポイントに対してPolling
- OpsWorksによって発行された一連のコマンドを取得して、Chef solo(Chef Zero)でレシピを実行 ※Chef Serverと通信するわけではない。あくまで単体実行
- Chefのレシピやアプリケーションコードは指定したコードリポジトリから展開(Git等)
OpsWorksで実行可能なコマンド(2種類)
- スタックコマンド
スタック全体の構成を変更・管理するためのコマンド、MCから実行可能
- エージェントコマンド
基本はスタックコマンドを使う
- スタックコマンドを使って、リモートから任意のタイミングでインスタンスにコマンドを実行可能
→MCから指示するだけ
- レシピを自動実行させるために、ライフサイクルイベントを利用 (Setup,Configure,Deoloy,undeploy,shutdonw) ←Chefのビルトインレシピ
カスタムレシピをもちろん利用可能
どうやってライフサイクルイベントを利用するの?
→最初のインスタンスを起動すると、Setupが呼ばれる→Deployが走る→全てのレシピが成功したらConfigureイベントが呼ばれる
利用例
- 運用関連タスクの自動化の例
- セキュリティ脆弱性に対するソフトウェア・パッケージアップデートをChefレシピから自動で展開するなど (再起動とか、Perlパッケージとか、気にしなくて良い構成にしてないとダメよね。。)
www.slideshare.net
www.slideshare.net
- OpsWorkのハンズオン資料 www.slideshare.net
ランチ
参加費1000円は払ってるものの、タダ飯が食えるという太っ腹なおまけ付き。
ランチセッションもやってたけど、あまり見たいのがなかったのでゆっくり食べてました。
腹ごしらえして、さぁ午後のセッション。
MMO RPG on AWS
ソリューションアーキテクト今井さんのセッション! いつもお世話になっております。
今回は韓国のSAユンジンさんとの共同セッション。 ユンジンさんが英語でプレゼンし、今井さんが日本語で訳すというチャレンジングなセッション。 カッコええ。
NexonoのMMORPG環境の運用事例の紹介をしてくれました。
MMORPGとは
- Massively Multiplayer Online Role Playing Game
- 非常に多数のユーザが同時接続し、インタラクションしながら進めていくゲーム
MMORPG on AWS needs - Massive message handling -
- 膨大な数のメッセージのハンドリング
非常に多くのユーザが同時に接続して、魔法を使うと他のユーザにダメージが出るなど、同時インタラクション要素が非常に多い(N - N)
- 1台→スケールさせるためにはどうするか?
オンプレだったら、TCP,UDPで独自プロトコルの上でマルチキャストを実現 ** が、AWSではマルチキャスト、ブロードキャストはサポートしてない。どうするか?
PubSub (Publish-subscribe) モデルを使う ** SNS,Elasticache,RabbitMQなどを使って実現
ZeroMQを使った C,C++実装、速い No brokerノードの仕組みなので、No SPOF
Game server load balancing
1つワールドを実現するには、サーバ毎にセッションを分ける等を行っていたが(どっかで昔聞いたような・・・) それをどうやって複数サーバで1セッションを実現するか。
1つのGameのMap上で離れた島(国?)間はあまりインタラクションが発生しない。別々のセッションにできる
- エリアの特性によって、ユーザの偏りがあるためロードバランス上課題となる
- Low densityエリアは1台のサーバで広くカバー
- High densityエリアは複数のサーバでカバー
- ダイナミックにサーバをAllocationさせる
- 複数のサーバでカバーしているところはいかにインタラクションさせるか?
- エリア内でユーザが大きくなってきてしまったら、Geo locationで分割
- 分けたサーバ間でデータをsync
Minimize data sync
データ同期を最小化するための仕組み
例:植物、動物、人(ユーザ)が登場人物 それぞれを別サーバに切り出し、マップ上の同じ場所で動きがある部分(オーバラップしたところ)だけ インタラクション(同期)する
Ghost abstraction
以下に低レイテンシで大量のI/Oを実現するか
- MMOの各ユーザの持つデータは様々
全てDBに格納する必要がある
基本は非同期I/O
- NoSQLを使う
- DynamoDB
- MongoDB
- CouchDB
RDBでなくNoSQLな要因?
- 今更だが、DBスケールアップで限界が来るとビジネスが頭打ちになる
スケールアウト可能なアーキテクチャ
多くのアイテムを如何に高速に検索して返すかというのが重要なポイント
- NoSQLと CloudSearch or ElasticSearch を用いる ** EC2-ElasticSearch-NoSQL
(この連携の仕方がよく分からん。。)
まとめ(抜粋)
- Ec2のエンハンスドネットワーキングはとても優秀
- NoSQLと検索の組み合わせ
- データ同期の平均所要時間を縮めるために非同期I/Oを利用する
- 分散環境においてゲームキャラクタ同士のインタラクションを実現するためにRPCを利用する
Q&A
- ブロードキャスト、マルチキャストをサポートする気があるか→今のところプランなし
- ちなみに使いたい人は?→会場では少数
そんな話題にフォーカスすること自体、自分にとっては少々驚きでした。
所感
ゲームの運用をここまで掘り下げて聞けたのは初めてだったのでとても興味深かった。 この業界は本当にテクニカルで難しそうだけど、面白そうだな、と思いました。
開発するように運用するインフラ (Kaizen Platform)
超人気セッションに。naoya氏の露出の影響が大きいためか、皆名前を知っているのだろう。
Kaizen Platformの事業
サイトのA/Bテストをするインフラを提供
- 管理画面
- Js配信
- jsの計測
→jsを埋め込んで、計測する
すべてインフラはAWSを利用 ELB,EC2,RDS,ElastiCache というシンプルな構成
色々とSaaSを使っているので、主にGitHubとCircleCIを使った開発・運用について紹介
Githubでの開発プロセス
- Work in progressでpullrequest(マスターbranchから開発branchを切る)
- 開発
- レビュー レビュー依頼はチャットのBotに出す。 PR内で注意点をいれてmention
E2Eテスト
E2E(End-to-End)テスト
システム全体が正しく動作することを確認するテスト。UIの動作・裏側API・バッチも含めてのテストと言うことか
headlessテスト(自動テスト)
- 本番リリース
QAブランチ
専用branchにマージしてテスト
CircleCI
任意のbranchへのpushを契機にアクションさせられる
- master branchへマージしたらunitテスト
デプロイbranchにいれたらデプロイ
本番デプロイbranchにpullrequestのリストができる
では、インフラは?
- GitHub,CircleCIに、Chefを追加して運用
- できるだけ運用プロセスを開発プロセスと合わせるようにしている
運用プロセスを開発、インフラと合わせることができると、開発側で構成変更したい時にも入りやすくなる
構成管理変更はChef Recipeに書いてpullrequest
リリースもチャットとcircleCIに残るので、このプロセスに乗るだけでドキュメント手書きしなくても履歴が残る
構成変更後はE2Eテストで大丈夫か確認
構築検証、Serverspecでテスト(circleCI)
レシピを作るところ以外はgithub,circleCI,チャットでインフラ運用できる
- この仕組みにしてからサーバログインすることがなくなりました(!)
Kaizenの行動指針
官僚的にならない (×~さんの許可がないと出来ません)
「権威的にならない」(クックパッド) という言葉で気付かされた
クックパッドのインフラ責任者が語る、DevOpsを成功させる考え方「迷ったら健全な方を選ぶ」~DevOps Day Tokyo 2013 - Publickey
- 受理して許可を出す側の人間は権威的になりがち
- 気づかずそうなってる場合もある
大事なこと
- 開発と運用のプロセスを出来るだけ合わせる
- 開発が運用に参加する敷居を下げる
- やろうと思えば出来るという環境 ** 気軽に構成変更のpullrequest出せる
- インフラエンジニア怖くない ** 開発の人からするとそんなイメージもあるので注意
これ、すごい身につまされる指摘だと思う。 自社の現場にいても分かるけど、質問しにくい雰囲気出しているインフラメンバに、恐る恐る質問しに来る開発メンバという構図は結構見かける。 インフラの立場からして、急な作業依頼とかでイラッとすることもあるのは理解できるけど、開発者の方も事前に伝えられない事情はよくある。 (お客さんや連携先の会社の都合とかはもちろんそうだし、そもそも何かの事情で作業をするときに「インフラで対応が必要」ということまで見えている開発者は少なかったりする。)
セキュリティアップデート
チャットからセキュリティアップデート指示 すごい。
yum --security -y update する旨と、アップデートされる依存パッケージなどを記述してpullrequest
- マージを契機に実行
- ただ、再起動があるものなどは同じように実行はできないので、そこは泥臭くやる。(ちょっと親近感w)
運用課題
- CircleCIがボトルネック
- 開発、インフラ(レシピ)、E2Eテスト 全てここを使うので
- テストとかを早く(軽く?)することで頑張る
- あとはお金で解決(今のところ)
他、使っているSaaSの紹介
Bugsnag
- Crash レポート解析サービス
Error Monitoring & App Stability Management | Bugsnag
Pingdom
- 複数の拠点からhttpのエンドポイントをひたすら監視してくれるサービス
このあたりが参考になりそう。 HTTP監視サービスPingdomについて | 稲葉サーバーデザイン
PagerDuty
- 障害時の通知サービス
- Sensuとの連携可能(カイゼンではsensu利用)
- 少人数でインフラ運用するのによい
EC2はもう不要?Lambdaってなにができるの?
まさにLabmdaって何よ?って状態だったので、概要をつかむために聴講。
登壇者
- Webエンジニア(非インフラ)
- AWS歴2,3年
- Node.js1週間
- Labmdaはまだ業務では使ってない
Labmda概要
イベント発生時コードを実行できる (イベントドリブン型のバッチが作れるかな…でもnode.jsでは)
例)画像をs3にアップロードするとサムネイル画像を作って保存
トリガを設定
- 対応するサービスまだ少数
- S3,cloudtrail,DynamoDB,Kinesis
画面から設定できるのはS3のみ
イベントに応じたコードを設定
- 画面上でコードを書く
- 画面からコードをアップロードする
どちらもManagementConsoleで設定可能 (ここでコード書く人いないと思うけど)
料金
- 使用した分のみ
- $0.20/100万リクエスト
- メモリ×実行時間
- メモリ1GB/秒の使用につき$0.00001667
所感
- サーバ不要でイベントドリブン処理が動かせる、という理解ができた
- まだNode.jsのみなので、良い活用事例などはもう少し後になりそう
- 何に使えるか?
- EC2でcronでポーリングして実行するバッチ処理
- Node.jsのapiで作ってあってs3,ec2にインプットがあるもの
各セッション資料まとめ(by dots.)
イベント情報サイトのdots.さんで資料とレポートのまとめページが公開されました。 参加出来なかったセッションの内容はこちらを参照。
EC2起動時の自動セキュリティアップデート(yum update)を無効にする方法
Launch Instanceする際、「Configure Instance Details」の「Advanced Details」にある、 ”User data”に、textで(As text) 以下を入力
#cloud-config repo_upgrade: none
これで、AMIから起動したらPerlのバージョンが上がってた! ・・・というトラブルを回避。