Архитектура
-
Демо
- демо 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