Token Exchange Service(TES)无法获取凭证。

0

【以下的问题经过翻译处理】 绅士们,为什么令牌交换服务 (TES) 无法获取凭据? 我在虚拟机上运行的 Ubuntu 20.x.x 上安装了 greengrass。编号项的末尾是从“/greengrass/v2/logs/greengrass.log”获得的错误日志(截断)。谢谢

我所做的或我认为你应该知道的:

  1. 存在包含 AWSGreengrassResourceAccessRolePolicy 的 GreenGrassServiceRole,以及名称中包含“greengrass”一词的所有其他策略。它还具有如下信任关系。这是在我安装 Greengrass 时创建的,但我添加了其他策略。
{
    "版本": "2012-10-17",
    “陈述”: [
        {
            "效果": "允许",
            “主要的”: {
                “服务”:“greengrass.amazonaws.com”
            },
            “行动”:“sts:AssumeRole”,
            “健康)状况”: {
                “字符串等于”:{
                    “aws:SourceAccount”:“<MY_ACCOUNT_NUMBER>”
                },
                “ArnLike”:{
                    “aws:SourceArn”:“<ARN_THAT_SHOWS_MY_REGION_AND_ACC_NUMBER>:*”
                }
            }
        },
        {
            "效果": "允许",
            “主要的”: {
                “服务”:“credentials.iot.amazonaws.com”
            },
            “行动”:“sts:AssumeRole”
        }
    ]
}

  1. aws.greengrass.Nucleus 组件通过以下配置更新进行部署。别名也存在。
{
  “重置”: [],
  “合并”:{
    “组件配置”:{
      “默认配置”:{
        "iotRoleAlias": "GreengrassV2TokenExchangeRoleAlias",
        "awsRegion": "us-east-1",
        "iotCredEndpoint": "https://sts.us-east-1.amazonaws.com",
        “iotDataEndpoint”:“<ENDPOINT_OBTAINED_FROM_IOT_CORE_SETTINGS>”
      }
    }
  }
}

  1. aws.greengrass.TokenExchangeService 已部署。
  2. 有一个自定义组件使用 Greengrass SDK 发布到 IoT Core。它具有以下配置更新。
{
  “重置”: [],
  “合并”:{
    “组件依赖”:{
      “aws.greengrass.TokenExchangeService”:{
        "版本要求": "^2.0.0",
        “依赖类型”:“硬”
      }
    }
  }
}

  1. 有一个来自先前练习的 IoT 策略附加到核心设备(虚拟机上的 Ubuntu)证书。它允许所有 动作。还有另一个与事物证书相关联的“GreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias”。该策略允许iot:AssumeRoleWithCertificate

错误日志如下

2022-05-21T21:07:39.592Z [错误] (pool-2-thread-28) com.aws.greengrass.tes.CredentialRequestHandler:从 TES 检索 AwsCredentials 时出错。 {iotCredentialsPath=/role-aliases/GreengrassV2TokenExchangeRoleAlias/credentials, credentialData=获取连接失败}
2022-05-21T21:08:38.071Z [WARN] (pool-2-thread-28) com.aws.greengrass.tes.CredentialRequestHandler:获取凭证时遇到错误。 {iotCredentialsPath=/role-aliases/GreengrassV2TokenExchangeRoleAlias/credentials}
com.aws.greengrass.deployment.exceptions.AWSIotException:无法获得响应
在 com.aws.greengrass.iot.IotCloudHelper.getHttpResponse(IotCloudHelper.java:95)
在 com.aws.greengrass.iot.IotCloudHelper.lambda$sendHttpRequest$1(IotCloudHelper.java:80)
在 com.aws.greengrass.util.BaseRetryableAccessor.retry(BaseRetryableAccessor.java:32)
在 com.aws.greengrass.iot.IotCloudHelper.sendHttpRequest(IotCloudHelper.java:81)
在 com.aws.greengrass.tes.CredentialRequestHandler.getCredentialsBypassCache(CredentialRequestHandler.java:207)
在 com.aws.greengrass.tes.CredentialRequestHandler.getCredentials(CredentialRequestHandler.java:328)
在 com.aws.greengrass.tes.CredentialRequestHandler.getAwsCredentials(CredentialRequestHandler.java:337)
在 com.aws.greengrass.tes.LazyCredentialProvider.resolveCredentials(LazyCredentialProvider.java:24)
在 software.amazon.awssdk.awscore.internal.AwsExecutionContextBuilder.resolveCredentials(AwsExecutionContextBuilder.java:165)
在 software.amazon.awssdk.awscore.internal.AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(AwsExecutionContextBuilder.java:102)
在 software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.invokeInterceptorsAndCreateExecutionContext(AwsSyncClientHandler.java:69)
在 software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.lambda$execute$1(BaseSyncClientHandler.java:78)
在 software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.measureApiCallSuccess(BaseSyncClientHandler.java:175)
在 software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:76)
在 software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:45)
在 software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:56)
在 software.amazon.awssdk.services.s3.DefaultS3Client.getBucketLocation(DefaultS3Client.java:3382)
在 com.aws.greengrass.componentmanager.builtins.S3Downloader.lambda$getRegionClientForBucket$2(S3Downloader.java:134)
在 com.aws.greengrass.util.RetryUtils.runWithRetry(RetryUtils.java:50)
在 com.aws.greengrass.componentmanager.builtins.S3Downloader.getRegionClientForBucket(S3Downloader.java:133)
在 com.aws.greengrass.componentmanager.builtins.S3Downloader.getDownloadSize(S3Downloader.java:115)
在 com.aws.greengrass.componentmanager.ComponentManager.prepareArtifacts(ComponentManager.java:420)
在 com.aws.greengrass.componentmanager.ComponentManager.preparePackage(ComponentManager.java:377)
在 com.aws.greengrass.componentmanager.ComponentManager.lambda$preparePackages$1(ComponentManager.java:338)
在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
在 java.base/java.lang.Thread.run(Thread.java:829)
引起:java.net.UnknownHostException:https
在 java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
在 java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1509)
在 java.base/java.net.InetAddress.getAllByName(InetAddress.java:1368)
在 java.base/java.net.InetAddress.getAllByName(InetAddress.java:1302)
在 org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
在 org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
在 jdk.internal.reflect.GeneratedMethodAccessor51.invoke(未知来源)
在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.base/java.lang.reflect.Method.invoke(Method.java:566)
在 software.amazon.awssdk.http.apache.internal.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:80)
在 com.sun.proxy.$Proxy15.connect(未知来源)
在 org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
在 software.amazon.awssdk.http.apache.internal.impl.ApacheSdkHttpClient.execute(ApacheSdkHttpClient.java:72)
在 software.amazon.awssdk.http.apache.ApacheHttpClient.execute(ApacheHttpClient.java:253)
在 software.amazon.awssdk.http.apache.ApacheHttpClient.access$500(ApacheHttpClient.java:106)
在 software.amazon.awssdk.http.apache.ApacheHttpClient$1.call(ApacheHttpClient.java:232)
在 com.aws.greengrass.iot.IotCloudHelper.getHttpResponse(IotCloudHelper.java:88)
... 还有 27 个

2022-05-21T21:08:38.073Z [错误] (pool-2-thread-28) com.aws.greengrass.tes.CredentialRequestHandler:从 TES 检索 AwsCredentials 时出错。 {iotCredentialsPath=/role-aliases/GreengrassV2TokenExchangeRoleAlias/credentials, credentialData=获取连接失败}

profile picture
专家
已提问 5 个月前14 查看次数
1 回答
0

【以下的回答经过翻译处理】 你好,

错误是 java.net.UnknownHostException: https。这告诉我凭据终端点未正确配置。我在你的配置中看到,你尝试使用STS作为凭据终端点,但这不是正确设置TES的方式。AWS IoT凭据终端点是唯一可以使用的终端点。请查看 https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html 以了解更多信息。通过运行 aws iot describe-endpoint --endpoint-type iot:CredentialProvider 找到正确的终端点。

如果你使用自动配置安装了Greengrass,则所有这些都会正确设置为你。请参阅 https://docs.aws.amazon.com/greengrass/v2/developerguide/quick-installation.html

你为Greengrass配置的IoT数据和凭据终端点应该只是主机名,不包括任何协议(如 https://)。正确值的示例是 xxxxxx.credentials.iot.us-east-1.amazonaws.com

profile picture
专家
已回答 5 个月前

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

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

回答问题的准则