Java Lambda 函数在发布到 AWS IoT 时卡住了
Java Lambda Function stuck when publishing to AWS IoT
我正在尝试从使用 Spring-boot 编写的 Lambda 发布到 AWS-IoT 主题。我正在使用以下依赖项,
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>1.11.710</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-iot</artifactId>
<version>1.11.710</version>
</dependency>
这里是必要的配置
@Bean
public AWSIotData awsIotDataClient() {
return AWSIotDataClient.builder().standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("https://<my-account-specific>.iot.us-west-1.amazonaws.com", Regions.US_WEST_1.getName()))
.withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
.build();
}
这是我将数据发布到 aws-Iot 主题的实现。
@Autowired
private AWSIotData awsIotDataClient;
@Autowired
private ObjectMapper objectMapper;
@Override
public void publish(String topic, MyObject response) throws JsonProcessingException {
logger.info("Publishing to topic: {} and payload : {}", topic, response);
PublishRequest publishRequest = new PublishRequest().withPayload(
ByteBuffer.wrap(objectMapper.writeValueAsBytes(response))).withQos(1).withTopic(topic);
PublishResult result = awsIotDataClient.publish(publishRequest);
logger.info("Successfully published message to topic: {} and payload: {}, with result: ", topic, response, result);
}
当我在本地 运行 时,此实现工作正常。但是当我 运行 它在 AWS-Lambda 中时,它一直到达发布并且在超过 40 秒内从未得到响应,并且 lambda 最终超时。
lambda 角色附加了 AWSIoTFullAccess、AWSLambdaVPCAccessExecutionRole 策略。因此,这里的任何指导将不胜感激。谢谢。
这是我的VPC的出站安全组。它还附有一个 IGW。 IGW 还与 lambda 运行 所在的子网相关联。
VPC 中的 Lambda 函数不能直接使用互联网网关,因为 Lambda 函数永远不会被分配 public IP 地址。 VPC 中的 Lambda 函数必须位于具有到 NAT 网关的路由的 VPC 的私有子网中,才能访问 Internet。由于 VPC 端点尚不支持 AWS IoT 服务,如果 Lambda 函数必须驻留在 VPC 中,您唯一的选择是使用 NAT 网关。
我正在尝试从使用 Spring-boot 编写的 Lambda 发布到 AWS-IoT 主题。我正在使用以下依赖项,
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>1.11.710</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-iot</artifactId>
<version>1.11.710</version>
</dependency>
这里是必要的配置
@Bean
public AWSIotData awsIotDataClient() {
return AWSIotDataClient.builder().standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("https://<my-account-specific>.iot.us-west-1.amazonaws.com", Regions.US_WEST_1.getName()))
.withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
.build();
}
这是我将数据发布到 aws-Iot 主题的实现。
@Autowired
private AWSIotData awsIotDataClient;
@Autowired
private ObjectMapper objectMapper;
@Override
public void publish(String topic, MyObject response) throws JsonProcessingException {
logger.info("Publishing to topic: {} and payload : {}", topic, response);
PublishRequest publishRequest = new PublishRequest().withPayload(
ByteBuffer.wrap(objectMapper.writeValueAsBytes(response))).withQos(1).withTopic(topic);
PublishResult result = awsIotDataClient.publish(publishRequest);
logger.info("Successfully published message to topic: {} and payload: {}, with result: ", topic, response, result);
}
当我在本地 运行 时,此实现工作正常。但是当我 运行 它在 AWS-Lambda 中时,它一直到达发布并且在超过 40 秒内从未得到响应,并且 lambda 最终超时。 lambda 角色附加了 AWSIoTFullAccess、AWSLambdaVPCAccessExecutionRole 策略。因此,这里的任何指导将不胜感激。谢谢。
这是我的VPC的出站安全组。它还附有一个 IGW。 IGW 还与 lambda 运行 所在的子网相关联。
VPC 中的 Lambda 函数不能直接使用互联网网关,因为 Lambda 函数永远不会被分配 public IP 地址。 VPC 中的 Lambda 函数必须位于具有到 NAT 网关的路由的 VPC 的私有子网中,才能访问 Internet。由于 VPC 端点尚不支持 AWS IoT 服务,如果 Lambda 函数必须驻留在 VPC 中,您唯一的选择是使用 NAT 网关。