无法从 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 回答
0

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

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则