如何从CloudFormation模板中获取AWS IOT端点URL?

时间:2017-06-16 12:05:43

标签: amazon-web-services aws-lambda amazon-cloudformation aws-iot

我希望我的一些Lambda资源使用aws-sdk的{​​{1}}函数推送到AWS IOT端点 - 其中endpoint是必需参数。

现在,我通过环境变量将端点URL传递给我的Lambda。但是,当放入SAM / CF模板时,我找不到检索IOT端点URL的方法,因此我可以简单地AWS.IotData({ endpoint: url })

浏览AWS resource type reference我没有找到任何与IOT端点对应的资源。

似乎IOT端点只能通过AWS控制台手动配置(启用/禁用),如下面的屏幕截图所示:

IOT Endpoint AWS Console

有关如何控制配置IOT端点或至少从SAM / CF模板中读取IOT URL的任何建议,而不使用!Ref编写脚本吗?

2 个答案:

答案 0 :(得分:5)

对于任何对CloudFormation Custom Resource解决方案感兴趣的人,我写了一个简单的Lambda和CF模板,为其他CF堆栈提供IOT端点地址。

template.yaml

app.controller('Test',function($scope){
    $scope.first = true;
});

iotEndpointProvider.js

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  IotEndpointProvider:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: IotEndpointProvider
      Handler: iotEndpointProvider.handler
      Runtime: nodejs6.10
      CodeUri: .
      MemorySize: 128
      Timeout: 3
      Policies:
        - Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Action: 
              - iot:DescribeEndpoint
            Resource:
              - '*'
  IotEndpoint:
    Type: 'Custom::IotEndpoint'
    Properties:
      ServiceToken: !GetAtt IotEndpointProvider.Arn
Outputs:
  IotEndpointAddress:
    Value: !GetAtt IotEndpoint.IotEndpointAddress
    Export:
      Name: IotEndpointAddress

答案 1 :(得分:2)

我担心您无法配置IoT端点,因为与IoT端点相关的唯一API调用是DescribeEndpoint

您可以做的是创建一个Lambda支持的CloudFormation自定义资源。 Lambda函数将执行DescribeEndpoint调用(根据Lambda的运行时使用您选择的AWS SDK)并返回端点的URL,以便您的其他CloudFormation资源可以使用它。

以下是Lambda支持的自定义资源的一个很好的示例:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources-lambda.html