[JAWS-UG CLI] IoT #7 IoTトピックルールの作成 (S3)

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


IoTへの権限
-----------

AWS IoTに対してフル権限があること。


AWS CLI
-------

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

- AWS CLI 1.11.14

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

```text:結果(例):
      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71
```

バージョンが古い場合は最新版に更新しましょう。

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


0. 準備
=======


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

```bash:変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
```


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

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

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

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iotFull-handson-mbpr13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION
```


0.3. IAMロールの指定
--------------------

利用するIAMロールを決めます。

```bash:変数の設定:
IAM_ROLE_NAME='AWSIoTRole'
```

```bash:コマンド:
IAM_ROLE_ARN=$( \
        aws iam get-role \
          --role-name ${IAM_ROLE_NAME} \
          --query 'Role.Arn' \
          --output text \
      ) \
        && echo ${IAM_ROLE_ARN}
```

```text:結果(例):
      arn:aws:iam::XXXXXXXXXXXX:role/AWSIoTRole
```


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


1.1. Topic Role名の決定
-----------------------

英数字大文字とアンダースコアだけが利用できます。 (ハイフンは使えないの
で注意してください。)

```bash:変数の設定:
IOT_RULE_NAME="handson_rule_$( date '+%Y%m%d' )" \
        && echo ${IOT_RULE_NAME}
```

同名のトピックルールの不存在確認

```bash:コマンド:
aws iot get-topic-rule \
        --rule-name ${IOT_RULE_NAME}
```

```text:結果(例):
      An error occurred (UnauthorizedException) when calling the GetTopicRule operation: Access to topic rule 'handson_rule_20161117' was denied
```


1.2. S3バケット名の作成
-----------------------

```bash:変数の設定:
S3_BUCKET_NAME="handson-$( \
          aws sts get-caller-identity \
            --query 'Account' \
            --output text \
)" \
        && echo ${S3_BUCKET_NAME}
```

```text:結果(例):
      handson-20161117-XXXXXXXXXXXX
```

同名のバケットが存在しないことを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

```text:結果(例):
      An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist
```

バケットを作成します。

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

          S3_BUCKET_NAME:     ${S3_BUCKET_NAME}
          AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}

ETX
```

```bash:コマンド:
aws s3api create-bucket \
          --bucket ${S3_BUCKET_NAME} \
          --create-bucket-configuration "LocationConstraint=${AWS_DEFAULT_REGION}"
```

```json:結果(例):
      {
        "Location": "http://corp-handson-20160309.s3.amazonaws.com/"
      }
```

```bash:コマンド:
aws s3api get-bucket-location \
        --bucket ${S3_BUCKET_NAME}
```

```json:結果(例):
      {
        "LocationConstraint": "ap-northeast-1"
      }
```


1.x. トピックルールペイロードの作成
-----------------------------------

```bash:変数の設定:
FILE_INPUT="${IOT_RULE_NAME}.json" \
        && echo ${FILE_INPUT}
```

```bash:変数の設定:
IOT_RULE_DESC="Topic Rule for S3."
```

```bash:変数の設定:
IOT_RULE_S3_KEY='handson-${timestamp()}'
```

```bash:変数の設定:
IOT_RULE_ATTRIBUTE='*'
IOT_RULE_FILTER='#'
```

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

        FILE_INPUT: ${FILE_INPUT}
        IOT_RULE_ATTRIBUTE:    ${IOT_RULE_ATTRIBUTE}
        IOT_RULE_FILTER:       ${IOT_RULE_FILTER}
        IOT_RULE_DESC:         ${IOT_RULE_DESC}
        IAM_ROLE_ARN:          ${IAM_ROLE_ARN}
        S3_BUCKET_NAME:        ${S3_BUCKET_NAME}
        IOT_RULE_S3_KEY:       ${IOT_RULE_S3_KEY}
        IOT_RULE_NAME:         ${IOT_RULE_NAME}

EOF
```

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
{
          "sql": "SELECT ${IOT_RULE_ATTRIBUTE} FROM '${IOT_RULE_FILTER}'",
          "description": "${IOT_RULE_DESC}",
          "actions": [
              {
                  "s3": {
                      "roleArn": "${IAM_ROLE_ARN}",
                      "bucketName": "${S3_BUCKET_NAME}",
                      "key": "${IOT_RULE_S3_KEY}"
                  }
              }
          ],
          "ruleDisabled": false,
          "awsIotSqlVersion": "2016-03-23"
}
EOF

cat ${FILE_INPUT}
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

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

エラーが出力されなければOKです。


2. トピックルールの作成
=======================

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

        IOT_RULE_NAME: ${IOT_RULE_NAME}
        FILE_INPUT:    ${FILE_INPUT}

ETX
```

```bash:コマンド:
aws iot create-topic-rule \
        --rule-name ${IOT_RULE_NAME} \
        --topic-rule-payload file://${FILE_INPUT}
```

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


3. 事後作業
===========

```bash:コマンド:
aws iot get-topic-rule \
        --rule-name ${IOT_RULE_NAME}
```


```json:結果(例):
      {
        "ruleArn": "arn:aws:iot:us-west-2:580535187998:rule/tmpToS3sample",
        "rule": {
          "description": "20161117-handson-sample",
          "ruleName": "tmpToS3sample",
          "actions": [
              {
                  "s3": {
                      "roleArn": "arn:aws:iam::580535187998:role/AWSIoTRole",
                      "bucketName": "handson-rule-20161117-580535187998",
                      "key": "handson-${timestamp()}"
                  }
              }
          ],
          "sql": "SELECT * FROM '#'",
          "awsIotSqlVersion": "2016-03-23",
          "ruleDisabled": false
        }
      }
```


完了
====