AWS IoT Core 多环境
AWS IoT Core multiple environments
假设我想要一个暂存环境和一个生产环境。该应用程序通过添加主题规则来工作,并使用 AWS lambda 处理摄取。
在 AWS IoT Core 中拥有多个环境的最佳方式是什么?
我考虑过这样做:
- 设置两个帐户(在我的项目中不可能)
- 按
dev/*
或 prod/*
等主题前缀拆分环境
- 意味着设备需要提前知道它属于哪里
- 将设备添加到组并进行基于规则的过滤
- 是否有任何指导如何做到这一点?我知道我可以调用 lambda 函数,但这似乎是个坏主意。有一个基于组的过滤器会很棒,但是据我所知,现在无法访问设备的组或属性
我非常喜欢 3. 因为它允许我也使用生产设备进行测试。 1. 和 2. 还行,就是不太灵活
也许有一些最佳做法?
我们已经在项目中体验了几个月的阶段主题前缀方法。我想我们会继续这样做,但我在下面提到了一些副作用。
阶段作为主题前缀
大多数情况下,消息将路由到 IoTCore 规则并触发一些 AWS 服务,例如 Lambda/S3/Dynamo 等。如果您使用的是无服务器,则可以使用如下环境变量实现
...
custom:
myStage: ${opt:stage, self:provider.stage}
STAGES:
- dev
- prod
provider:
name: aws
runtime: nodejs12.x
region: eu-central-1
environment:
STAGE: ${self:custom.myStage}
functions:
someLambdaFunction:
timeout: 180
handler: someLambdaFunction.handler
events:
- iot:
name: "iotRuleName_${self:custom.myStage}"
sqlVersion: "2016-03-23"
sql: "SELECT * as data , topic() as topicName FROM '${self:custom.myStage}/room/+/temperature'"
因此,当您将无服务器应用程序部署到开发环境时,规则名称将为 iotRuleName_dev
,规则 sql 将类似于 dev/room/+/temperature
但是有一些问题:
正如您所说的这种方法,端节点应该知道前缀值。
AWS 将您的主题级别限制为 8 - 最多 7 个正斜杠 (/) - 因此通过将阶段添加为所有主题的前缀,您基本上可以将限制降低到 7 AWS IoT Core Quotas
您仍然需要检查 thingName 冲突。您不能同时在多个环境中拥有相同的 thingName,并且您不想处理它。为事物名称添加阶段前缀可以解决混淆。像 'DEV-Thing1'
您还想考虑使用 basic ingest 来降低成本
按地区分阶段
也可以在 AWS 区域之间拆分整个应用程序环境,无冲突,无副作用。但是你几乎应该把所有的东西都分开,以便在晚上睡个好觉。因为访问不同地区的实体会造成很大的混乱。
自定义应用程序
构建您自己的物联网核心。好吧,如果你做到了这一点。不仅要用还要卖。
假设我想要一个暂存环境和一个生产环境。该应用程序通过添加主题规则来工作,并使用 AWS lambda 处理摄取。
在 AWS IoT Core 中拥有多个环境的最佳方式是什么?
我考虑过这样做:
- 设置两个帐户(在我的项目中不可能)
- 按
dev/*
或prod/*
等主题前缀拆分环境- 意味着设备需要提前知道它属于哪里
- 将设备添加到组并进行基于规则的过滤
- 是否有任何指导如何做到这一点?我知道我可以调用 lambda 函数,但这似乎是个坏主意。有一个基于组的过滤器会很棒,但是据我所知,现在无法访问设备的组或属性
我非常喜欢 3. 因为它允许我也使用生产设备进行测试。 1. 和 2. 还行,就是不太灵活
也许有一些最佳做法?
我们已经在项目中体验了几个月的阶段主题前缀方法。我想我们会继续这样做,但我在下面提到了一些副作用。
阶段作为主题前缀
大多数情况下,消息将路由到 IoTCore 规则并触发一些 AWS 服务,例如 Lambda/S3/Dynamo 等。如果您使用的是无服务器,则可以使用如下环境变量实现
...
custom:
myStage: ${opt:stage, self:provider.stage}
STAGES:
- dev
- prod
provider:
name: aws
runtime: nodejs12.x
region: eu-central-1
environment:
STAGE: ${self:custom.myStage}
functions:
someLambdaFunction:
timeout: 180
handler: someLambdaFunction.handler
events:
- iot:
name: "iotRuleName_${self:custom.myStage}"
sqlVersion: "2016-03-23"
sql: "SELECT * as data , topic() as topicName FROM '${self:custom.myStage}/room/+/temperature'"
因此,当您将无服务器应用程序部署到开发环境时,规则名称将为 iotRuleName_dev
,规则 sql 将类似于 dev/room/+/temperature
但是有一些问题:
正如您所说的这种方法,端节点应该知道前缀值。
AWS 将您的主题级别限制为 8 - 最多 7 个正斜杠 (/) - 因此通过将阶段添加为所有主题的前缀,您基本上可以将限制降低到 7 AWS IoT Core Quotas
您仍然需要检查 thingName 冲突。您不能同时在多个环境中拥有相同的 thingName,并且您不想处理它。为事物名称添加阶段前缀可以解决混淆。像 'DEV-Thing1'
您还想考虑使用 basic ingest 来降低成本
按地区分阶段
也可以在 AWS 区域之间拆分整个应用程序环境,无冲突,无副作用。但是你几乎应该把所有的东西都分开,以便在晚上睡个好觉。因为访问不同地区的实体会造成很大的混乱。
自定义应用程序
构建您自己的物联网核心。好吧,如果你做到了这一点。不仅要用还要卖。