У меня есть ЭМИ, который раскручивается в eu-west-1
частная подсеть. Я определил конечную точку шлюза для S3 в таблице маршрутов. Мне нужно получить доступ к этой корзине/местоположению публичный, предоставленной AWS: s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar
, которая дает следующую ошибку. Я думаю, это из-за доступа между регионами через конечную точку шлюза, которая не разрешена. Я могу получить доступ к другим корзинам, которые находятся в том же регионе. Есть ли обходной путь для доступа к этому, может быть, через NAT? В таблице маршрутов уже есть NAT, но запрос почему-то не проходит через него.
2019-04-10T05:17:06.849Z INFO Ensure step 1 jar file s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar
INFO Failed to download: s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar
java.lang.RuntimeException: Error whilst fetching 's3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar'
at aws157.instancecontroller.util.S3Wrapper.fetchS3HadoopFileToLocal(S3Wrapper.java:412)
at aws157.instancecontroller.util.S3Wrapper.fetchHadoopFileToLocal(S3Wrapper.java:351)
at aws157.instancecontroller.master.steprunner.HadoopJarStepRunner$Runner.<init>(HadoopJarStepRunner.java:243)
at aws157.instancecontroller.master.steprunner.HadoopJarStepRunner.createRunner(HadoopJarStepRunner.java:152)
at aws157.instancecontroller.master.steprunner.HadoopJarStepRunner.createRunner(HadoopJarStepRunner.java:146)
at aws157.instancecontroller.master.steprunner.StepExecutor.runStep(StepExecutor.java:136)
at aws157.instancecontroller.master.steprunner.StepExecutor.run(StepExecutor.java:70)
at aws157.instancecontroller.master.steprunner.StepExecutionManager.enqueueStep(StepExecutionManager.java:248)
at aws157.instancecontroller.master.steprunner.StepExecutionManager.doRun(StepExecutionManager.java:195)
at aws157.instancecontroller.master.steprunner.StepExecutionManager.access$000(StepExecutionManager.java:33)
at aws157.instancecontroller.master.steprunner.StepExecutionManager$1.run(StepExecutionManager.java:94)
Caused by: com.amazonaws.AmazonClientException: Unable to execute HTTP request: connect timed out
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:618)
at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1143)
at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1021)
at aws157.instancecontroller.util.S3Wrapper.copyS3ObjectToFile(S3Wrapper.java:303)
at aws157.instancecontroller.util.S3Wrapper.getFile(S3Wrapper.java:287)
at aws157.instancecontroller.util.S3Wrapper.fetchS3HadoopFileToLocal(S3Wrapper.java:399)
... 10 more
@ Michael-sqlbot Да, он развернут в той же подсети, которую должен обслуживать. Как это проблема?
Шлюз NAT должен находиться в общедоступной подсети с маршрутом по умолчанию для таблицы маршрутов этой подсети, указывающим на интернет-шлюз. Если шлюз NAT развернут в подсети, которую он обслуживает, когда шлюз NAT пытается получить доступ к Интернету, его исходящий трафик зацикливается прямо на себя, поскольку маршрут по умолчанию для подсети указывает на шлюз NAT.
@Michael-sqlbot Спасибо! Пожалуйста, конвертируйте в ответ.
Конечная точка шлюза S3 никогда не будет пытаться маршрутизировать межрегиональный трафик, но шлюз NAT должен обрабатывать этот трафик автоматически. Учитывая утверждение о наличии шлюза NAT, Unable to execute HTTP request: connect timed out
означает, что шлюз NAT (или связанный с ним параметр) настроен неправильно.
Как отмечалось в комментариях, конкретная проблема здесь заключалась в том, что шлюз NAT был предоставлен в той же подсети, для обслуживания которой он предназначался. Это недопустимая конфигурация, потому что в этом случае шлюз NAT пытается выйти в Интернет... через себя... поскольку он получает маршрут по умолчанию из подсети, в которой он развернут.
To create a NAT gateway, you must specify the public subnet in which the NAT gateway should reside.
...
After you've created a NAT gateway, you must update the route table associated with one or more of your private subnets to point Internet-bound traffic to the NAT gateway. This enables instances in your private subnets to communicate with the internet. (emphasis added)
https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-basics
Если у вас уже есть шлюз NAT, он должен обрабатывать этот трафик автоматически.
Unable to execute HTTP request: connect timed out
подразумевает, что шлюз NAT неправильно настроен — не включен в таблицу маршрутизации или, возможно, развернут в той же подсети, для обслуживания которой он предназначен, что неверно. Конечная точка шлюза S3 никогда не будет пытаться маршрутизировать межрегиональный трафик.