Демонстрация AWS IoT с CDK и Amplify

Архитектура

  • Демо

    • демо react web здесь нет реального времени, потому что нам нужно публиковать данные из test/test_pub.py
    • демонстрация видео
    • GitHub здесь
  • CDK

    • Создайте IoT-вещь, прикрепите политику к сертификату X509, затем прикрепите сертификат к IoT-вещи.
    • Создайте правила IoT для доставки данных в Kinesis Firehose, DB
    • Создайте функцию Lambda для запроса из БД
  • Amplify

    • Cognito и PubSub для подписки на темы IoT
    • Прикрепите политику AWS IoT к идентификатору Cognito.
    • Предварительно созданный пользовательский интерфейс аутентификации (useAuthenticator)
  • CharJs

    • Построение и обновление двух простых диаграмм
    • Диаграмма 1. Продолжаем получать данные из БД через API
    • Диаграмма 2. Подписка на тему IoT
    • Amplify для размещения приложения react
  • IoT-устройство и сертификат

    • Прикрепите сертификат X509 к физическому устройству IoT
    • Прикрепите политику AWS IoT к сертификату X509, чтобы разрешить чтение/запись тем AWS IoT
  • Правила для тем AWS IoT

    • Прикрепите роль к правилу, чтобы разрешить запись правил AWS IoT в S3, Firehose, DyanmoDB.

Проверьте конечную точку службы AWS IoT

aws iot describe-endpoint --region ap-southeast-1
Вход в полноэкранный режим Выход из полноэкранного режима

Скачайте сертификат центра сертификации AWS

  • Загрузите один из сертификатов CA, необходимых для настройки клиента mqtt. ссылка 1 и ссылка 2.
    https://www.amazontrust.com/repository/AmazonRootCA1.pem 
    https://www.amazontrust.com/repository/AmazonRootCA2.pem 
    https://www.amazontrust.com/repository/AmazonRootCA3.pem 
    https://www.amazontrust.com/repository/AmazonRootCA4.pem 
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Альтернативный способ — создать сертификат CA ссылка 3
openssl genrsa -out root_CA_key_filename.key 2048
Войти в полноэкранный режим Выход из полноэкранного режима
openssl req -x509 -new -nodes 
    -key root_CA_key_filename.key 
    -sha256 -days 1024 
    -out root_CA_cert_filename.pem
Войти в полноэкранный режим Выйти из полноэкранного режима

Создание ключа и сертификата

  • Мне нужно создать ключ и сертификаты из CLI или консоли AWS. Чтобы создать их из CDK, следуйте этой ссылке пользовательского ресурса 4
aws iot create-keys-and-certificate 
--set-as-active 
--certificate-pem-outfile esp-certificate.crt 
--public-key-outfile esp-public.key 
--private-key-outfile esp-private.key 
--region ap-southeast-1
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Не принимать CERTIFICATE_ARN

  • Повторно загрузите сертификат, учитывая его ID
    настроить вывод aws cli в виде текста

aws iot describe-certificate --certificate-id 
Войти в полноэкранный режим Выйти из полноэкранного режима

IoT-вещь, сертификат X509 и политика

Чтобы IoT-вещь могла записывать данные в ядро AWS IoT, нам необходимо прикрепить сертификат X509 к физическому IoT-устройству. Нам также необходимо прикрепить политику к сертификату X509 в AWS, чтобы указать действия ALLOW.

  • Создайте политику для сертификата X509
const policy = new aws_iot.CfnPolicy(
      this,
      'PolicyForDemoDevice',
      {
        policyName: 'PolicyForDemoDevice',
        policyDocument: new aws_iam.PolicyDocument(
          {
            statements: [
              new aws_iam.PolicyStatement(
                {
                  actions: ['iot:*'],
                  resources: ['*'],
                  effect: aws_iam.Effect.ALLOW
                }
              )
            ]
          }
        )
      }
    )
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Прикрепить политику к сертификату X509
const attachPolicy = new aws_iot.CfnPolicyPrincipalAttachment(
      this,
      'AttachPolicyForDemoDevice',
      {
        policyName: policy.policyName!.toString(),
        principal: props.certificateArn
      }
    )

    attachPolicy.addDependsOn(
      policy
    )
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Прикрепить сертификат X509 к устройству IoT
const attachCert = new aws_iot.CfnThingPrincipalAttachment(
      this,
      'AttachCertificiateToThing',
      {
        thingName: thing.thingName!.toString(),
        principal: props.certificateArn
      }
    )

    attachCert.addDependsOn(
      thing
    )
Войти в полноэкранный режим Выйти из полноэкранного режима

Правила IoT и роли

Чтобы правила IoT могли передавать данные в другие сервисы, такие как S3, DynamoDB, Firehose, нам нужно прикрепить роль к каждому правилу.

  • Создайте роль
 const role = new aws_iam.Role(
      this,
      'RoleForIoTCoreToAccessS3',
      {
        roleName: 'RoleForIoTCoreToAccessS3',
        assumedBy: new aws_iam.ServicePrincipal('iot.amazonaws.com')
      }
    )
Войдите в полноэкранный режим Выйти из полноэкранного режима
  • Прикрепите к роли встроенные политики
 role.attachInlinePolicy(
      new aws_iam.Policy(
        this,
        'PolicyForIoTcoreToAccessS3',
        {
          policyName: 'PolicyForIoTcoreToAccessS3',
          statements: [
            new aws_iam.PolicyStatement(
              {
                actions: ['s3:*'],
                resources: ['arn:aws:s3:::bucketName/*']
              }
            ),
            new aws_iam.PolicyStatement(
              {
                actions: ['firehose:*'],
                resources: ['*']
              }
            ),
            new aws_iam.PolicyStatement(
              {
                actions: ['dynamodb:*'],
                resources: ['*']
              }
            )
          ]
        }
      )
    )
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Создание правил с действиями и прикрепление роли
const topicRule = new aws_iot.CfnTopicRule(
      this,
      'TopicRuleDemo',
      {
        ruleName: 'TopicRuleDemo',
        topicRulePayload: {
          actions: [
            {
              firehose: {
                deliveryStreamName: firehoseDeilvery.deliveryStreamName,
                roleArn: role.roleArn
              }
            },
            {
              s3: {
                bucketName: 'bucketName',
                key: 'iot-one',
                roleArn: role.roleArn
              },
            },
            {
              dynamoDb: {
                hashKeyField: 'id',
                hashKeyValue: 'device01',
                hashKeyType: 'STRING',
                rangeKeyField: 'timestamp',
                rangeKeyValue: '${timestamp()}',
                rangeKeyType: 'STRING',
                roleArn: role.roleArn,
                tableName: table.tableName
              }
            }
          ],
          sql: `SELECT *, cast(timestamp() as STRING) AS timestamp FROM 'topic/subtopic'`
        }
      }
    )
Войти в полноэкранный режим Выход из полноэкранного режима

Amplify, Cognito и политика AWS IoT

Чтобы позволить Amplify (react web app) подписаться на тему AWS IoT, нам нужно прикрепить политику к идентификатору Conigto.

  • Найдите идентификатор Cognito из веб-приложения react следующим образом
import Amplify, { Auth, PubSub } from 'aws-amplify';
Auth.currentCredentials().then(creds => console.log(creds));
Войдите в полноэкранный режим Выйти из полноэкранного режима
The Cognito ID can be found from the creds log
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Прикрепите политику AWS IoT к идентификатору Cognito следующим образом
aws iot attach-policy --policy-name 'PolicyForDemoDevice' --target ap-southeast-1:41f19265-5ecd-4c86-8b34-cc58dee6c2f0
aws iot attach-policy --policy-name 'PolicyForDemoDevice' --target ap-southeast-1:2d1afbd5-2d7d-43ec-b906-a40ac2416c10
Войти в полноэкранный режим Выйти из полноэкранного режима

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *