[JAWS-UG CLI] Amazon Kinesis Firehose re:入門 (3) レコードの登録

# この記事について

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


# 前提条件

## 必要な権限

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

- 以下のサービスに対するフルコントロール権限
    - Kinesis Firehose
    - IAM
    - EC2
    - S3
    - CloudWatch Logs
    - STS
    - (Lambda)
        - データの変換を行う場合
    - (KMS)
        - データの暗号化を行う場合


# 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.129 Python/2.7.12 Linux/4.9.38-16.33.amzn1.x86_64 botocore/1.5.92
```

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

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

## 0.5. 変数の確認

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

    DELIVERY_STREAM_NAME: ${DELIVERY_STREAM_NAME}
    BUCKET_NAME: ${BUCKET_NAME}

ETX
```



# 1. 単一レコードの登録

## 1.1. データの生成

### ファイル名の指定

```bash:コマンド
SINGLE_RECORD_FILE_NAME="record.json"
```

### ファイルの生成

```bash:コマンド
cat << EOF > ${SINGLE_RECORD_FILE_NAME}
{
  "Data": "blob\n"
}
EOF

cat ${SINGLE_RECORD_FILE_NAME}
```

### ファイルの検証

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

## 1.2. データの登録

### 変数の確認

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

    DELIVERY_STREAM_NAME: ${DELIVERY_STREAM_NAME}
    SINGLE_RECORD_FILE_NAME: ${SINGLE_RECORD_FILE_NAME}

ETX
```

```text:結果

    DELIVERY_STREAM_NAME: jawsug-cli-stream
    SINGLE_RECORD_FILE_NAME: record.json

```

### データの登録

```bash:コマンド
aws firehose put-record \
    --delivery-stream-name ${DELIVERY_STREAM_NAME} \
    --record file://${SINGLE_RECORD_FILE_NAME}
```

```json:結果
{
    "RecordId": "********************************************************************************************************************************************************************************************************************************"
}
```

## 1.3. データの確認

### ファイルの確認

1分（BUFFER＿INTERVALで指定した時間）待ちましょう。

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

```text:結果
2016-11-05 07:21:54          4 2016/11/05/07/jawsug-cli-stream-1-2016-11-05-07-21-53-60e3ea4c-5e75-4fbd-8ce2-11406f55a930
```

### ファイルのダウンロード

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

```bash:コマンド
aws s3 sync s3://${BUCKET_NAME} .
```

```text:結果
download: s3://jawsug-cli-firehose-************/2016/11/23/11/jawsug-cli-stream-1-2016-11-23-11-18-58-947ea60d-041c-4750-ab31-cff260b7cf58 to 2016/11/23/11/jawsug-cli-stream-1-2016-11-23-11-18-58-947ea60d-041c-4750-ab31-cff260b7cf58
```

### ファイルの確認

```bash:コマンド
cat （ダウンロードしたファイルのパス）
```

```text:結果
blob
```

## 1.4.  ファイルの削除

### ファイルの削除

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

```text:結果
delete: s3://jawsug-cli-firehose-************/2016/11/05/07/jawsug-cli-stream-1-2016-11-05-07-21-53-60e3ea4c-5e75-4fbd-8ce2-11406f55a930
```

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


# 2. 複数レコードの一括登録

## 2.1. データの生成

### ファイル名の指定

```bash:コマンド
MULTI_RECORDS_FILE_NAME="records.json"
```

### ファイルの生成

```bash:コマンド
cat << EOF > ${MULTI_RECORDS_FILE_NAME}
[
  {
    "Data": "blob1\n"
  },
  {
    "Data": "blob2\n"
  },
  {
    "Data": "blob3\n"
  },
  {
    "Data": "blob4\n"
  }
]
EOF

cat ${MULTI_RECORDS_FILE_NAME}
```

### ファイルの検証

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

## 2.2. データの登録

```bash:コマンド
aws firehose put-record-batch \
    --delivery-stream-name ${DELIVERY_STREAM_NAME} \
    --records file://${MULTI_RECORDS_FILE_NAME}
```

```json:結果
{
    "FailedPutCount": 0,
    "RequestResponses": [
        {
            "RecordId": "********************************************************************************************************************************************************************************************************************************"
        },
        {
            "RecordId": "********************************************************************************************************************************************************************************************************************************"
        },
        {
            "RecordId": "********************************************************************************************************************************************************************************************************************************"
        },
        {
            "RecordId": "********************************************************************************************************************************************************************************************************************************"
        }
    ]
}
```

## 2.3. データの確認

### ファイルの確認

1分（BUFFER＿INTERVALで指定した時間）待ちましょう。

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

```text:結果
2016-11-23 11:33:36         24 2016/11/23/11/jawsug-cli-stream-1-2016-11-23-11-33-35-e3f2b6dd-7923-4f54-aeff-301ddc998006
```

### ファイルのダウンロード

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

```bash:コマンド
aws s3 sync s3://${BUCKET_NAME} .
```

```text:結果
download: s3://jawsug-cli-firehose-************/2016/11/23/11/jawsug-cli-stream-1-2016-11-23-11-18-58-947ea60d-041c-4750-ab31-cff260b7cf58 to 2016/11/23/11/jawsug-cli-stream-1-2016-11-23-11-18-58-947ea60d-041c-4750-ab31-cff260b7cf58
```

### ファイルの確認

```bash:コマンド
cat （ダウンロードしたファイルのパス）
```

```text:結果
blob1
blob2
blob3
blob4
```

## 2.4. ファイルの削除

### ファイルの削除

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

```text:結果
delete: s3://jawsug-cli-firehose-************/2016/11/23/11/jawsug-cli-stream-1-2016-11-23-11-33-35-e3f2b6dd-7923-4f54-aeff-301ddc998006
```

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


以上