io.linguarobot.aws.cdk.maven.EnvironmentResolver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aws-cdk-maven-plugin Show documentation
Show all versions of aws-cdk-maven-plugin Show documentation
The AWS CDK Maven plugin produces and deploys CloudFormation templates based on the cloud infrastructure defined
by means of CDK. The goal of the project is to improve the experience of Java developers while working with
CDK by eliminating the need for installing Node.js and interacting with the CDK application by means of CDK
Toolkit.
package io.linguarobot.aws.cdk.maven;
import io.linguarobot.aws.cdk.maven.api.AccountCredentialsProvider;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.regions.Region;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Resolves the execution environment i.e. populates account/region-agnostic environments with the default values and
* lookups for the credentials to be used with the environment.
*
* The default region is determined using the default region provider chain. The default account is determined based
* on the credentials provided by the default credentials provider chain.
*
* @see software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain
* @see software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
*/
public class EnvironmentResolver {
private static final String SCHEMA_PREFIX = "aws://";
private static final String UNKNOWN_ACCOUNT = "unknown-account";
private static final String UNKNOWN_REGION = "unknown-region";
private final Region defaultRegion;
private final String defaultAccount;
private final AccountCredentialsProvider accountCredentialsProvider;
public EnvironmentResolver(Region defaultRegion, @Nullable String defaultAccount, AccountCredentialsProvider accountCredentialsProvider) {
this.defaultRegion = defaultRegion;
this.defaultAccount = defaultAccount;
this.accountCredentialsProvider = accountCredentialsProvider;
}
/**
* Resolves an environment from the given environment URI.
*
* @param environment an environment URI in the following format: {@code aws://account/region}
* @throws IllegalArgumentException if the given environment URI is invalid
* @throws CdkPluginException in case the given environment is account-agnostic and a default account cannot be
* determined or if credentials cannot be resolved for the account
* @return resolved environment
*/
public ResolvedEnvironment resolve(String environment) {
if (environment.startsWith(SCHEMA_PREFIX)) {
String[] parts = environment.substring(SCHEMA_PREFIX.length()).split("/");
if (parts.length == 2) {
String account = !parts[0].equals(UNKNOWN_ACCOUNT) ? parts[0] : defaultAccount;
Region region = !parts[1].equals(UNKNOWN_REGION) ? Region.of(parts[1]) : defaultRegion;
if (account == null) {
throw new CdkPluginException("Unable to dynamically determine which AWS account to use for deployment");
}
AwsCredentials credentials = accountCredentialsProvider.get(account)
.orElseThrow(() -> new CdkPluginException("Credentials for the account '" + account +
"' are not available."));
return new ResolvedEnvironment(region, account, credentials);
}
}
throw new IllegalArgumentException("Invalid environment format '" + environment + "'. Expected format: " +
"aws://account/region");
}
@Nonnull
public Region getDefaultRegion() {
return this.defaultRegion;
}
@Nullable
public String getDefaultAccount() {
return this.defaultAccount;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy