cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平(@inokara)です。
はじめに
こちらを真似て OpsWorks でやってみました。ただ真似るのは嫌だしスクリーンショットを撮るのがダル辛かったので AWS CLI で実行してみました。
おさらい
CloudWatch Logs
- 最近リリースされた
- インスタンスにエージェントをインストールすることで指定したログを CloudWatch に送りつけてくれる
- 送りつけられたログにフィルタを通して監視を行うことが出来る
OpsWorks
- Stack / Layer / App という三つのレイヤーを以ってインスタンスのセットアップからアプリケーションのデプロイ、リソースの調整までも行ってくれるアプリケーション管理サービス
- 内部的には Chef-solo を利用している
- 実際には opsworks-agent が cookbook を取得したり chef-solo を実行したりしている
尚、OpsWorks については下記のスライドがとても解りやすかったです!
有難うございます!
やってみよー
やること
ここの Cookbook を利用してインスタンスに CloudWatch Logs Agent をインストール、そして /var/log/aws/opsworks/opsworks-agent.log をモニタリング設定までを OpsWorks と AWS CLI で行います。
スタックを作成する
aws opsworks create-stack --name "CloudWatch-Logs" \ --stack-region "us-east-1" \ --default-ssh-key-name "your_key_name" \ --service-role-arn arn:aws:iam::123456789012:role/aws-opsworks-service-role \ --default-instance-profile-arn arn:aws:iam::123456789012:instance-profile/aws-opsworks-ec2-role \ --use-custom-cookbooks \ --custom-cookbooks-source Type=archive,Url=https://s3.amazonaws.com/aws-cloudwatch/downloads/CloudWatchLogs-Cookbooks.zip
出力される Stack ID を控えておきましょう。
{
"StackId": "12345677-1234-1234-1234-123456789012"
}
レイヤーを作成する
カスタムレシピを定義する為に JSON ファイルを用意する
cat << EOT > custom.json
{
"Setup": ["logs::config", "logs::install"]
}
EOT
レイヤーを作成する
aws opsworks create-layer --region us-east-1
--stack-id 12345677-1234-1234-1234-123456789012
--type custom
--name cloudwatch-logs
--shortname cloudwatch-logs
--custom-recipes file://custom.json
出力される Layer ID を控えておきましょう。
{
"LayerId": "abcdefgh-abcd-abcd-abcd-abcdefghijkl"
}
インスタンスを作成する
aws opsworks create-instance --region us-east-1
--stack-id 12345677-1234-1234-1234-123456789012
--layer-ids abcdefgh-abcd-abcd-abcd-abcdefghijkl
--hostname myinstance1
--instance-type t2.micro
--os "Amazon Linux"
--root-device-type "ebs"
出力される Instance ID を控えておきましょう。
{
"InstanceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
インスタンスを起動する
aws opsworks start-instance --instance-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
しばし待ちましょう。以下のようにインスタンスの起動状況が判ります。
aws opsworks describe-instances --instance-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
--query "Instances[].Status"
--output text
上記のコマンドの実行結果が online になったらインスタンスが起動しています。OpsWorks のダッシュボードからログを確認してみましょう。
CloudWatch Logs の Cookbook が適用されていることが判ります。
ログを確認する
ちゃんとログは出力されていますね。
注意点
Log Group 名にスペース入れるとエラーになります
今回利用した Cookbook は 以下のように OpsWorks のスタック名が CloudWatch Logs の Log Group に定義されるようになっています。
log_group_name = <%= node[:opsworks][:stack][:name] %>
OpsWorks のスタック名は半角スペースが入っている名前(例:My Stack)を定義出来ますが CloudWatch Logs の Log Group 名には半角スペース入りの名前(例:My Stack)を設定すると CloudWatch Logs は以下のようなエラーを出力して監視対象のログを push しなくなります。
2014-07-11 20:05:43,406 - cwlogs.push - WARNING - Thread-4 - Fall back to current time: {'source_id': '6c516d52ff96650ecd6ba88c09bb32b9', 'timestamp': 1405109143406, 'start_position': 0L, 'end_position': 66L}, reason: timestamp could not be parsed from message.
2014-07-11 20:05:48,438 - cwlogs.push - WARNING - Thread-3 - Method "_get_sequence_token_and_setup_resources" failed, backing off 1.08071991746 seconds, and retrying
2014-07-11 20:05:49,543 - cwlogs.push - WARNING - Thread-3 - Method "_get_sequence_token_and_setup_resources" failed, backing off 2.66783613839 seconds, and retrying
2014-07-11 20:05:52,244 - cwlogs.push - WARNING - Thread-3 - Method "_get_sequence_token_and_setup_resources" failed, backing off 4.61538138529 seconds, and retrying
2014-07-11 20:05:56,885 - cwlogs.push - WARNING - Thread-3 - Method "_get_sequence_token_and_setup_resources" failed, backing off 5.58911040151 seconds, and retrying
2014-07-11 20:06:02,500 - cwlogs.push - WARNING - Thread-3 - Method "_get_sequence_token_and_setup_resources" has failed for the last time.
2014-07-11 20:06:02,500 - cwlogs.threads - ERROR - Thread-3 - Exception caught in
Traceback (most recent call last):
File "/var/awslogs/lib/python2.6/site-packages/cwlogs/threads.py", line 58, in run
self._run()
File "/var/awslogs/lib/python2.6/site-packages/cwlogs/push.py", line 787, in _run
add_status = self._add_event(event)
File "/var/awslogs/lib/python2.6/site-packages/cwlogs/push.py", line 814, in _add_event
self.stop_flag)
File "/var/awslogs/lib/python2.6/site-packages/cwlogs/push.py", line 1138, in __init__
self._get_sequence_token_and_setup_resources
File "/var/awslogs/lib/python2.6/site-packages/cwlogs/retry.py", line 116, in wrapper
'attempts.' % (f.__name__, retry))
RuntimeError: Method "_get_sequence_token_and_setup_resources" has failed after 5 unsuccessful attempts.
ご注意下さい。
最後に
ひとこと
今まで試す機会があまりなかった OpsWorks を使って簡単に CloudWatch Logs の設定が出来ました!
後片付け
インスタンス止めて、削除して layer 消して stack を消すという流れです。
aws opsworks stop-instance --instance-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
aws opsworks delete-instance --instance-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
aws opsworks delete-layer --layer-id abcdefgh-abcd-abcd-abcd-abcdefghijkl
aws opsworks delete-stack --stack-id 12345677-1234-1234-1234-123456789012
元記事は、こちら