.NET Core IoT and IotData in the same app - how do I configure this?

0

I'm trying to write a simple .NET core web app that makes some calls to interact with AWS IoT. I wanted to be able to search or list things and get their current shadow. I believe I need to use the IoT service to search and list, and IotData to get thing shadows. I'm running into a problem however where I can't seem to find a configuration that works for both.

If I don't have ServiceURL specified in the Appconfig.Development.json, IotData throws

AmazonClientException: No RegionEndpoint or ServiceURL configured

If I provide ServiceURL with the endpoint listed in our AWS IoT dashboard "ENDPOINT.iot.REGION.amazonaws.com", IotData calls begin to work but the IoT service calls fail with the exception

ResourceNotFoundException: Not Found

If I remove all of the IotData code and add the "Region" field to Appconfig.Development.json with our region, the IoT calls begin to work.

If I uncomment the IotData calls with the "Region" field, I get

AmazonClientException: The RegionEndpoint property is not applicable for AmazonIotDataClient and should not be set.

In the past I've used Boto3 in Python and didn't have to configure any of this this way; the region was specified in ~/.aws/config and never had to provide a Service URL, and I've written scripts that used both services, so I'm very confused as to what the issue is.

I'm also certain I have the correct permissions with the keys I'm using as I'm able to perform all of these operations from the AWS CLI. Does anyone have any recommendations on how to configure this so that both services work?

For reference, this is a simple example of what I'm trying to do: https://gist.github.com/nathan-miller-actigraph/6cd18c99ee2ee4ca05fb5f74598287ae (the actual application is a .NET Core 2.1 SPA).

質問済み 5年前478ビュー
1回答
0

I figured it out. For anyone who runs into this same problem, you can create a second section in your appsettings.json:

    "AwsIotDataConfig": {
        "Profile": "default",
        "ServiceURL": "https://data.iot.us-east-1.amazonaws.com/"
    },
    "AwsConfig": {
        "Profile": "default",
        "Region": "us-east-1"
    }

then in your Startup.cs, when you call GetAWSOptions, you can pass in the name of the config section:

            var awsGenericOptions = Configuration.GetAWSOptions("AwsConfig");
            services.AddDefaultAWSOptions(awsGenericOptions);

            var awsIotDataOptions = Configuration.GetAWSOptions("AwsIotDataConfig");

and when you add the IotData service, specify that it should use the IotData specific options:

            services.AddAWSService<IAmazonIoT>();
            services.AddAWSService<IAmazonIotData>(awsIotDataOptions);
回答済み 5年前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン

関連するコンテンツ