«Невозможно выполнить HTTP-запрос: подключиться к ‹bucket-name› .s3.amazonaws.com: сбой 443: время ожидания подключения истекло

Я пытаюсь написать функцию Lambda в java, которая подключается к S3, а затем извлекает данные.

Когда я запускаю его локально, используя основную функцию, он отлично работает и возвращает результат. 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 публично.

Мой 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 " ";
}

person Kshitiz Sharma    schedule 08.02.2019    source источник
comment
вы настроили политику ролей и сегментов ???   -  person Harsh Manvar    schedule 08.02.2019
comment
что сработало в итоге?   -  person Ramya Rao    schedule 03.12.2019


Ответы (3)


Как сказал Марио, ваша Лямбда в настоящее время не имеет доступа в Интернет. Скорее всего, это связано с вашей конфигурацией VPC. Я считаю, что ответ Марио правильный. Вы можете настроить конечную точку S3 VPC. В моем случае, поскольку я работал с SES и Lambda, вы не можете настроить конечную точку для SES, поэтому я добавляю обходной путь с помощью шлюза NAT. (ПРИМЕЧАНИЕ: NAT-шлюз НЕ имеет уровня бесплатного пользования)

  • Перейдите в консоль VPC, в меню «Подсети» и создайте новую подсеть в VPC, где у вас есть функция Lambda.
  • Затем перейдите в меню шлюзов NAT и создайте шлюз NAT. Выберите подсеть с доступом в Интернет (не новую) и в том же VPC. Вы можете проверить, есть ли в подсети доступ в Интернет, перейдя в меню подсети, выбрав подсеть и щелкнув вкладку Таблица маршрутов. Если у него есть доступ в Интернет, вы должны увидеть что-то вроде:
|---------------------|------------------|
|     Destination     |      Target      |
|---------------------|------------------|
|     0.0.0.0/0       |     igw-####     |
|---------------------|------------------|
  • Затем перейдите в меню Таблицы маршрутов и создайте новую таблицу маршрутов. Убедитесь, что он находится в том же VPC. Когда вы создаете новый, он по умолчанию идет с маршрутом интернет-шлюза, поэтому щелкните вкладку «Маршруты» и замените этот маршрут новым, указывающим на ваш шлюз NAT. Должно получиться так:
|---------------------|------------------|
|     Destination     |      Target      |
|---------------------|------------------|
|     0.0.0.0/0       |     nat-####     |
|---------------------|------------------|
  • Затем перейдите на вкладку «Связи подсетей» и свяжите только что созданную подсеть.
  • Наконец, вернитесь к своей лямбда-функции и измените подсеть (подсети) только на ту подсеть, которую вы только что создали. Теперь у него должен быть доступ в Интернет. Если вам нужна большая доступность, вы можете создать дополнительные подсети с разными зонами доступности и повторить тот же процесс.

Повторюсь, NAT Gateway НЕ имеет бесплатного уровня, так что имейте это в виду. Вот информация о ценах https://aws.amazon.com/vpc/pricing/

person JavierCastro    schedule 03.04.2020

Основываясь на ошибке, я считаю, что у вашей лямбды нет Интернета. Вы теряете соединение с Интернетом, когда настраиваете лямбду в Vpc. Чтобы восстановить доступ в Интернет, вы должны: - запустить лямбда-выражение в vpc по умолчанию (если возможно) - настроить конечную точку s3 vpc для вашего настраиваемого vpc (позволяет приложениям из вашего настраиваемого vpc получать доступ к s3, есть другие конечные точки, которые можно настроить; проверьте цены , это работает только для некоторых служб aws) - настройте шлюз NAT (см. цены, возможность подключения не ограничивается только службами aws)

Нет причин жестко кодировать учетные данные aws. Все необходимые разрешения должны быть назначены вашей роли исполнения.

person Mario    schedule 09.02.2019

Установите флажок Назначить роль лямбда. Лямбда-роль, имеющая разрешение на доступ к разрешению на чтение и запись в s3.

Проверьте политику лямбда-ролей.

проверьте, назначена ли ему политика корзины, а также конфигурация Cors для корзины.

person Harsh Manvar    schedule 08.02.2019