无法从 IOT Core 设备[容器内部]连接到 AWS 服务[API Gateway]。

0

【以下的问题经过翻译处理】 我使用 GreengrassV2 创建了一个组件,并在该组件内运行了多个容器。 现在,我的要求是调用 API 网关并将一些数据提取到组件内本地设备上运行的 docker 容器之一中。 我正在使用“导入 com.amazonaws.auth.DefaultAWSCredentialsProviderChain;”用于获取凭据但获取

05:45:06.476 信息 - 使用请求参数调用 API 网关 com.amazon.spiderIoT.stowWorkcell.entities.ApiGatewayRequest@e958e637
线程“main”中的异常 com.amazonaws.SdkClientException:无法从链中的任何提供商加载 AWS 凭证:[EnvironmentVariableCredentialsProvider:无法从环境变量(AWS_ACCESS_KEY_ID(或 AWS_ACCESS_KEY)和 AWS_SECRET_KEY(或 AWS_SECRET_ACCESS_KEY)),SystemPropertiesCredentialsProvider :无法从 Java 系统属性(aws.accessKeyId 和 aws.secretKey)加载 AWS 凭证,WebIdentityTokenCredentialsProvider:要使用角色配置文件,aws-java-sdk-sts 模块必须位于类路径上。com.amazonaws.auth。 profile.ProfileCredentialsProvider@7c36db44:配置文件不能为空,com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@6c008c24:无法连接到服务端点:]
在 com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:136)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1269)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:845)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:794)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:781)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:755)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:715)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:697)
在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:561)
在 com.amazon.spiderIoT.stowWorkcell.client.ApiGatewayClient.execute(ApiGatewayClient.java:134)
在 com.amazon.spiderIoT.stowWorkcell.client.ApiGatewayClient.execute(ApiGatewayClient.java:79)
在 com.amazon.spiderIoT.stowWorkcell.StowWorkcellService.startMQTTSubscriberForSortLocationEvents(StowWorkcellService.java:120)
在 com.amazon.spiderIoT.stowWorkcell.StowWorkcellService.onInitialize(StowWorkcellService.java:65)
在 com.amazon.spideriot.sdk.service.Service.run(Service.java:79)
在 com.amazon.spiderIoT.stowWorkcell.StowWorkcellServiceDriver.main(StowWorkcellServiceDriver.java:26)

我的 dependencyConfiguration 看起来像:-

{
  “aws.greengrass.TokenExchangeService”:{
    "组件版本": "2.0.3",
    “依赖类型”:“硬”
  },
  “aws.greengrass.DockerApplicationManager”:{
    “组件版本”:“2.0.4”
  },
  “aws.greengrass.Cloudwatch”:{
    “组件版本”:“3.0.0”
  },
  “aws.greengrass.Nucleus”:{
    "组件版本": "2.4.0",
    “配置更新”:{
      “合并”:“{\”日志记录\“:{\”级别\“:\”信息\“},\”iotRoleAlias\“:\”GreengrassV2TestCoreTokenExchangeRoleAlias\“}”
    }
  },
  “aws.greengrass.LogManager”:{
    "组件版本": "2.2.3",
    “配置更新”:{
      “merge”:“{\”logsUploaderConfiguration\“:{\”systemLogsConfiguration\“:{\”uploadToCloudWatch\“:\”true\“,\”minimumLogLevel\“:\”INFO\“,\”diskSpaceLimit\“: \"10\",\"diskSpaceLimitUnit\": \"MB\",\"deleteLogFileAfterCloudUpload\": \"false\"},\"componentLogsConfigurationMap\": {\"LedService\": {\"minimumLogLevel\" : \"INFO\",\"diskSpaceLimit\": \"20\",\"diskSpaceLimitUnit\": \"MB\",\"deleteLogFileAfterCloudUpload\": \"false\"}}},\"periodicUploadIntervalSec\ ": \"5\"}"
    }
  }
}

使用 AWS 凭证的 Java 代码

公共类 APIGatewayModule 扩展 AbstractModule {

    @提供
    @单例
    公共 AWSCredentialsProvider getAWSCredentialProvider() {

        返回新的 DefaultAWSCredentialsProviderChain();
    }

    @提供
    @单例
    公共 ApiGatewayClient getApiGatewayClient(最终 AWSCredentialsProvider awsCredentialsProvider){
        System.out.println("获取客户端配置");
        最终 com.amazonaws.ClientConfiguration clientConfiguration = new com.amazonaws.ClientConfiguration();
        System.out.println("获取客户端配置" + clientConfiguration);
        返回新的 ApiGatewayClient(clientConfiguration, Region.getRegion(Regions.fromName("us-east-1")), awsCredentialsProvider, AmazonHttpClient.builder().clientConfiguration(clientConfiguration).build());
    }
}

我一直在关注这个文档:https://docs.aws.amazon.com/greengrass/v2/developerguide/device-service-role.html 我的问题是关于本文档中的任何地方,都提到了“AWS IoT Core 凭据提供程序”,我们应该使用什么凭据提供程序? 还,如本文档中所述,当“运行 AWS IoT Greengrass 核心软件时,您可以选择预置核心设备所需的 AWS 资源”时,我们应该使用 --provision true。但是我们开始时没有这个标志,如何解决这个问题,是否有任何其他文档提供使用凭证提供程序和从 AWS SDK Java 调用 API 网关的参考。

在 SSH 到 docker 上,我发现变量已设置

AWS_CONTAINER_CREDENTIALS_FULL_URI=http://localhost:38135/2016-11-01/credentialprovider/

但是无法从 docker 卷曲到这个 URL,这就是假设的工作方式吗?

1 Antwort
0

【以下的回答经过翻译处理】 在添加重试并更新核心到2.5.6后,工作正常。谢谢!

profile picture
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen