[JAWS-UG CLI] CloudWatch Logs:#2 ログストリームの作成

AWS CLIを利用して、CloudWatch Logsのログストリームを作成してみます。


前提条件
========


CloudWatchLogsへの権限
----------------------

* CloudWatch Logsに対してフル権限があること。


AWS CLIのバージョン
-------------------

* 以下のバージョンで動作確認済

  * AWS CLI 1.7.24

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.7.24 Python/2.7.5 Darwin/13.4.0
```


0. 準備
=======


0.1. リージョンの指定
---------------------

ログストリームを作成するロググループのリージョンを指定します。

(カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:コマンド(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルとリージョンが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile cloudwatchFull-prjZ-mbp13             env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


0.3. ロググループの指定
-----------------------

ログストリームを作成するロググループを指定します。

```bash:コマンド:
LOG_GROUP_NAME='<ロググループ名>'
```


0.4. ロググループの内容確認
---------------------------

ログストリームを作成するロググループの内容を確認します。

```bash:コマンド:
aws logs describe-log-groups \
        --log-group-name-prefix ${LOG_GROUP_NAME}
```

```json:結果(例):
      {
        "logGroups": [
          {
              "storedBytes": 0,
              "metricFilterCount": 0,
              "creationTime": 1430092395471,
              "logGroupName": "test/sample",
              "retentionInDays": 3653,
              "arn": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:test/sample:*"
          }
        ]
      }
```


1. 事前作業
===========


1.1. ログストリーム名の決定
---------------------------

作成するログストリーム名を決めます。

```bash:コマンド:
LOG_STREAM_NAME='test-stream'
```


1.2. 同名のログストリームの不存在確認
-------------------------------------

作成するログストリーム名と同じ名前のログストリームが存在しないことを確認します。

```bash:コマンド:
aws logs describe-log-streams \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name-prefix ${LOG_STREAM_NAME}
```

```json:結果(例):
      {
          "logStreams": []
      }
```


2. ログストリームの作成
=======================


2.1. ログストリームの作成
-------------------------

ログストリームを作成します。

```bash:変数の確認:
cat << ETX

        LOG_GROUP_NAME:  ${LOG_GROUP_NAME}
        LOG_STREAM_NAME: ${LOG_STREAM_NAME}

ETX
```

```bash:コマンド:
aws logs create-log-stream \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name ${LOG_STREAM_NAME}
```

```text:結果:
      (戻り値なし)
```


2.2. ログストリームの確認
-------------------------

作成したログストリームを確認します。

```bash:コマンド:
aws logs describe-log-streams \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name-prefix ${LOG_STREAM_NAME}
```

```json:結果(例):
      {
        "logStreams": [
          {
              "creationTime": 1430093344032,
              "arn": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:test/sample:log-stream:test-stream",
              "logStreamName": "test-stream",
              "storedBytes": 0
          }
        ]
      }
```


3. 最初のログイベント
=====================


3.1. ログイベントの取得
-----------------------

ログストリームにまだログイベントが存在しないことを確認します。


```bash:コマンド:
aws logs get-log-events \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name ${LOG_STREAM_NAME}
```

```json:結果(例):
      {
          "nextForwardToken": "f/31892233890440743395043453640721869952627421282803122176", 
          "events": [], 
          "nextBackwardToken": "b/31892233890440743395043453640721869952627421282803122176"
      }
```


3.2. 最初のログイベントの作成
-----------------------------

ログイベントを作成します。

```bash:コマンド:
TIME_EPOCH="`date +%s`000"
LOG_MSG='Error: event sample 1.'
LOG_EVENTS="timestamp=${TIME_EPOCH},message=\"${LOG_MSG}\""
```

```bash:変数の確認:
cat << ETX

        LOG_GROUP_NAME:   ${LOG_GROUP_NAME}
        LOG_STREAM_NAME:  ${LOG_STREAM_NAME}
        LOG_EVENTS:      "${LOG_EVENTS}"

ETX
```

```bash:コマンド:
aws logs put-log-events \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name ${LOG_STREAM_NAME} \
        --log-events "${LOG_EVENTS}"
```

```json:結果(例):
      {
          "nextSequenceToken": "49545657805657863444697949850872230860455870730858398226"
      }
```


3.3. 最初のログイベントの取得
-----------------------------

作成したログイベントを確認します。

```bash:コマンド:
aws logs get-log-events \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name ${LOG_STREAM_NAME}
```

```json:結果(例):
      {
        "nextForwardToken": "f/31892236143128218881144701261737206596066088858448691200",
        "events": [
          {
              "ingestionTime": 1430097342513,
              "timestamp": 1430097329000,
              "message": "Error: event sample 1."
          }
        ],
        "nextBackwardToken": "b/31892236143128218881144701261737206596066088858448691200"
      }
```


4. ログイベントの作成 (2回目以降)
=================================


4.1. ログイベントの作成 (2回目以降)
-----------------------------------

2つ目のログイベントを作成します。

最初の時以外は、TOKENが必要になります。

```bash:コマンド:
LOG_PUT_TOKEN=`aws logs describe-log-streams --log-group-name ${LOG_GROUP_NAME} --log-stream-name-prefix ${LOG_STREAM_NAME} --query 'logStreams[].uploadSequenceToken' --output text` \
        && echo ${LOG_PUT_TOKEN}
```

```text:結果(例):
      49545657805836269406286217709901357107175578637378257042
```

```bash:コマンド:
TIME_EPOCH="`date +%s`000"
LOG_MSG='Error: event sample 2.'
LOG_EVENTS="timestamp=${TIME_EPOCH},message=\"${LOG_MSG}\""
```

```bash:変数の確認:
cat << ETX

        LOG_GROUP_NAME:   ${LOG_GROUP_NAME}
        LOG_STREAM_NAME:  ${LOG_STREAM_NAME}
        LOG_EVENTS:      "${LOG_EVENTS}"
        LOG_PUT_TOKEN:    ${LOG_PUT_TOKEN}

ETX
```

```bash:コマンド:
aws logs put-log-events \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name ${LOG_STREAM_NAME} \
        --log-events "${LOG_EVENTS}" \
        --sequence-token ${LOG_PUT_TOKEN}
```

```json:結果(例):
      {
        "nextSequenceToken": "49545657805836269406286217727077775152260327876857954450"
      }
```


4.2. ログイベントの取得
-----------------------

作成したログイベントを確認します。

ここでは、最新の1イベントを取得します。

```bash:コマンド:
MAX_ITEMS='1'
```

```bash:コマンド:
aws logs get-log-events \
        --log-group-name ${LOG_GROUP_NAME} \
        --log-stream-name ${LOG_STREAM_NAME} \
        --limit ${MAX_ITEMS}
```

```json:結果(例):
      {
        "nextForwardToken": "f/31892197652042006217289156974186602967837732609731723264",
        "events": [
          {
              "ingestionTime": 1430095690715,
              "timestamp": 1430095603000,
              "message": "Error: event sample 2."
          }
        ],
        "nextBackwardToken": "b/31892197652042006217289156974186602967837732609731723264"
      }
```


完了
====

ログストリームを作成したら、次はメトリックフィルタを作成してみます。
http://qiita.com/tcsh/items/70b4f9457085e285a7a3