gpt4 book ai didi

amazon-web-services - “无法执行 HTTP 请求 : Connect to . s3.amazonaws.com:443 失败:连接超时

转载 作者:行者123 更新时间:2023-12-04 14:21:14 25 4
gpt4 key购买 nike

我正在尝试用 java 编写一个 Lambda 函数,它连接到 S3,然后获取数据。

当我在本地运行它时,使用 main 函数它工作正常并返回结果。
但是当我将它上传到 AWS lambda 并运行它时,我收到以下错误消息:

"errorMessage": "Unable to execute HTTP request: Connect to bucket-name.s3.amazonaws.com:443 [bucket-name.s3.amazonaws.com/52.217.1.172] failed: connect timed out", "errorType": "com.amazonaws.SdkClientException",



我的 S3 存储桶是公开的。

我的 pom.xml:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.493</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>

我的请求处理程序:
public class LambdaRequestHandler implements RequestHandler<String, String>{

@Autowired
public ClaimSuffixNumberService csService;

@Override
public String handleRequest(String input, Context context) {
// TODO Auto-generated method stub

if(csService==null) {
csService= Application.getBean(ClaimSuffixNumberService.class);
}
String result= csService.readAndMakeCall("claimSuffix");
return result;
}



}

我的服务
public String getObject(String fileName) {
System.out.println("Inside Get Object");

try {
BasicAWSCredentials awsCreds = new BasicAWSCredentials("access-key","secret-key");


AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(Regions.US_EAST_1)
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();

System.out.println(s3Client);

S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket-name, object-name));


InputStream is = s3object.getObjectContent();

String content = StreamUtils.copyToString(is,
StandardCharsets.UTF_8);

return content;

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}





public String readAndMakeCall(String fileName) {
// TODO Auto-generated method stub
try {
System.out.println("Reading for " + fileName);
String content = getObject(fileName);

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

List<ClaimSuffixNumber> claimSuffixList = mapper.readValue(content, mapper.getTypeFactory().constructCollectionType(List.class, ClaimSuffixNumber.class));
System.out.println(claimSuffixList.toString());
for(ClaimSuffixNumber i: claimSuffixList)
{
System.out.println(i);
}
return claimSuffixList.toString();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return " ";
}

最佳答案

就像马里奥所说的,您的 Lambda 目前无法访问互联网。这很可能是因为您的 VPC 配置。我相信马里奥的答案是正确的。您可以设置 S3 VPC 终端节点。就我而言,由于我使用的是 SES 和 Lambda,因此您无法为 SES 设置端点,因此我添加了使用 NAT 网关的解决方法。 (注意:NAT 网关没有免费层)

  • 进入 VPC 控制台,进入子网菜单并在您拥有 Lambda 函数的 VPC 中创建一个新子网。
  • 接下来,进入 NAT 网关菜单并创建一个 NAT 网关。选择一个可以访问 Internet 的子网(不是新子网)并且位于同一个 VPC 中。您可以通过转至子网菜单、选择子网并单击路由表选项卡来检查子网是否可以访问 Internet。如果它可以访问互联网,您应该看到如下内容:
  • |---------------------|------------------|
    | Destination | Target |
    |---------------------|------------------|
    | 0.0.0.0/0 | igw-#### |
    |---------------------|------------------|
  • 接下来,转到路由表菜单并创建一个新的路由表。确保它在同一个 VPC 中。创建新路由时,默认情况下它带有 Internet 网关路由,因此单击“路由”选项卡并将该路由替换为指向 NAT 网关的新路由。它应该是这样的:
  • |---------------------|------------------|
    | Destination | Target |
    |---------------------|------------------|
    | 0.0.0.0/0 | nat-#### |
    |---------------------|------------------|
  • 接下来,转到子网关联选项卡并关联您刚刚创建的子网。
  • 最后,返回到您的 Lambda 函数并将子网更改为仅您刚刚创建的子网。它现在应该可以访问互联网。如果您需要更多可用性,您可以创建具有不同可用区的其他子网并重复相同的过程。

  • 重申一下,NAT 网关没有免费层,因此请记住这一点。这是定价信息 https://aws.amazon.com/vpc/pricing/

    关于amazon-web-services - “无法执行 HTTP 请求 : Connect to <bucket-name>. s3.amazonaws.com:443 失败:连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588491/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com