Skip to content
This repository was archived by the owner on Feb 23, 2023. It is now read-only.

Commit 3c21937

Browse files
Merge pull request #30 from kozub/java-parameters-example
chore: move examples of using parameters for Java Powertools
2 parents 96dc2d1 + bdc6106 commit 3c21937

File tree

7 files changed

+348
-0
lines changed

7 files changed

+348
-0
lines changed

java/Parameters/Function/pom.xml

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>demo</groupId>
5+
<artifactId>Functions</artifactId>
6+
<version>1.0</version>
7+
<packaging>jar</packaging>
8+
<name>Sample app demoing parameters utility of Powertools.</name>
9+
<properties>
10+
<maven.compiler.source>11</maven.compiler.source>
11+
<maven.compiler.target>11</maven.compiler.target>
12+
<log4j.version>2.17.1</log4j.version>
13+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14+
</properties>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>software.amazon.lambda</groupId>
19+
<artifactId>powertools-logging</artifactId>
20+
<version>1.11.0</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>software.amazon.lambda</groupId>
24+
<artifactId>powertools-parameters</artifactId>
25+
<version>1.11.0</version>
26+
</dependency>
27+
<dependency>
28+
<groupId>com.amazonaws</groupId>
29+
<artifactId>aws-lambda-java-core</artifactId>
30+
<version>1.2.1</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>com.amazonaws</groupId>
34+
<artifactId>aws-lambda-java-events</artifactId>
35+
<version>3.11.0</version>
36+
</dependency>
37+
38+
<!-- Test dependencies -->
39+
<dependency>
40+
<groupId>org.mockito</groupId>
41+
<artifactId>mockito-core</artifactId>
42+
<version>4.3.1</version>
43+
<scope>test</scope>
44+
</dependency>
45+
<dependency>
46+
<groupId>org.junit.jupiter</groupId>
47+
<artifactId>junit-jupiter-api</artifactId>
48+
<version>5.8.2</version>
49+
<scope>test</scope>
50+
</dependency>
51+
<dependency>
52+
<groupId>org.junit.jupiter</groupId>
53+
<artifactId>junit-jupiter-engine</artifactId>
54+
<version>5.8.2</version>
55+
<scope>test</scope>
56+
</dependency>
57+
</dependencies>
58+
59+
<build>
60+
<plugins>
61+
<plugin>
62+
<groupId>org.apache.maven.plugins</groupId>
63+
<artifactId>maven-surefire-plugin</artifactId>
64+
<!-- JUnit 5 requires Surefire version 2.22.0 or higher -->
65+
<version>2.22.0</version>
66+
</plugin>
67+
<plugin>
68+
<groupId>org.codehaus.mojo</groupId>
69+
<artifactId>aspectj-maven-plugin</artifactId>
70+
<version>1.14.0</version>
71+
<configuration>
72+
<source>${maven.compiler.source}</source>
73+
<target>${maven.compiler.target}</target>
74+
<complianceLevel>${maven.compiler.target}</complianceLevel>
75+
<aspectLibraries>
76+
<aspectLibrary>
77+
<groupId>software.amazon.lambda</groupId>
78+
<artifactId>powertools-parameters</artifactId>
79+
</aspectLibrary>
80+
</aspectLibraries>
81+
</configuration>
82+
<executions>
83+
<execution>
84+
<goals>
85+
<goal>compile</goal>
86+
</goals>
87+
</execution>
88+
</executions>
89+
</plugin>
90+
</plugins>
91+
</build>
92+
</project>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.demo.parameters;
2+
3+
public class MyObject {
4+
5+
private long id;
6+
private String code;
7+
8+
public MyObject() {
9+
}
10+
11+
public long getId() {
12+
return id;
13+
}
14+
15+
public void setId(long id) {
16+
this.id = id;
17+
}
18+
19+
public String getCode() {
20+
return code;
21+
}
22+
23+
public void setCode(String code) {
24+
this.code = code;
25+
}
26+
27+
@Override
28+
public String toString() {
29+
return "MyObject{" +
30+
"id=" + id +
31+
", code='" + code + '\'' +
32+
'}';
33+
}
34+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.demo.parameters;
2+
3+
import com.amazonaws.services.lambda.runtime.Context;
4+
import com.amazonaws.services.lambda.runtime.RequestHandler;
5+
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
6+
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
7+
import org.apache.logging.log4j.LogManager;
8+
import org.apache.logging.log4j.Logger;
9+
import software.amazon.lambda.powertools.parameters.ParamManager;
10+
import software.amazon.lambda.powertools.parameters.SSMProvider;
11+
import software.amazon.lambda.powertools.parameters.SecretsProvider;
12+
13+
import java.io.BufferedReader;
14+
import java.io.IOException;
15+
import java.io.InputStreamReader;
16+
import java.net.URL;
17+
import java.util.HashMap;
18+
import java.util.Map;
19+
import java.util.stream.Collectors;
20+
21+
import static java.time.temporal.ChronoUnit.SECONDS;
22+
import static software.amazon.lambda.powertools.parameters.transform.Transformer.base64;
23+
import static software.amazon.lambda.powertools.parameters.transform.Transformer.json;
24+
25+
public class ParametersFunction implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
26+
private final static Logger log = LogManager.getLogger();
27+
28+
SSMProvider ssmProvider = ParamManager.getSsmProvider();
29+
SecretsProvider secretsProvider = ParamManager.getSecretsProvider();
30+
31+
String simpleValue = ssmProvider.defaultMaxAge(30, SECONDS).get("/powertools-java/sample/simplekey");
32+
String listValue = ssmProvider.withMaxAge(60, SECONDS).get("/powertools-java/sample/keylist");
33+
MyObject jsonObj = ssmProvider.withTransformation(json).get("/powertools-java/sample/keyjson", MyObject.class);
34+
Map<String, String> allValues = ssmProvider.getMultiple("/powertools-java/sample");
35+
String b64value = ssmProvider.withTransformation(base64).get("/powertools-java/sample/keybase64");
36+
37+
Map<String, String> secretJson = secretsProvider.withTransformation(json).get("/powertools-java/userpwd", Map.class);
38+
MyObject secretJsonObj = secretsProvider.withMaxAge(42, SECONDS).withTransformation(json).get("/powertools-java/secretcode", MyObject.class);
39+
40+
@Override
41+
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
42+
43+
log.info("\n=============== SSM Parameter Store ===============");
44+
log.info("simplevalue={}, listvalue={}, b64value={}\n", simpleValue, listValue, b64value);
45+
log.info("jsonobj={}\n", jsonObj);
46+
47+
log.info("allvalues (multiple):");
48+
allValues.forEach((key, value) -> log.info("- {}={}\n", key, value));
49+
50+
log.info("\n=============== Secrets Manager ===============");
51+
log.info("secretjson:");
52+
secretJson.forEach((key, value) -> log.info("- {}={}\n", key, value));
53+
log.info("secretjsonobj={}\n", secretJsonObj);
54+
55+
Map<String, String> headers = new HashMap<>();
56+
headers.put("Content-Type", "application/json");
57+
headers.put("X-Custom-Header", "application/json");
58+
59+
APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()
60+
.withHeaders(headers);
61+
try {
62+
final String pageContents = this.getPageContents("https://checkip.amazonaws.com");
63+
String output = String.format("{ \"message\": \"hello world\", \"location\": \"%s\" }", pageContents);
64+
65+
return response
66+
.withStatusCode(200)
67+
.withBody(output);
68+
} catch (IOException e) {
69+
return response
70+
.withBody("{}")
71+
.withStatusCode(500);
72+
}
73+
}
74+
75+
private String getPageContents(String address) throws IOException{
76+
URL url = new URL(address);
77+
try(BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
78+
return br.lines().collect(Collectors.joining(System.lineSeparator()));
79+
}
80+
}
81+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
3+
<Appenders>
4+
<Console name="JsonAppender" target="SYSTEM_OUT">
5+
<LambdaJsonLayout compact="true" eventEol="true"/>
6+
</Console>
7+
</Appenders>
8+
<Loggers>
9+
<Logger name="JsonLogger" level="INFO" additivity="false">
10+
<AppenderRef ref="JsonAppender"/>
11+
</Logger>
12+
<Root level="info">
13+
<AppenderRef ref="JsonAppender"/>
14+
</Root>
15+
</Loggers>
16+
</Configuration>

java/Parameters/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Parameters
2+
3+
This project contains an example of Lambda function using the parameters module of Lambda Powertools for Java. For more information on this module, please refer to the [documentation](https://awslabs.github.io/aws-lambda-powertools-java/utilities/parameters/).
4+
5+
## Deploy the sample application
6+
7+
This sample is based on Serverless Application Model (SAM) and you can use the SAM Command Line Interface (SAM CLI) to build it and deploy it to AWS.
8+
9+
To use the SAM CLI, you need the following tools.
10+
11+
* SAM CLI - [Install the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
12+
* Java11 - [Install the Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html)
13+
* Maven - [Install Maven](https://maven.apache.org/install.html)
14+
* Docker - [Install Docker community edition](https://hub.docker.com/search/?type=edition&offering=community)
15+
16+
To build and deploy your application for the first time, run the following in your shell:
17+
18+
```bash
19+
sam build
20+
sam deploy --guided
21+
```

java/Parameters/template.yaml

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
AWSTemplateFormatVersion: '2010-09-09'
2+
Transform: AWS::Serverless-2016-10-31
3+
Description: >
4+
validation demo
5+
6+
Globals:
7+
Function:
8+
Timeout: 20
9+
Runtime: java11
10+
MemorySize: 512
11+
Tracing: Active
12+
13+
14+
Resources:
15+
ParametersFunction:
16+
Type: AWS::Serverless::Function
17+
Properties:
18+
CodeUri: Function
19+
Handler: org.demo.parameters.ParametersFunction::handleRequest
20+
MemorySize: 512
21+
Tracing: Active
22+
Policies:
23+
- AWSSecretsManagerGetSecretValuePolicy:
24+
SecretArn: !Ref UserPwd
25+
- AWSSecretsManagerGetSecretValuePolicy:
26+
SecretArn: !Ref SecretConfig
27+
- Statement:
28+
- Sid: SSMGetParameterPolicy
29+
Effect: Allow
30+
Action:
31+
- ssm:GetParameter
32+
- ssm:GetParameters
33+
- ssm:GetParametersByPath
34+
Resource: '*'
35+
Events:
36+
HelloWorld:
37+
Type: Api
38+
Properties:
39+
Path: /params
40+
Method: get
41+
42+
UserPwd:
43+
Type: AWS::SecretsManager::Secret
44+
Properties:
45+
Name: /powertools-java/userpwd
46+
Description: Generated secret for lambda-powertools-java powertools-parameters
47+
module
48+
GenerateSecretString:
49+
SecretStringTemplate: '{"username": "test-user"}'
50+
GenerateStringKey: password
51+
PasswordLength: 15
52+
ExcludeCharacters: '"@/\'
53+
SecretConfig:
54+
Type: AWS::SecretsManager::Secret
55+
Properties:
56+
Name: /powertools-java/secretcode
57+
Description: Json secret for lambda-powertools-java powertools-parameters module
58+
SecretString: '{"id":23443,"code":"hk38543oj24kn796kp67bkb234gkj679l68"}'
59+
BasicParameter:
60+
Type: AWS::SSM::Parameter
61+
Properties:
62+
Name: /powertools-java/sample/simplekey
63+
Type: String
64+
Value: simplevalue
65+
Description: Simple SSM Parameter for lambda-powertools-java powertools-parameters
66+
module
67+
ParameterList:
68+
Type: AWS::SSM::Parameter
69+
Properties:
70+
Name: /powertools-java/sample/keylist
71+
Type: StringList
72+
Value: value1,value2,value3
73+
Description: SSM Parameter List for lambda-powertools-java powertools-parameters
74+
module
75+
JsonParameter:
76+
Type: AWS::SSM::Parameter
77+
Properties:
78+
Name: /powertools-java/sample/keyjson
79+
Type: String
80+
Value: '{"id":23443,"code":"hk38543oj24kn796kp67bkb234gkj679l68"}'
81+
Description: Json SSM Parameter for lambda-powertools-java powertools-parameters
82+
module
83+
Base64Parameter:
84+
Type: AWS::SSM::Parameter
85+
Properties:
86+
Name: /powertools-java/sample/keybase64
87+
Type: String
88+
Value: aGVsbG8gd29ybGQ=
89+
Description: Base64 SSM Parameter for lambda-powertools-java powertools-parameters module
90+
91+
Outputs:
92+
ParametersApi:
93+
Description: "API Gateway endpoint URL for Prod stage for Parameters function"
94+
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/params/"
95+
ParametersFunction:
96+
Description: "Parameters Lambda Function ARN"
97+
Value: !GetAtt ParametersFunction.Arn

manifest.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@
2727
"dependencyManager": "maven",
2828
"appTemplate": "Validation",
2929
"javaVersion": "11"
30+
},
31+
{
32+
"directory": "java/Parameters/Function",
33+
"displayName": "Demos setup of an parameters Lambda function using Powertools",
34+
"dependencyManager": "maven",
35+
"appTemplate": "Parameters",
36+
"javaVersion": "11"
3037
}
3138
]
3239
}

0 commit comments

Comments
 (0)