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

# この記事について

[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

    ROLE_ARN: ${ROLE_ARN}
    BUCKET_NAME: ${BUCKET_NAME}

ETX
```


# 1. Delivery Streamの作成

## 1.1. 設定ファイルの作成

### Delivery Stream名の指定

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

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

```bash:コマンド
S3_DESTINATION_FILE_NAME="s3_destination_configuration.json"
```

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

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

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

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

### ロググループ名およびログストリーム名の指定

```bash:コマンド
LOG_GROUP_NAME="/aws/kinesisfirehose/${DELIVERY_STREAM_NAME}"
LOG_STREAM_NAME="S3Delivery"
```


### 変数を確認

```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_configuration.json
    ROLE_ARN: arn:aws:iam::XXXXXXXXXXXX:role/service-role-firehose
    BUCKET_NAME: firehose-jawsug-cli-s3bucket-134czh3hcofqz
    BUFFER_SIZE: 1
    BUFFER_INTERVAL: 60
    LOG_GROUP_NAME: /aws/kinesisfirehose/jawsug-cli-stream
    LOG_STREAM_NAME: S3Delivery

```

### 定義を生成

```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}
```

## 1.2. Delivery 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-************"
                }
            }
        ]
    }
}
```


以上