Skip to content

feat: Add AppConfig provider to parameters module #1104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Jun 21, 2023
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
50a0155
Starting AppConfigProvider
scottgerring Mar 20, 2023
f3d6e8e
Merge remote-tracking branch 'origin/master' into feat-params-appconfig
scottgerring Mar 20, 2023
a273dc3
Fleshing it out
scottgerring Mar 20, 2023
383bff7
Merge branch 'master' into feat-params-appconfig
scottgerring May 31, 2023
78ba7be
Adding tests
scottgerring May 31, 2023
70db445
Remove cruft
scottgerring May 31, 2023
0a5bef1
Advancing the e2e tests and impl
scottgerring Jun 1, 2023
3639a1e
E2E test for params working
scottgerring Jun 1, 2023
c71e4e0
More tests + inline doco
scottgerring Jun 2, 2023
dce177f
Fix bug and docs
scottgerring Jun 2, 2023
fcadb92
More testing
scottgerring Jun 2, 2023
713158c
More test
scottgerring Jun 2, 2023
a804069
Remove cruft
scottgerring Jun 2, 2023
5cb36dd
MOre cleanup
scottgerring Jun 2, 2023
5ff3e3e
Update docs/utilities/parameters.md
scottgerring Jun 6, 2023
46a16db
Update powertools-parameters/src/main/java/software/amazon/lambda/pow…
scottgerring Jun 6, 2023
1059274
Merge remote-tracking branch 'origin/master' into feat-params-appconfig
scottgerring Jun 6, 2023
105efce
Fix comment
scottgerring Jun 6, 2023
ff701a8
Address field name issue
scottgerring Jun 6, 2023
e8a95e9
Use appropriate credentials provider depending on whether or not we'r…
scottgerring Jun 6, 2023
e155a66
Merge remote-tracking branch 'refs/remotes/origin/feat-params-appconf…
scottgerring Jun 6, 2023
c6eb2c9
Address review feedback
scottgerring Jun 14, 2023
d28189b
Merge remote-tracking branch 'origin/master' into feat-params-appconfig
scottgerring Jun 14, 2023
304b413
Merge branch 'master' into feat-params-appconfig
scottgerring Jun 15, 2023
2edb99d
Merge branch 'master' into feat-params-appconfig
scottgerring Jun 15, 2023
3269abe
Merge branch 'main' into feat-params-appconfig
jeromevdl Jun 20, 2023
c607af3
Address @kozub feedback
scottgerring Jun 21, 2023
6652c82
Merge remote-tracking branch 'refs/remotes/origin/feat-params-appconf…
scottgerring Jun 21, 2023
d03d5de
Remove unecessary captor
scottgerring Jun 21, 2023
9c22306
Merge branch 'main' into feat-params-appconfig
scottgerring Jun 21, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions docs/utilities/parameters.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,49 @@ a `DynamoDbProvider` providing a client if you need to configure it yourself.
}
```

## AppConfig
To get parameters stored in AppConfig, use `getAppConfigProvider`, providing the application and environment
name to retrieve configuration from. As with the other providers, an overloaded method allows you to retrieve
an `AppConfigProvider` providing a client if you need to configure it yourself.

=== "AppConfigProvider"

```java hl_lines="6 9"
import software.amazon.lambda.powertools.parameters.AppConfigProvider;
import software.amazon.lambda.powertools.parameters.ParamManager;

public class AppWitAppConfigParameters implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
// Get an instance of the AppConfigProvider
AppConfigProvider appConfigProvider = ParamManager.getAppConfigProvider("my-environment", "my-app");

// Retrieve a single parameter
String value = appConfigProvider.get("my-key");
}
```

=== "AppConfigProvider with a custom client"

```java hl_lines="9 10 11 12 15 18"
import software.amazon.lambda.powertools.parameters.AppConfigProvider;
import software.amazon.lambda.powertools.parameters.ParamManager;
import software.amazon.awssdk.services.appconfigdata.AppConfigDataClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.regions.Region;

public class AppWithDynamoDbParameters implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
// Get an AppConfig Client with an explicit region
AppConfigDataClient appConfigDataClient = AppConfigDataClient.builder()
.httpClientBuilder(UrlConnectionHttpClient.builder())
.region(Region.EU_CENTRAL_2)
.build();

// Get an instance of the DynamoDbProvider
AppConfigProvider appConfigProvider = ParamManager.getAppConfigProvider(appConfigDataClient, "my-environment", "my-app");

// Retrieve a single parameter
String value = appConfigProvider.get("my-key");
}
```


## Advanced configuration
Expand Down
61 changes: 61 additions & 0 deletions powertools-e2e-tests/handlers/parameters/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>software.amazon.lambda</groupId>
<artifactId>e2e-test-handlers-parent</artifactId>
<version>1.0.0</version>
</parent>

<artifactId>e2e-test-handler-parameters</artifactId>
<packaging>jar</packaging>
<name>A Lambda function using powertools logging</name>

<dependencies>
<dependency>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-logging</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-parameters</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<complianceLevel>${maven.compiler.target}</complianceLevel>
<aspectLibraries>
<aspectLibrary>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-logging</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package software.amazon.lambda.powertools.e2e;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import software.amazon.lambda.powertools.logging.Logging;
import software.amazon.lambda.powertools.parameters.ParamManager;
import software.amazon.lambda.powertools.parameters.cache.CacheManager;
import software.amazon.lambda.powertools.parameters.AppConfigProvider;

public class Function implements RequestHandler<Input, String> {

private static final Logger LOG = LogManager.getLogger(Function.class);

@Logging
public String handleRequest(Input input, Context context) {
AppConfigProvider provider = ParamManager.getAppConfigProvider(input.getEnvironment(), input.getApp());
return provider.get(input.getKey());

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package software.amazon.lambda.powertools.e2e;

import java.util.Map;

public class Input {

private String app;
private String environment;
private String key;

public Input() {

}

public void setApp(String app) {
this.app = app;
}

public void setEnvironment(String environment) {
this.environment = environment;
}

public void setKey(String key) {
this.key = key;
}

public String getApp() {
return app;
}

public String getEnvironment() {
return environment;
}

public String getKey() {
return key;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="JsonAppender" target="SYSTEM_OUT">
<JsonTemplateLayout eventTemplateUri="classpath:LambdaJsonLayout.json" />
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="JsonAppender"/>
</Root>
<Logger name="JsonLogger" level="INFO" additivity="false">
<AppenderRef ref="JsonAppender"/>
</Logger>
</Loggers>
</Configuration>
6 changes: 6 additions & 0 deletions powertools-e2e-tests/handlers/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<module>tracing</module>
<module>metrics</module>
<module>idempotency</module>
<module>parameters</module>
</modules>

<dependencyManagement>
Expand All @@ -51,6 +52,11 @@
<artifactId>powertools-idempotency</artifactId>
<version>${lambda.powertools.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.lambda</groupId>
<artifactId>powertools-parameters</artifactId>
<version>${lambda.powertools.version}</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package software.amazon.lambda.powertools;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.*;
import software.amazon.lambda.powertools.testutils.AppConfig;
import software.amazon.lambda.powertools.testutils.Infrastructure;
import software.amazon.lambda.powertools.testutils.lambda.InvocationResult;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.assertj.core.api.Assertions.assertThat;
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ParametersE2ET {


private final ObjectMapper objectMapper = new ObjectMapper();

private Infrastructure infrastructure;
private String functionName;
private final AppConfig appConfig;

public ParametersE2ET() {
Map<String,String> params = new HashMap<>();
params.put("key1", "value1");
params.put("key2", "value2");
appConfig = new AppConfig("e2eApp", "e2etest", params);
}
@BeforeAll
@Timeout(value = 5, unit = TimeUnit.MINUTES)
public void setup() {
infrastructure = Infrastructure.builder()
.testName(ParametersE2ET.class.getSimpleName())
.pathToFunction("parameters")
.appConfig(appConfig)
.environmentVariables(
Stream.of(new String[][]{
{"POWERTOOLS_LOG_LEVEL", "INFO"},
{"POWERTOOLS_SERVICE_NAME", ParametersE2ET.class.getSimpleName()}
})
.collect(Collectors.toMap(data -> data[0], data -> data[1])))
.build();
functionName = infrastructure.deploy();
}

@AfterAll
public void tearDown() {
if (infrastructure != null)
infrastructure.destroy();
}

@Test
public void test_getAppConfigValue() {
for (Map.Entry<String, String >configKey: appConfig.getConfigurationValues().entrySet()) {

// Arrange
String event1 = "{" +
"\"app\": \"" + appConfig.getApplication() + "\", " +
"\"environment\": \"" + appConfig.getEnvironment() + "\", " +
"\"key\": \"" + configKey.getKey() + "\"" +
"}";

// Act
InvocationResult invocationResult = invokeFunction(functionName, event1);

// Assert
assertThat(invocationResult.getResult()).isEqualTo("\"" + configKey.getValue() + "\"");
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package software.amazon.lambda.powertools.testutils;

import java.util.HashMap;
import java.util.Map;

/**
* Defines configuration used to setup an AppConfig
* deployment when the infrastructure is rolled out.
*
* All fields are non-nullable.
*/
public class AppConfig {
private String application;
private String environment;
private Map<String, String> configurationValues;

public AppConfig(String application, String environment, Map<String, String> configurationValues) {
this.application = application;
this.environment = environment;
this.configurationValues = configurationValues;
}

public String getApplication() {
return application;
}

public String getEnvironment() {
return environment;
}

public Map<String, String> getConfigurationValues() {
return configurationValues;
}
}
Loading