[JAWS-UG CLI] IoT #4 デバイス証明書へのIoTポリシーのアタッチ

.. 1-3. デバイス証明書へのIoTポリシーのアタッチ


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


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         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


0.3. デバイス証明書のID指定
---------------------------

デバイス証明書のリストを確認し、利用するデバイス証明書のIDを変数に格納
します。

```bash:コマンド:
aws iot list-certificates 
```

```json:結果(例):
      {
        "certificates": [
          {
              "certificateArn": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxxxxert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
              "status": "ACTIVE",
              "creationDate": 1234567890.123,
              "certificateId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          }
        ]
      }
```

```bash:変数の設定(例):
IOT_CERT_ID='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```


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


1.1. デバイス証明書のARN取得
----------------------------

```bash:コマンド:
IOT_CERT_ARN=$( \
        aws iot describe-certificate \
          --certificate-id ${IOT_CERT_ID} \
          --query 'certificateDescription.certificateArn' \
          --output text \
) \
        && echo ${IOT_CERT_ARN}
```

```text:結果(例):
      arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```


1.2. IoTポリシー名の指定
------------------------

```bash:変数の設定:
IOT_POLICY_NAME='AWSIoTFullAccess'
```

```bash:コマンド:
aws iot list-principal-policies \
        --principal ${IOT_CERT_ARN}
```

```json:結果(例):
      {
        "policies": []
      }
```

```bash:コマンド:
aws iot list-policy-principals \
        --policy-name ${IOT_POLICY_NAME}
```

```json:結果(例):
      {
        "principals": []
      }
```


2. ポリシーのアタッチ
=====================

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

        IOT_POLICY_NAME: ${IOT_POLICY_NAME}
        IOT_CERT_ARN:    ${IOT_CERT_ARN}

ETX
```

```bash:コマンド:
aws iot attach-principal-policy \
        --policy-name ${IOT_POLICY_NAME} \
        --principal "${IOT_CERT_ARN}"
```

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


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

```bash:コマンド:
aws iot list-principal-policies \
        --principal ${IOT_CERT_ARN}
```

```json:結果(例):
      {
        "policies": [
          {
              "policyName": "AWSIoTFullAccess",
              "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:policy/AWSIoTFullAccess"
          }
        ]
      }
```

```bash:コマンド:
aws iot list-policy-principals \
        --policy-name ${IOT_POLICY_NAME}
```

```json:結果(例):
      {
        "principals": [
          "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        ]
      }
```


完了
====