-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Calling Regions.getCurrentRegion() attempts to access the EC2 instance metadata endpoint, but doing so repeatedly can result in being rate-limited. When that happens, null is returned and other operations that access the metadata endpoint such as instance profile credential refreshes can fail. This updates calls to Regions.getCurrentRegion() through a new class that caches the first successful region lookup and fails loudly when current region resolution fails instead of returning null.
- Loading branch information
1 parent
773f77e
commit 4374841
Showing
4 changed files
with
63 additions
and
20 deletions.
There are no files selected for viewing
55 changes: 55 additions & 0 deletions
55
presto-hive/src/main/java/io/prestosql/plugin/hive/aws/AwsCurrentRegionHolder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
/* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package io.prestosql.plugin.hive.aws; | ||
|
||
import com.amazonaws.regions.Region; | ||
import com.amazonaws.regions.Regions; | ||
import com.google.common.base.Suppliers; | ||
|
||
import java.util.function.Supplier; | ||
|
||
/** | ||
* Caches the result of calling {@link Regions#getCurrentRegion()} since accessing EC2 instance | ||
* metadata repeatedly can result in being throttled and prevent other metadata accessing operations | ||
* such as refreshing instance credentials from working normally | ||
*/ | ||
public final class AwsCurrentRegionHolder | ||
{ | ||
private static final Supplier<Region> SUPPLIER = Suppliers.memoize(AwsCurrentRegionHolder::loadCurrentRegionOrThrowOnNull); | ||
|
||
private AwsCurrentRegionHolder() {} | ||
|
||
/** | ||
* Attempts to resolve the current region from EC2's instance metadata through {@link Regions#getCurrentRegion()}. If | ||
* no region is able to be resolved an exception is thrown | ||
*/ | ||
public static Region getCurrentRegionFromEC2Metadata() | ||
throws IllegalStateException | ||
{ | ||
return SUPPLIER.get(); | ||
} | ||
|
||
/** | ||
* @throws IllegalStateException when no region is resolved to avoid memoizing a transient failure | ||
*/ | ||
private static Region loadCurrentRegionOrThrowOnNull() | ||
throws IllegalStateException | ||
{ | ||
Region result = Regions.getCurrentRegion(); | ||
if (result == null) { | ||
throw new IllegalStateException("Failed to resolve current AWS region from EC2 metadata"); | ||
} | ||
return result; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters