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 のダッシュボードからログを確認してみましょう。

01

CloudWatch Logs の Cookbook が適用されていることが判ります。


ログを確認する

02

ちゃんとログは出力されていますね。


注意点

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

元記事は、こちら