Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services &引用;无法执行HTTP请求:连接到<;bucket name>;。s3.amazonaws.com:443失败:连接超时_Amazon Web Services_Amazon S3_Aws Lambda_Aws Sdk_Aws Java Sdk - Fatal编程技术网

Amazon web services &引用;无法执行HTTP请求:连接到<;bucket name>;。s3.amazonaws.com:443失败:连接超时

Amazon web services &引用;无法执行HTTP请求:连接到<;bucket name>;。s3.amazonaws.com:443失败:连接超时,amazon-web-services,amazon-s3,aws-lambda,aws-sdk,aws-java-sdk,Amazon Web Services,Amazon S3,Aws Lambda,Aws Sdk,Aws Java Sdk,我试图用java编写一个Lambda函数,它连接到S3,然后获取数据 当我在本地运行它时,使用main函数它工作正常并返回结果。 Buit当我将其上传到AWS lambda并运行时,我收到以下错误消息: “errorMessage:“无法执行HTTP请求:连接到bucket name.s3.amazonaws.com:443[bucket name.s3.amazonaws.com/52.217.1.172]失败:连接超时”, “errorType”:“com.amazonaws.SdkClie

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

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

“errorMessage:“无法执行HTTP请求:连接到bucket name.s3.amazonaws.com:443[bucket name.s3.amazonaws.com/52.217.1.172]失败:连接超时”, “errorType”:“com.amazonaws.SdkClientException”

我把我的S3存储桶作为公共存储

My 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>

亚马逊网站
aws java sdk
1.11.493
org.apache.httpcomponents
httpcore
亚马逊网站
aws lambda java内核
1.1.0
我的请求处理程序:

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类LambdaRequestHandler实现RequestHandler{
@自动连线
公共索赔编号服务csService;
@凌驾
公共字符串handleRequest(字符串输入,上下文){
//TODO自动生成的方法存根
if(csService==null){
csService=Application.getBean(ClaimSuffixNumberService.class);
}
String result=csService.readAndMakeCall(“claimSuffix”);
返回结果;
}
}
我的服务

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 " ";
}
公共字符串getObject(字符串文件名){
System.out.println(“内部获取对象”);
试一试{
BasicAWSCredentials awsCreds=新的BasicAWSCredentials(“访问密钥”、“密钥”);
AmazonS3 s3Client=AmazonS3ClientBuilder.standard()
.withRegion(Regions.US_EAST_1)
.具有凭证(新的AWSStaticCredentialsProvider(awsCreds))
.build();
System.out.println(s3Client);
S3Object S3Object=s3Client.getObject(新的GetObjectRequest(bucket名称、对象名称));
InputStream=s3object.getObjectContent();
字符串内容=StreamUtils.copyToString(is,
标准字符集(UTF_8);
返回内容;
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
公共字符串readAndMakeCall(字符串文件名){
//TODO自动生成的方法存根
试一试{
System.out.println(“读取”+文件名);
字符串内容=getObject(文件名);
ObjectMapper mapper=新的ObjectMapper();
configure(反序列化功能。接受单个值作为数组,true);
List claimSuffixList=mapper.readValue(content,mapper.getTypeFactory().constructioncollectiontype(List.class,ClaimSuffixNumber.class));
System.out.println(claimSuffixList.toString());
for(ClaimSuffixNumber i:claimSuffixList)
{
系统输出打印LN(i);
}
return claimSuffixList.toString();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回“”;
}

检查分配给lambda的角色。具有访问s3读写权限的Lambda角色

检查lambda角色策略


检查分配给它的bucket策略和分配给bucket的Cors配置

基于这个错误,我相信你的lambda没有互联网。在Vpc中配置lambda时,您正在失去internet连接。要恢复internet访问,您应该: -在默认vpc中启动lambda(如果可能) -为自定义vpc设置s3 vpc端点(允许自定义vpc中的应用程序访问s3,还可以配置其他端点;检查定价,这仅适用于某些aws服务) -设置NAT网关(请参阅定价,连接不限于aws服务)


没有理由硬编码aws凭据。所有必需的权限都应分配给您的执行角色

正如马里奥所说,您的Lambda目前无法访问互联网。这很可能是因为您的VPC配置。我相信马里奥的回答是正确的。您可以设置S3 VPC端点。在我的例子中,因为我使用的是SES和Lambda,所以不能为SES设置端点,所以我使用NAT网关添加了一个解决方案。(注意:NAT网关没有空闲层)

  • 进入VPC控制台,进入Subnets(子网)菜单,在具有Lambda功能的VPC中创建一个新的子网
  • 接下来,进入NAT网关菜单并创建NAT网关。选择一个子网,该子网可以访问internet(不是新的子网),并且位于同一VPC中。通过转到“子网”菜单,选择子网并单击“路由表”选项卡,可以检查子网是否可以访问internet。如果它可以访问internet,您应该看到如下内容:
  • 接下来,转到“路由表”菜单并创建一个新路由表。确保它在同一个VPC中。创建新路由时,默认情况下会附带internet网关路由,因此请单击“路由”选项卡,并将该路由替换为指向NAT网关的新路由。应该是这样的:
  • 下一步,转到“子网关联”选项卡并关联刚创建的子网
  • 最后,返回Lambda函数,将子网更改为仅创建的子网。它现在应该可以上网了。如果需要更多可用性,可以创建具有不同可用性区域的附加子网,并重复相同的过程

只是重申一下,NAT网关没有空闲层,所以请记住这一点。这是定价信息

您是否配置了角色和存储桶策略???什么最终起作用?
|---------------------|------------------|
|     Destination     |      Target      |
|---------------------|------------------|
|     0.0.0.0/0       |     igw-####     |
|---------------------|------------------|
|---------------------|------------------|
|     Destination     |      Target      |
|---------------------|------------------|
|     0.0.0.0/0       |     nat-####     |
|---------------------|------------------|