[JAWS-UG CLI] Amazon Kinesis Firehose 入門 (2) Delivery Streamの作成

# この記事について

[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. Delivery Streamの作成

## Destination(S3)を定義

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

```bash:コマンド
S3_DESTINATION_FILE_NAME="s3-destination.json"
```

### バッファサイズの指定

```bash:コマンド
BUFFER_SIZE=1
```

### バッファインターバルの指定

```bash:コマンド
BUFFER_INTERVAL=60
```

### 変数を確認

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

    S3_DESTINATION_FILE_NAME: ${S3_DESTINATION_FILE_NAME}
    ROLE_ARN: ${ROLE_ARN}
    BUCKET_NAME: ${BUCKET_NAME}
    BUFFER_SIZE: ${BUFFER_SIZE}
    BUFFER_INTERVAL: ${BUFFER_INTERVAL}
    LOG_GROUP_NAME: ${LOG_GROUP_NAME}
    LOG_STREAM_NAME: ${LOG_STREAM_NAME}

ETX
```

```text:結果

    S3_DESTINATION_FILE_NAME: s3-destination.json
    ROLE_ARN: arn:aws:iam::************:role/service-role-firehose
    BUCKET_NAME: jawsug-cli-firehose-************
    BUFFER_SIZE: 1
    BUFFER_INTERVAL: 60
    LOG_GROUP_NAME: jawsug-cli-firehose
    LOG_STREAM_NAME: handson

```

### 定義を生成

```bash:コマンド
cat << EOF > ${S3_DESTINATION_FILE_NAME}
{
  "RoleARN": "${ROLE_ARN}",
  "BucketARN": "arn:aws:s3:::${BUCKET_NAME}",
  "Prefix": "",
  "BufferingHints": {
    "SizeInMBs": ${BUFFER_SIZE},
    "IntervalInSeconds": ${BUFFER_INTERVAL}
  },
  "CompressionFormat": "UNCOMPRESSED",
  "EncryptionConfiguration": {
    "NoEncryptionConfig": "NoEncryption"
  },
  "CloudWatchLoggingOptions": {
    "Enabled": true,
    "LogGroupName": "${LOG_GROUP_NAME}",
    "LogStreamName": "${LOG_STREAM_NAME}"
  }
}
EOF

cat ${S3_DESTINATION_FILE_NAME}
```

```json:結果
{
  "RoleARN": "arn:aws:iam::************:role/service-role-firehose",
  "BucketARN": "arn:aws:s3:::jawsug-cli-firehose-************",
  "Prefix": "",
  "BufferingHints": {
    "SizeInMBs": ,
    "IntervalInSeconds":
  },
  "CompressionFormat": "UNCOMPRESSED",
  "EncryptionConfiguration": {
    "NoEncryptionConfig": "NoEncryption"
  },
  "CloudWatchLoggingOptions": {
    "Enabled": true,
    "LogGroupName": "jawsug-cli-firehose",
    "LogStreamName": "handson"
  }
}
```

### JSONファイルを検証

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

## Delivery Streamの作成

### Delivery Stream名の指定

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

### パラメータの確認


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

   DELIVERY_STREAM_NAME: "${DELIVERY_STREAM_NAME}"
   S3_DESTINATION_FILE_NAME: "${S3_DESTINATION_FILE_NAME}"

ETX
```

```text:結果

   DELIVERY_STREAM_NAME: "jawsug-cli-stream"
   S3_DESTINATION_FILE_NAME: "s3-destination.json"

```

### Delivery Streamの作成

```bash:コマンド
aws firehose create-delivery-stream \
    --delivery-stream-name ${DELIVERY_STREAM_NAME} \
    --s3-destination-configuration file://${S3_DESTINATION_FILE_NAME}
```

```json:結果
{
    "DeliveryStreamARN": "arn:aws:firehose:us-west-2:************:deliverystream/jawsug-cli-stream"
}
```


### Delivery Streamの確認

デリバリーストリームのステータスがACTIVEになってから次の手順を実行してくだい。

```bash:コマンド
aws firehose describe-delivery-stream \
    --delivery-stream-name ${DELIVERY_STREAM_NAME}
```

```json:結果
{
    "DeliveryStreamDescription": {
        "HasMoreDestinations": false,
        "VersionId": "1",
        "CreateTimestamp": 1478329794.659,
        "DeliveryStreamARN": "arn:aws:firehose:us-west-2:************:deliverystream/jawsug-cli-stream",
        "DeliveryStreamStatus": "ACTIVE",
        "DeliveryStreamName": "jawsug-cli-stream",
        "Destinations": [
            {
                "DestinationId": "destinationId-000000000001",
                "S3DestinationDescription": {
                    "RoleARN": "arn:aws:iam::************:role/service-role-firehose",
                    "Prefix": "",
                    "BufferingHints": {
                        "IntervalInSeconds": 60,
                        "SizeInMBs": 1
                    },
                    "EncryptionConfiguration": {
                        "NoEncryptionConfig": "NoEncryption"
                    },
                    "CompressionFormat": "UNCOMPRESSED",
                    "CloudWatchLoggingOptions": {
                        "Enabled": true,
                        "LogStreamName": "handson",
                        "LogGroupName": "jawsug-cli-firehose"
                    },
                    "BucketARN": "arn:aws:s3:::jawsug-cli-firehose-************"
                }
            }
        ]
    }
}
```