[JAWS-UG CLI] Amazon Kinesis Firehose 入門 (5) Kinesis Agentによるレコードの登録

# この記事について

[JAWS-UG CLI専門支部 #73 Kinesis Firehose入門](https://jawsug-cli.doorkeeper.jp/events/41915)で実施するハンズオン用の手順書です。


# 前提条件

## 必要な権限

作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。

- Kinesis Firehoseのフルコントロール権限
- S3のフルコントロール権限
- STSの関するフルコントロール権限
- IAMの関するフルコントロール権限
- CloudWatchの関するフルコントロール権限
- CloudWatch Logsの関するフルコントロール権限

# 0. 準備

## 0.1. リージョンを指定

オレゴンリージョンで実施します。（東京マダー？）

```bash:コマンド
export AWS_DEFAULT_REGION="us-west-2"
```

## 0.2. 資格情報を確認


```bash:コマンド
aws configure list
```

インスタンスプロファイルを設定したEC2インスタンスでアクセスキーを設定せずに実行した場合、以下のようになります。

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************QSAA         iam-role
secret_key     ****************c1xY         iam-role
    region                us-west-2              env    AWS_DEFAULT_REGION
```

## 0.3. バージョン確認

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

```text:結果
aws-cli/1.11.24 Python/2.7.12 Linux/4.4.30-32.54.amzn1.x86_64 botocore/1.4.81
```

## 0.4. バージョンアップ（必要に応じて）

```bash:コマンド
sudo pip install -U awscli
```

# 1. ログイン

## SSHで接続

初回接続時、yesを選択

```bash:コマンド
ssh -l ec2-user -i ~/.ssh/${KEY_MATERIAL_FILE} ${PUBLIC_IP_ADDRESS}
```

## json lintのインストール

### npmのインストール

```bash:コマンド
sudo yum install npm --enablerepo=epel -y
```

### json lintのインストール

```bash:コマンド
sudo npm install -g jsonlint
```

# 2. インストール

Kinesis Agentをインストールします。

## インストール

```bash:コマンド
sudo yum install -y aws-kinesis-agent
```

## サービスの起動

```bash:コマンド
sudo service aws-kinesis-agent start
```

```text:結果
aws-kinesis-agent startup                                  [  OK  ]
```

# 3. Apache Web Serverのインストール

Webサーバを構築する（apacheを想定　→　ログの形式をサポートしているもの）

## インストール

```bash:コマンド
sudo yum install -y httpd
```

## サービスの起動

```bash:コマンド
sudo service httpd start
```

```text:結果
Starting httpd: httpd: apr_sockaddr_info_get() failed for ip-10-0-0-190
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
```

## 動作確認

ブラウザから、Webサーバにアクセスできることを確認します。

```bash:コマンド
PUBLIC_IP_ADDRESS=$(curl http://169.254.169.254/latest/meta-data/public-ipv4) \
    && echo ${PUBLIC_IP_ADDRESS}
```

```text:結果
**.**.**.**
```


# 4. 設定

## 設定ファイルの生成

### 設定ファイル名の指定

```bash:コマンド
AGENT_SETTING_FILE_NAME="agent.json"
```

### デリバリーストリーム名の指定

```bash:コマンド
DELIVERY_STREAM_NAME="jawsug-cli-stream"
```

### 変数の確認

```bash:コマンド
cat << ETX

   AGENT_SETTING_FILE_NAME: ${AGENT_SETTING_FILE_NAME}
   DELIVERY_STREAM_NAME: ${DELIVERY_STREAM_NAME}

ETX
```

```text:結果

   AGENT_SETTING_FILE_NAME: agent.json
   DELIVERY_STREAM_NAME: jawsug-cli-stream

```

### 設定ファイルの生成

```bash:コマンド
cat << EOF > ${AGENT_SETTING_FILE_NAME}
{
  "cloudwatch.emitMetrics": true,
  "cloudwatch.endpoint": "https://monitoring.us-west-2.amazonaws.com",
  "firehose.endpoint": "https://firehose.us-west-2.amazonaws.com",
  "flows": [
    {
      "filePattern": "/var/log/httpd/access_log",
      "deliveryStream": "${DELIVERY_STREAM_NAME}",
      "initialPosition": "START_OF_FILE"
    }
  ]
}
EOF

cat ${AGENT_SETTING_FILE_NAME}
```

### JSONファイルの検証

```bash:コマンド
jsonlint -q ${AGENT_SETTING_FILE_NAME}
```

## 設定ファイルの配置

### 既存ファイルの退避

```bash:コマンド
sudo cp /etc/aws-kinesis/agent.json /etc/aws-kinesis/agent.json.org
```

### 生成したファイルの配置

```bash:コマンド
sudo cp agent.json /etc/aws-kinesis/agent.json
```

### 権限の付与

Kinesis-Agentの実行ユーザである「aws-kinesis-agent-user」に対して、
データソースの読み取りおよび実行権限が必要です。

[Writing to Amazon Kinesis Firehose Using Amazon Kinesis Agent](http://docs.aws.amazon.com/firehose/latest/dev/writing-with-agents.html#agent-config-settings)

```bash:コマンド
sudo chmod 755 /var/log/httpd/*
sudo chmod 755 /var/log/httpd
```

### サービスの再起動

```bash:コマンド
sudo service aws-kinesis-agent restart
```

### ログオフ

```bash:コマンド
exit
```

# 5. 動作確認

## Web Serverにアクセス

てきとうにアクセスしてみてください。

そして、1分ほど待ちます。。。


## S3 Bucket上のファイルを確認

```bash:コマンド
aws s3 ls --recursive ${BUCKET_NAME}
```

## S3 Bucket上のファイルをダウンロード

```bash:コマンド
mkdir data03
cd data03
```

```bash:コマンド
aws s3 sync s3://${BUCKET_NAME} .
```
```text:結果
download: s3://jawsug-cli-firehose-************/2016/12/19/07/jawsug-cli-stream-1-2016-12-19-07-54-56-47a385b8-4075-44ec-bf15-4f6143b03ddb to 2016/12/19/07/jawsug-cli-stream-1-2016-12-19-07-54-56-47a385b8-4075-44ec-bf15-4f6143b03ddb
```

## S3 Bucket上のファイルを閲覧

```bash:コマンド
cat (任意のファイル名)
```

```text:結果
222.150.28.224 - - [03/Dec/2016:08:05:20 +0000] "GET / HTTP/1.1" 403 3839 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
222.150.28.224 - - [03/Dec/2016:08:05:21 +0000] "GET / HTTP/1.1" 403 3839 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
```

### ファイルの削除

```bash:コマンド
aws s3 rm --recursive s3://${BUCKET_NAME}/
```

```text:結果
（省略）
```

```bash:コマンド
cd ..
rm -r data03
```



以上